diff --git a/src/app/App.tsx b/src/app/App.tsx index dd7e04c5..1921b322 100644 --- a/src/app/App.tsx +++ b/src/app/App.tsx @@ -1,5 +1,5 @@ import { initSurvicate } from '../public-path'; -import { Fragment, lazy, Suspense } from 'react'; +import { lazy, Suspense } from 'react'; import React from 'react'; import { createBrowserRouter, createRoutesFromElements, Route, RouterProvider } from 'react-router-dom'; import ChunkLoader from '@/components/loader/chunk-loader'; @@ -9,7 +9,6 @@ import CallbackPage from '@/pages/callback'; import Endpoint from '@/pages/endpoint'; import { TAuthData } from '@/types/api-types'; import { initializeI18n, localize, TranslationProvider } from '@deriv-com/translations'; -import { URLUtils } from '@deriv-com/utils'; import CoreStoreProvider from './CoreStoreProvider'; import './app-root.scss'; @@ -49,37 +48,6 @@ const router = createBrowserRouter( ); function App() { - const { loginInfo, paramsToDelete } = URLUtils.getLoginInfoFromURL(); - React.useEffect(() => { - // Set login info to local storage and remove params from url - if (loginInfo.length) { - try { - const defaultActiveAccount = URLUtils.getDefaultActiveAccount(loginInfo); - if (!defaultActiveAccount) return; - - const accountsList: Record = {}; - const clientAccounts: Record = {}; - - loginInfo.forEach((account: { loginid: string; token: string; currency: string }) => { - accountsList[account.loginid] = account.token; - clientAccounts[account.loginid] = account; - }); - - localStorage.setItem('accountsList', JSON.stringify(accountsList)); - localStorage.setItem('clientAccounts', JSON.stringify(clientAccounts)); - - URLUtils.filterSearchParams(paramsToDelete); - - localStorage.setItem('authToken', loginInfo[0].token); - localStorage.setItem('active_loginid', loginInfo[0].loginid); - } catch (error) { - console.error('Error setting up login info:', error); - } - } - - URLUtils.filterSearchParams(['lang']); - }, [loginInfo, paramsToDelete]); - React.useEffect(() => { initSurvicate(); window?.dataLayer?.push({ event: 'page_load' }); @@ -181,11 +149,7 @@ function App() { } }, []); - return ( - - - - ); + return ; } export default App; diff --git a/src/app/AuthWrapper.tsx b/src/app/AuthWrapper.tsx new file mode 100644 index 00000000..ca0a47a5 --- /dev/null +++ b/src/app/AuthWrapper.tsx @@ -0,0 +1,68 @@ +import React from 'react'; +import ChunkLoader from '@/components/loader/chunk-loader'; +import { generateDerivApiInstance } from '@/external/bot-skeleton/services/api/appId'; +import { localize } from '@deriv-com/translations'; +import { URLUtils } from '@deriv-com/utils'; +import App from './App'; + +const setLocalStorageToken = async (loginInfo: URLUtils.LoginInfo[], paramsToDelete: string[]) => { + if (loginInfo.length) { + try { + const defaultActiveAccount = URLUtils.getDefaultActiveAccount(loginInfo); + if (!defaultActiveAccount) return; + + const accountsList: Record = {}; + const clientAccounts: Record = {}; + + loginInfo.forEach((account: { loginid: string; token: string; currency: string }) => { + accountsList[account.loginid] = account.token; + clientAccounts[account.loginid] = account; + }); + + localStorage.setItem('accountsList', JSON.stringify(accountsList)); + localStorage.setItem('clientAccounts', JSON.stringify(clientAccounts)); + URLUtils.filterSearchParams(paramsToDelete); + const api = await generateDerivApiInstance(); + + if (api) { + const { authorize, error } = await api.authorize(loginInfo[0].token); + api.disconnect(); + if (!error) { + const firstId = authorize?.account_list[0]?.loginid; + const filteredTokens = loginInfo.filter(token => token.loginid === firstId); + if (filteredTokens.length) { + localStorage.setItem('authToken', filteredTokens[0].token); + localStorage.setItem('active_loginid', filteredTokens[0].loginid); + return; + } + } + } + + localStorage.setItem('authToken', loginInfo[0].token); + localStorage.setItem('active_loginid', loginInfo[0].loginid); + } catch (error) { + console.error('Error setting up login info:', error); + } + } +}; + +export const AuthWrapper = () => { + const [isAuthComplete, setIsAuthComplete] = React.useState(false); + const { loginInfo, paramsToDelete } = URLUtils.getLoginInfoFromURL(); + + React.useEffect(() => { + const initializeAuth = async () => { + await setLocalStorageToken(loginInfo, paramsToDelete); + URLUtils.filterSearchParams(['lang']); + setIsAuthComplete(true); + }; + + initializeAuth(); + }, [loginInfo, paramsToDelete]); + + if (!isAuthComplete) { + return ; + } + + return ; +}; diff --git a/src/main.tsx b/src/main.tsx index 461a6a92..aaf0ed24 100644 --- a/src/main.tsx +++ b/src/main.tsx @@ -1,8 +1,8 @@ import ReactDOM from 'react-dom/client'; -import App from './app/App'; +import { AuthWrapper } from './app/AuthWrapper'; import { AnalyticsInitializer } from './utils/analytics'; import './styles/index.scss'; AnalyticsInitializer(); -ReactDOM.createRoot(document.getElementById('root')!).render(); +ReactDOM.createRoot(document.getElementById('root')!).render(); diff --git a/src/pages/callback/callback-page.tsx b/src/pages/callback/callback-page.tsx index c3608d3a..9218a890 100644 --- a/src/pages/callback/callback-page.tsx +++ b/src/pages/callback/callback-page.tsx @@ -1,10 +1,11 @@ +import { generateDerivApiInstance } from '@/external/bot-skeleton/services/api/appId'; import { Callback } from '@deriv-com/auth-client'; import { Button } from '@deriv-com/ui'; const CallbackPage = () => { return ( ) => { + onSignInSuccess={async (tokens: Record) => { const accountsList: Record = {}; const clientAccounts: Record = {}; @@ -30,8 +31,27 @@ const CallbackPage = () => { localStorage.setItem('accountsList', JSON.stringify(accountsList)); localStorage.setItem('clientAccounts', JSON.stringify(clientAccounts)); - localStorage.setItem('authToken', tokens.token1); - localStorage.setItem('active_loginid', tokens.acct1); + let is_token_set = false; + const api = await generateDerivApiInstance(); + if (api) { + const { authorize, error } = await api.authorize(tokens.token1); + localStorage.setItem('callback_token', authorize.toString()); + api.disconnect(); + if (!error) { + const clientAccountsArray = Object.values(clientAccounts); + const firstId = authorize?.account_list[0]?.loginid; + const filteredTokens = clientAccountsArray.filter(account => account.loginid === firstId); + if (filteredTokens.length) { + localStorage.setItem('authToken', filteredTokens[0].token); + localStorage.setItem('active_loginid', filteredTokens[0].loginid); + is_token_set = true; + } + } + } + if (!is_token_set) { + localStorage.setItem('authToken', tokens.token1); + localStorage.setItem('active_loginid', tokens.acct1); + } window.location.assign('/'); }}