11import React from 'react' ;
2- import Cookies from 'js-cookie' ;
32import ChunkLoader from '@/components/loader/chunk-loader' ;
43import { generateDerivApiInstance } from '@/external/bot-skeleton/services/api/appId' ;
54import { localize } from '@deriv-com/translations' ;
65import { URLUtils } from '@deriv-com/utils' ;
76import App from './App' ;
8- import { Account , AccountsList , ApiInstance , ClientAccounts , LoginInfo } from './types' ;
97
10- const getCookieAccounts = ( ) : ClientAccounts => {
11- try {
12- return JSON . parse ( Cookies . get ( 'client.accounts' ) || '{}' ) ;
13- } catch ( error ) {
14- console . error ( "Invalid JSON in 'client.accounts' cookie:" , error ) ;
15- return { } ;
16- }
17- } ;
18-
19- const storeAccountsToLocalStorage = (
20- cookieAccounts : ClientAccounts ,
21- loginInfo : LoginInfo [ ] ,
22- authorizedAccounts : LoginInfo [ ]
23- ) : ClientAccounts => {
24- const accountsList : AccountsList = { } ;
25- const clientAccounts : ClientAccounts = { ...cookieAccounts } ;
26-
27- authorizedAccounts . forEach ( ( { loginid, token, currency } ) => {
28- if ( loginid && token ) {
29- accountsList [ loginid ] = token ;
30- clientAccounts [ loginid ] = { loginid, token, currency : currency || '' } ;
31- }
32- } ) ;
8+ const setLocalStorageToken = async ( loginInfo : URLUtils . LoginInfo [ ] , paramsToDelete : string [ ] ) => {
9+ if ( loginInfo . length ) {
10+ try {
11+ const defaultActiveAccount = URLUtils . getDefaultActiveAccount ( loginInfo ) ;
12+ if ( ! defaultActiveAccount ) return ;
3313
34- loginInfo . forEach ( ( { loginid, token, currency } ) => {
35- if ( loginid && token ) {
36- accountsList [ loginid ] = token ;
37- clientAccounts [ loginid ] = { loginid, token, currency : currency || '' } ;
38- }
39- } ) ;
40-
41- localStorage . setItem ( 'accountsList' , JSON . stringify ( accountsList ) ) ;
42- localStorage . setItem ( 'clientAccounts' , JSON . stringify ( clientAccounts ) ) ;
43-
44- return clientAccounts ;
45- } ;
14+ const accountsList : Record < string , string > = { } ;
15+ const clientAccounts : Record < string , { loginid : string ; token : string ; currency : string } > = { } ;
4616
47- const getActiveAccount = (
48- cookieAccounts : ClientAccounts ,
49- clientAccounts : ClientAccounts ,
50- loginInfo : LoginInfo [ ]
51- ) : Account | LoginInfo => {
52- const queryParams = new URLSearchParams ( window . location . search ) ;
53- const currencyType = queryParams . get ( 'account' ) || loginInfo [ 0 ] ?. currency ;
54-
55- return (
56- Object . values ( cookieAccounts ) . find ( acc => acc . currency === currencyType ) ||
57- Object . values ( cookieAccounts ) [ 0 ] ||
58- Object . values ( clientAccounts ) . find ( acc => acc . currency === currencyType ) ||
59- Object . values ( clientAccounts ) [ 0 ] ||
60- loginInfo [ 0 ]
61- ) ;
62- } ;
63-
64- const authorizeAccounts = async ( api : ApiInstance | null , cookieAccounts : ClientAccounts ) : Promise < LoginInfo [ ] > => {
65- if ( ! api || Object . keys ( cookieAccounts ) . length === 0 ) return [ ] ;
66-
67- const authorizedAccounts : LoginInfo [ ] = [ ] ;
68-
69- for ( const loginid in cookieAccounts ) {
70- const { token, currency } = cookieAccounts [ loginid ] ;
71-
72- if ( token ) {
73- authorizedAccounts . push ( {
74- loginid,
75- token,
76- currency : currency || '' ,
17+ loginInfo . forEach ( ( account : { loginid : string ; token : string ; currency : string } ) => {
18+ accountsList [ account . loginid ] = account . token ;
19+ clientAccounts [ account . loginid ] = account ;
7720 } ) ;
78- }
79- }
8021
81- for ( const loginid in cookieAccounts ) {
82- const { token, currency } = cookieAccounts [ loginid ] ;
83-
84- if ( ! token ) {
85- try {
86- const { authorize, error } = await api . authorize ( token ) ;
87-
88- if ( ! error && authorize ?. account_list ) {
89- authorizedAccounts . push ( {
90- loginid,
91- token,
92- currency : currency || authorize . currency || '' ,
93- } ) ;
22+ localStorage . setItem ( 'accountsList' , JSON . stringify ( accountsList ) ) ;
23+ localStorage . setItem ( 'clientAccounts' , JSON . stringify ( clientAccounts ) ) ;
24+
25+ URLUtils . filterSearchParams ( paramsToDelete ) ;
26+ const api = await generateDerivApiInstance ( ) ;
27+
28+ if ( api ) {
29+ const { authorize, error } = await api . authorize ( loginInfo [ 0 ] . token ) ;
30+ api . disconnect ( ) ;
31+ if ( ! error ) {
32+ const firstId = authorize ?. account_list [ 0 ] ?. loginid ;
33+ const filteredTokens = loginInfo . filter ( token => token . loginid === firstId ) ;
34+ if ( filteredTokens . length ) {
35+ localStorage . setItem ( 'authToken' , filteredTokens [ 0 ] . token ) ;
36+ localStorage . setItem ( 'active_loginid' , filteredTokens [ 0 ] . loginid ) ;
37+ return ;
38+ }
9439 }
95- } catch ( err ) {
96- console . error ( `Authorization failed for ${ loginid } :` , err ) ;
9740 }
98- }
99- }
100-
101- api . disconnect ( ) ;
102- return authorizedAccounts ;
103- } ;
104-
105- const setLocalStorageToken = async ( loginInfo : LoginInfo [ ] , paramsToDelete : string [ ] ) : Promise < void > => {
106- const cookieAccounts = getCookieAccounts ( ) ;
107- const hasValidLoginInfo = loginInfo . length > 0 && loginInfo . some ( acc => acc . token ) ;
108- const hasValidCookie = Object . keys ( cookieAccounts ) . length > 0 ;
109-
110- if ( ! hasValidLoginInfo && ! hasValidCookie ) return ;
111-
112- try {
113- const api = await generateDerivApiInstance ( ) ;
114- let authorizedAccounts : LoginInfo [ ] = [ ] ;
11541
116- if ( api && hasValidCookie ) {
117- authorizedAccounts = await authorizeAccounts ( api , cookieAccounts ) ;
42+ localStorage . setItem ( 'authToken' , loginInfo [ 0 ] . token ) ;
43+ localStorage . setItem ( 'active_loginid' , loginInfo [ 0 ] . loginid ) ;
44+ } catch ( error ) {
45+ console . error ( 'Error setting up login info:' , error ) ;
11846 }
119-
120- const clientAccounts = storeAccountsToLocalStorage ( cookieAccounts , loginInfo , authorizedAccounts ) ;
121-
122- let activeAccount = getActiveAccount ( cookieAccounts , clientAccounts , loginInfo ) ;
123-
124- if ( api && ! activeAccount ) {
125- const authorizedAccount = authorizedAccounts [ 0 ] ;
126- if ( authorizedAccount ) {
127- activeAccount = authorizedAccount ;
128- localStorage . setItem ( 'authToken' , activeAccount . token ) ;
129- localStorage . setItem ( 'active_loginid' , activeAccount . loginid ) ;
130- }
131- }
132-
133- if ( activeAccount ) {
134- localStorage . setItem ( 'authToken' , activeAccount . token ) ;
135- localStorage . setItem ( 'active_loginid' , activeAccount . loginid ) ;
136- }
137-
138- URLUtils . filterSearchParams ( paramsToDelete ) ;
139- } catch ( error ) {
140- console . error ( 'Error setting up login info:' , error ) ;
14147 }
14248} ;
14349
@@ -147,7 +53,6 @@ export const AuthWrapper = () => {
14753
14854 React . useEffect ( ( ) => {
14955 const initializeAuth = async ( ) => {
150- console . log ( 'loginInfo' , loginInfo ) ;
15156 await setLocalStorageToken ( loginInfo , paramsToDelete ) ;
15257 URLUtils . filterSearchParams ( [ 'lang' ] ) ;
15358 setIsAuthComplete ( true ) ;
0 commit comments