From fae3dbaf95a5e15d5cdd1f283d2a33534429076b Mon Sep 17 00:00:00 2001 From: shafin-deriv Date: Wed, 5 Feb 2025 12:49:35 +0800 Subject: [PATCH 1/2] fix: default currency --- src/app/App.tsx | 40 +--------------- src/app/AuthWrapper.tsx | 68 ++++++++++++++++++++++++++++ src/main.tsx | 4 +- src/pages/callback/callback-page.tsx | 26 +++++++++-- 4 files changed, 95 insertions(+), 43 deletions(-) create mode 100644 src/app/AuthWrapper.tsx 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('/'); }} From a453e27c3a976589731bd4cfdf67ff71fdce27c4 Mon Sep 17 00:00:00 2001 From: shafin-deriv Date: Thu, 6 Feb 2025 16:06:26 +0800 Subject: [PATCH 2/2] fix: fix login issues --- src/components/shared/utils/config/config.ts | 7 ++++++- src/components/shared/utils/routes/routes.ts | 4 ++-- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/src/components/shared/utils/config/config.ts b/src/components/shared/utils/config/config.ts index 0d30de75..1a9a7321 100644 --- a/src/components/shared/utils/config/config.ts +++ b/src/components/shared/utils/config/config.ts @@ -147,10 +147,15 @@ export const generateOAuthURL = () => { const oauth_url = getOauthURL(); const original_url = new URL(oauth_url); const configured_server_url = (LocalStorageUtils.getValue(LocalStorageConstants.configServerURL) || + localStorage.getItem('config.server_url') || original_url.hostname) as string; const valid_server_urls = ['green.derivws.com', 'red.derivws.com', 'blue.derivws.com']; - if (!valid_server_urls.includes(JSON.stringify(configured_server_url))) { + if ( + typeof configured_server_url === 'string' + ? !valid_server_urls.includes(configured_server_url) + : !valid_server_urls.includes(JSON.stringify(configured_server_url)) + ) { original_url.hostname = configured_server_url; } return original_url.toString() || oauth_url; diff --git a/src/components/shared/utils/routes/routes.ts b/src/components/shared/utils/routes/routes.ts index 20634a0e..fc6f8d40 100644 --- a/src/components/shared/utils/routes/routes.ts +++ b/src/components/shared/utils/routes/routes.ts @@ -60,7 +60,7 @@ const getDerivDomain = (service: Service): string => { * Uses template literals to compose URLs dynamically. */ export const standalone_routes = { - bot: '/', + bot: `${window.location.origin}`, cashier: `${getDerivDomain('derivApp')}/cashier/`, cashier_deposit: `${getDerivDomain('derivApp')}/cashier/deposit`, cashier_p2p: `${getDerivDomain('derivApp')}/cashier/p2p`, @@ -78,7 +78,7 @@ export const standalone_routes = { signup: `https://hub.deriv.com/tradershub/signup`, deriv_com: getDerivDomain('derivCom'), deriv_app: getDerivDomain('derivApp'), - endpoint: '/endpoint', + endpoint: `${window.location.origin}/endpoint`, account_limits: `${getDerivDomain('derivApp')}/account/account-limits`, help_center: `${getDerivDomain('derivCom')}/help-centre/`, responsible: `${getDerivDomain('derivCom')}/responsible/`,