From f368989cd42163fe4210339ef7c91ffb7bf13649 Mon Sep 17 00:00:00 2001 From: adrienne-rio Date: Mon, 21 Aug 2023 15:41:09 +0800 Subject: [PATCH 01/17] feat: added use-authorize hook taken from sergei pr Co-authored-by: Sergei Baranovski <120570511+sergei-deriv@users.noreply.github.com> --- package-lock.json | 2 +- packages/api/package.json | 1 + packages/api/src/useAuthorize.ts | 27 +++++++++++++++ packages/utils/package.json | 3 +- .../getAccountsFromLocalStorage.spec.ts | 34 +++++++++++++++++++ ...tActiveAuthTokenIDFromLocalStorage.spec.ts | 31 +++++++++++++++++ .../getActiveLoginIDFromLocalStorage.spec.ts | 22 ++++++++++++ .../utils/src/getAccountsFromLocalStorage.ts | 30 ++++++++++++++++ .../getActiveAuthTokenIDFromLocalStorage.ts | 19 +++++++++++ .../src/getActiveLoginIDFromLocalStorage.ts | 13 +++++++ packages/utils/src/index.ts | 3 ++ 11 files changed, 183 insertions(+), 2 deletions(-) create mode 100644 packages/api/src/useAuthorize.ts create mode 100644 packages/utils/src/__tests__/getAccountsFromLocalStorage.spec.ts create mode 100644 packages/utils/src/__tests__/getActiveAuthTokenIDFromLocalStorage.spec.ts create mode 100644 packages/utils/src/__tests__/getActiveLoginIDFromLocalStorage.spec.ts create mode 100644 packages/utils/src/getAccountsFromLocalStorage.ts create mode 100644 packages/utils/src/getActiveAuthTokenIDFromLocalStorage.ts create mode 100644 packages/utils/src/getActiveLoginIDFromLocalStorage.ts diff --git a/package-lock.json b/package-lock.json index aef2a19e6b57..e8c275447a06 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,7 +13,7 @@ "@contentpass/zxcvbn": "^4.4.3", "@datadog/browser-logs": "^4.36.0", "@datadog/browser-rum": "^4.37.0", - "@deriv/api-types": "^1.0.94", + "@deriv/api-types": "^1.0.116", "@deriv/deriv-api": "^1.0.11", "@deriv/deriv-charts": "1.3.2", "@deriv/js-interpreter": "^3.0.0", diff --git a/packages/api/package.json b/packages/api/package.json index 3e0a17020cf0..81d49126c23b 100644 --- a/packages/api/package.json +++ b/packages/api/package.json @@ -4,6 +4,7 @@ "version": "1.0.0", "main": "src/index.ts", "dependencies": { + "@deriv/utils": "^1.0.0", "@deriv/shared": "^1.0.0", "react": "^17.0.2", "@tanstack/react-query": "^4.28.0", diff --git a/packages/api/src/useAuthorize.ts b/packages/api/src/useAuthorize.ts new file mode 100644 index 000000000000..68489b8731b3 --- /dev/null +++ b/packages/api/src/useAuthorize.ts @@ -0,0 +1,27 @@ +import { useMemo } from 'react'; +import useFetch from './useFetch'; +import { getActiveAuthTokenIDFromLocalStorage } from '@deriv/utils'; + +/** A custom hook that authorize the user with the given token. If no token is given, it will use the current token. + * + * @param token {string} - The authentication token. If this is not provided, it will use the current token instead. + */ +const useAuthorize = (token?: string) => { + const current_token = getActiveAuthTokenIDFromLocalStorage() || ''; + + const { data, ...rest } = useFetch('authorize', { + payload: { authorize: token || current_token }, + options: { enabled: Boolean(current_token) }, + }); + + // Add additional information to the authorize response. + const modified_authorize = useMemo(() => ({ ...data?.authorize }), [data?.authorize]); + + return { + /** The authorize response. */ + data: modified_authorize, + ...rest, + }; +}; + +export default useAuthorize; diff --git a/packages/utils/package.json b/packages/utils/package.json index 31de5471d9c6..1416c26f5406 100644 --- a/packages/utils/package.json +++ b/packages/utils/package.json @@ -5,6 +5,7 @@ "main": "src/index.ts", "dependencies": {}, "devDependencies": { - "typescript": "^4.6.3" + "typescript": "^4.6.3", + "@deriv/api-types": "^1.0.116" } } diff --git a/packages/utils/src/__tests__/getAccountsFromLocalStorage.spec.ts b/packages/utils/src/__tests__/getAccountsFromLocalStorage.spec.ts new file mode 100644 index 000000000000..e07c6a727849 --- /dev/null +++ b/packages/utils/src/__tests__/getAccountsFromLocalStorage.spec.ts @@ -0,0 +1,34 @@ +import getAccountsFromLocalStorage from '../getAccountsFromLocalStorage'; + +describe('getAccountsFromLocalStorage', () => { + beforeEach(() => { + localStorage.clear(); + + localStorage.setItem( + 'client.accounts', + JSON.stringify({ + CR1001: { + token: '12345', + }, + }) + ); + }); + + test('should return object with one account', () => { + const result = getAccountsFromLocalStorage(); + + expect(result).toMatchObject({ + CR1001: { + token: '12345', + }, + }); + }); + + test('should return empty object', () => { + localStorage.clear(); + + const result = getAccountsFromLocalStorage(); + + expect(result).toBeUndefined(); + }); +}); diff --git a/packages/utils/src/__tests__/getActiveAuthTokenIDFromLocalStorage.spec.ts b/packages/utils/src/__tests__/getActiveAuthTokenIDFromLocalStorage.spec.ts new file mode 100644 index 000000000000..09c7ae1fc56a --- /dev/null +++ b/packages/utils/src/__tests__/getActiveAuthTokenIDFromLocalStorage.spec.ts @@ -0,0 +1,31 @@ +import getActiveAuthTokenIDFromLocalStorage from '../getActiveAuthTokenIDFromLocalStorage'; + +describe('getActiveAuthTokenIDFromLocalStorage', () => { + beforeEach(() => { + localStorage.clear(); + + localStorage.setItem( + 'client.accounts', + JSON.stringify({ + CR1001: { + token: '12345', + }, + }) + ); + localStorage.setItem('active_loginid', 'CR1001'); + }); + + test('should return active account token', () => { + const result = getActiveAuthTokenIDFromLocalStorage(); + + expect(result).toBe('12345'); + }); + + test('should return empty string', () => { + localStorage.setItem('active_loginid', 'CR1111'); + + const result = getActiveAuthTokenIDFromLocalStorage(); + + expect(result).toBeUndefined(); + }); +}); diff --git a/packages/utils/src/__tests__/getActiveLoginIDFromLocalStorage.spec.ts b/packages/utils/src/__tests__/getActiveLoginIDFromLocalStorage.spec.ts new file mode 100644 index 000000000000..e1152cb70e79 --- /dev/null +++ b/packages/utils/src/__tests__/getActiveLoginIDFromLocalStorage.spec.ts @@ -0,0 +1,22 @@ +import getActiveLoginIDFromLocalStorage from '../getActiveLoginIDFromLocalStorage'; + +describe('getActiveLoginIDFromLocalStorage', () => { + beforeEach(() => { + localStorage.clear(); + localStorage.setItem('active_loginid', 'CR1001'); + }); + + test('should return active account token', () => { + const result = getActiveLoginIDFromLocalStorage(); + + expect(result).toBe('CR1001'); + }); + + test('should return null', () => { + localStorage.clear(); + + const result = getActiveLoginIDFromLocalStorage(); + + expect(result).toBeUndefined(); + }); +}); diff --git a/packages/utils/src/getAccountsFromLocalStorage.ts b/packages/utils/src/getAccountsFromLocalStorage.ts new file mode 100644 index 000000000000..afef9d01f4cb --- /dev/null +++ b/packages/utils/src/getAccountsFromLocalStorage.ts @@ -0,0 +1,30 @@ +import type { AuthorizeResponse } from '@deriv/api-types'; + +type TLocalStorageAccount = { + token: string; + accepted_bch: number; + landing_company_shortcode: string; + residence: string; + session_start: number; +}; + +type TLocalStorageAccountsList = { + [k: string]: TLocalStorageAccount & + NonNullable['account_list']>>[number]; +}; + +/** + * Gets the current user `accounts` list from the `localStorage`. + */ +const getAccountsFromLocalStorage = () => { + const data = localStorage.getItem('client.accounts'); + + // If there is no accounts list, return undefined. + if (!data) return; + + const accounts: TLocalStorageAccountsList = JSON.parse(data); + + return accounts; +}; + +export default getAccountsFromLocalStorage; diff --git a/packages/utils/src/getActiveAuthTokenIDFromLocalStorage.ts b/packages/utils/src/getActiveAuthTokenIDFromLocalStorage.ts new file mode 100644 index 000000000000..36827abd6c5d --- /dev/null +++ b/packages/utils/src/getActiveAuthTokenIDFromLocalStorage.ts @@ -0,0 +1,19 @@ +import getAccountsFromLocalStorage from './getAccountsFromLocalStorage'; +import getActiveLoginIDFromLocalStorage from './getActiveLoginIDFromLocalStorage'; + +/** + * Gets the current user's auth `token` for the active `loginid` from the `localStorage`. + */ +const getActiveAuthTokenIDFromLocalStorage = () => { + const accounts = getAccountsFromLocalStorage(); + const active_loginid = getActiveLoginIDFromLocalStorage(); + + // If there is no active loginid or no accounts list, return undefined. + if (!active_loginid || !accounts) return; + + const active_auth_token = accounts?.[active_loginid]?.token; + + return active_auth_token; +}; + +export default getActiveAuthTokenIDFromLocalStorage; diff --git a/packages/utils/src/getActiveLoginIDFromLocalStorage.ts b/packages/utils/src/getActiveLoginIDFromLocalStorage.ts new file mode 100644 index 000000000000..4f166a3345b6 --- /dev/null +++ b/packages/utils/src/getActiveLoginIDFromLocalStorage.ts @@ -0,0 +1,13 @@ +/** + * Gets the active `loginid` for the current user from the `localStorage`. + */ +const getActiveLoginIDFromLocalStorage = () => { + const active_loginid = localStorage.getItem('active_loginid'); + + // If there is no active loginid, return undefined. + if (!active_loginid) return; + + return active_loginid; +}; + +export default getActiveLoginIDFromLocalStorage; diff --git a/packages/utils/src/index.ts b/packages/utils/src/index.ts index 607e6f4da105..56e20cf19c1e 100644 --- a/packages/utils/src/index.ts +++ b/packages/utils/src/index.ts @@ -1 +1,4 @@ export { default as unFormatLocaleString } from './unFormatLocaleString'; +export { default as getAccountsFromLocalStorage } from './getAccountsFromLocalStorage'; +export { default as getActiveLoginIDFromLocalStorage } from './getActiveLoginIDFromLocalStorage'; +export { default as getActiveAuthTokenIDFromLocalStorage } from './getActiveAuthTokenIDFromLocalStorage'; From bc67484bda9ccce8dee048be60726d877ae7b00d Mon Sep 17 00:00:00 2001 From: adrienne-rio Date: Mon, 21 Aug 2023 15:45:22 +0800 Subject: [PATCH 02/17] chore: sorted imports for use-authorize Co-authored-by: Sergei Baranovski <120570511+sergei-deriv@users.noreply.github.com> --- packages/api/src/useAuthorize.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/api/src/useAuthorize.ts b/packages/api/src/useAuthorize.ts index 68489b8731b3..93b4d13a6e39 100644 --- a/packages/api/src/useAuthorize.ts +++ b/packages/api/src/useAuthorize.ts @@ -1,6 +1,6 @@ +import { getActiveAuthTokenIDFromLocalStorage } from '@deriv/utils'; import { useMemo } from 'react'; import useFetch from './useFetch'; -import { getActiveAuthTokenIDFromLocalStorage } from '@deriv/utils'; /** A custom hook that authorize the user with the given token. If no token is given, it will use the current token. * From 8856b9e1c5d4c8f752b969035b76b20f9d13f5be Mon Sep 17 00:00:00 2001 From: adrienne-rio Date: Mon, 21 Aug 2023 15:47:11 +0800 Subject: [PATCH 03/17] chore: moved default empty string in use-authorize --- packages/api/src/useAuthorize.ts | 4 ++-- packages/utils/src/getActiveAuthTokenIDFromLocalStorage.ts | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/api/src/useAuthorize.ts b/packages/api/src/useAuthorize.ts index 93b4d13a6e39..d04236c9cbbb 100644 --- a/packages/api/src/useAuthorize.ts +++ b/packages/api/src/useAuthorize.ts @@ -7,10 +7,10 @@ import useFetch from './useFetch'; * @param token {string} - The authentication token. If this is not provided, it will use the current token instead. */ const useAuthorize = (token?: string) => { - const current_token = getActiveAuthTokenIDFromLocalStorage() || ''; + const current_token = getActiveAuthTokenIDFromLocalStorage(); const { data, ...rest } = useFetch('authorize', { - payload: { authorize: token || current_token }, + payload: { authorize: token || current_token || '' }, options: { enabled: Boolean(current_token) }, }); diff --git a/packages/utils/src/getActiveAuthTokenIDFromLocalStorage.ts b/packages/utils/src/getActiveAuthTokenIDFromLocalStorage.ts index 36827abd6c5d..583a1470ba9e 100644 --- a/packages/utils/src/getActiveAuthTokenIDFromLocalStorage.ts +++ b/packages/utils/src/getActiveAuthTokenIDFromLocalStorage.ts @@ -11,7 +11,7 @@ const getActiveAuthTokenIDFromLocalStorage = () => { // If there is no active loginid or no accounts list, return undefined. if (!active_loginid || !accounts) return; - const active_auth_token = accounts?.[active_loginid]?.token; + const active_auth_token = accounts[active_loginid]?.token; return active_auth_token; }; From f72994ddfca86b6b1ee18cf507bfd7305d463599 Mon Sep 17 00:00:00 2001 From: adrienne-rio Date: Mon, 21 Aug 2023 16:28:42 +0800 Subject: [PATCH 04/17] chore: incorporated code reviews --- packages/utils/src/getAccountsFromLocalStorage.ts | 5 ++--- packages/utils/src/getActiveAuthTokenIDFromLocalStorage.ts | 4 +--- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/packages/utils/src/getAccountsFromLocalStorage.ts b/packages/utils/src/getAccountsFromLocalStorage.ts index afef9d01f4cb..45f841dcf986 100644 --- a/packages/utils/src/getAccountsFromLocalStorage.ts +++ b/packages/utils/src/getAccountsFromLocalStorage.ts @@ -22,9 +22,8 @@ const getAccountsFromLocalStorage = () => { // If there is no accounts list, return undefined. if (!data) return; - const accounts: TLocalStorageAccountsList = JSON.parse(data); - - return accounts; + // Cast parsed JSON data to infer return type + return JSON.parse(data) as TLocalStorageAccountsList; }; export default getAccountsFromLocalStorage; diff --git a/packages/utils/src/getActiveAuthTokenIDFromLocalStorage.ts b/packages/utils/src/getActiveAuthTokenIDFromLocalStorage.ts index 583a1470ba9e..2399cddee510 100644 --- a/packages/utils/src/getActiveAuthTokenIDFromLocalStorage.ts +++ b/packages/utils/src/getActiveAuthTokenIDFromLocalStorage.ts @@ -11,9 +11,7 @@ const getActiveAuthTokenIDFromLocalStorage = () => { // If there is no active loginid or no accounts list, return undefined. if (!active_loginid || !accounts) return; - const active_auth_token = accounts[active_loginid]?.token; - - return active_auth_token; + return accounts[active_loginid]?.token; }; export default getActiveAuthTokenIDFromLocalStorage; From dd451d8ac7751b1930738d8701645748107081d6 Mon Sep 17 00:00:00 2001 From: Farhan Ahmad Nurzi Date: Tue, 22 Aug 2023 15:03:16 +0800 Subject: [PATCH 05/17] chore: added useLandingCompany into api package --- packages/api/src/hooks/index.ts | 2 ++ packages/api/src/{ => hooks}/useAuthorize.ts | 2 +- packages/api/src/hooks/useLandingCompany.ts | 33 ++++++++++++++++++++ packages/api/src/index.ts | 1 + packages/api/types.ts | 5 ++- 5 files changed, 41 insertions(+), 2 deletions(-) create mode 100644 packages/api/src/hooks/index.ts rename packages/api/src/{ => hooks}/useAuthorize.ts (96%) create mode 100644 packages/api/src/hooks/useLandingCompany.ts diff --git a/packages/api/src/hooks/index.ts b/packages/api/src/hooks/index.ts new file mode 100644 index 000000000000..19f96aea6eba --- /dev/null +++ b/packages/api/src/hooks/index.ts @@ -0,0 +1,2 @@ +export { default as useAuthorize } from './useAuthorize'; +export { default as useLandingCompany } from './useLandingCompany'; diff --git a/packages/api/src/useAuthorize.ts b/packages/api/src/hooks/useAuthorize.ts similarity index 96% rename from packages/api/src/useAuthorize.ts rename to packages/api/src/hooks/useAuthorize.ts index d04236c9cbbb..356d4a31cd69 100644 --- a/packages/api/src/useAuthorize.ts +++ b/packages/api/src/hooks/useAuthorize.ts @@ -1,6 +1,6 @@ import { getActiveAuthTokenIDFromLocalStorage } from '@deriv/utils'; import { useMemo } from 'react'; -import useFetch from './useFetch'; +import useFetch from '../useFetch'; /** A custom hook that authorize the user with the given token. If no token is given, it will use the current token. * diff --git a/packages/api/src/hooks/useLandingCompany.ts b/packages/api/src/hooks/useLandingCompany.ts new file mode 100644 index 000000000000..1ec60cf9b535 --- /dev/null +++ b/packages/api/src/hooks/useLandingCompany.ts @@ -0,0 +1,33 @@ +import { useMemo } from 'react'; +import useAuthorize from './useAuthorize'; +import useFetch from '../useFetch'; + +/** A custom hook that returns the available landing companies of the user's country. */ +const useLandingCompany = () => { + const { data: authorize_data } = useAuthorize(); + const { data, ...rest } = useFetch('landing_company', { + payload: { landing_company: authorize_data.country || '' }, + options: { enabled: Boolean(authorize_data.country) }, + }); + + const modified_data = useMemo(() => { + if (!data?.landing_company) return; + const { financial_company, gaming_company, virtual_company } = data.landing_company; + return { + /** Short code of financial landing company */ + financial_company: financial_company?.shortcode, + /** Short code of gaming landing company */ + gaming_company: gaming_company?.shortcode, + /** Short code of virtual landing company */ + virtual_company, + }; + }, [data]); + + return { + /** List of available landing companies */ + data: modified_data, + ...rest, + }; +}; + +export default useLandingCompany; diff --git a/packages/api/src/index.ts b/packages/api/src/index.ts index c57ebbc8d920..6d7f94ebcd78 100644 --- a/packages/api/src/index.ts +++ b/packages/api/src/index.ts @@ -4,3 +4,4 @@ export { default as useInvalidateQuery } from './useInvalidateQuery'; export { default as useRequest } from './useRequest'; export { default as usePaginatedFetch } from './usePaginatedFetch'; export { default as useSubscription } from './useSubscription'; +export * from './hooks'; diff --git a/packages/api/types.ts b/packages/api/types.ts index 500ba46ebe9f..4dd95e5a00f5 100644 --- a/packages/api/types.ts +++ b/packages/api/types.ts @@ -497,7 +497,10 @@ type TSocketEndpoints = { response: LandingCompanyDetailsResponse; }; landing_company: { - request: LandingCompanyRequest; + // TODO: Fix typings of this endpoint, because LandingCompany payload should be a string instead of LandingCompany interface + request: { + landing_company: string; + }; response: LandingCompanyResponse; }; login_history: { From c67c5725f9a58d073831302772820df9917463b6 Mon Sep 17 00:00:00 2001 From: Farhan Ahmad Nurzi Date: Thu, 24 Aug 2023 11:14:04 +0800 Subject: [PATCH 06/17] chore: added useSettings to @deriv/api --- .../src/hooks/{useBalance.tsx => useBalance.ts} | 0 packages/api/src/hooks/useSettings.ts | 17 +++++++++++++++++ 2 files changed, 17 insertions(+) rename packages/api/src/hooks/{useBalance.tsx => useBalance.ts} (100%) create mode 100644 packages/api/src/hooks/useSettings.ts diff --git a/packages/api/src/hooks/useBalance.tsx b/packages/api/src/hooks/useBalance.ts similarity index 100% rename from packages/api/src/hooks/useBalance.tsx rename to packages/api/src/hooks/useBalance.ts diff --git a/packages/api/src/hooks/useSettings.ts b/packages/api/src/hooks/useSettings.ts new file mode 100644 index 000000000000..9fc7b6a0c468 --- /dev/null +++ b/packages/api/src/hooks/useSettings.ts @@ -0,0 +1,17 @@ +import { useMemo } from 'react'; +import useFetch from '../useFetch'; + +/** A custom hook to get user settings (email, date of birth, address etc) */ +const useSettings = () => { + const { data, ...rest } = useFetch('get_settings'); + + const modified_data = useMemo(() => ({ ...data?.get_settings }), [data?.get_settings]); + + return { + /** User information and settings */ + data: modified_data, + ...rest, + }; +}; + +export default useSettings; From 666c29084e36364d908aec4e2e5f8cbccdadb20d Mon Sep 17 00:00:00 2001 From: Farhan Ahmad Nurzi Date: Thu, 24 Aug 2023 12:35:46 +0800 Subject: [PATCH 07/17] chore: get country_code from user settings instead of authorize --- packages/api/src/hooks/useLandingCompany.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/api/src/hooks/useLandingCompany.ts b/packages/api/src/hooks/useLandingCompany.ts index 1ec60cf9b535..762aaab28944 100644 --- a/packages/api/src/hooks/useLandingCompany.ts +++ b/packages/api/src/hooks/useLandingCompany.ts @@ -1,13 +1,13 @@ import { useMemo } from 'react'; -import useAuthorize from './useAuthorize'; import useFetch from '../useFetch'; +import useSettings from './useSettings'; /** A custom hook that returns the available landing companies of the user's country. */ const useLandingCompany = () => { - const { data: authorize_data } = useAuthorize(); + const { data: settings_data } = useSettings(); const { data, ...rest } = useFetch('landing_company', { - payload: { landing_company: authorize_data.country || '' }, - options: { enabled: Boolean(authorize_data.country) }, + payload: { landing_company: settings_data.country_code || '' }, + options: { enabled: Boolean(settings_data.country_code) }, }); const modified_data = useMemo(() => { From 7259b6ff07d3ad4eba6390be6a9939f74c92782c Mon Sep 17 00:00:00 2001 From: Farhan Ahmad Nurzi Date: Thu, 24 Aug 2023 13:53:45 +0800 Subject: [PATCH 08/17] chore: combine get_settings with set_settings --- packages/api/src/hooks/useSettings.ts | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/packages/api/src/hooks/useSettings.ts b/packages/api/src/hooks/useSettings.ts index 9fc7b6a0c468..799ba4a3ee1f 100644 --- a/packages/api/src/hooks/useSettings.ts +++ b/packages/api/src/hooks/useSettings.ts @@ -1,15 +1,32 @@ -import { useMemo } from 'react'; +import { useCallback, useEffect, useMemo } from 'react'; import useFetch from '../useFetch'; +import useInvalidateQuery from '../useInvalidateQuery'; +import useRequest from '../useRequest'; + +type TSetSettingsPayload = NonNullable< + NonNullable>['mutate']>>[0] +>['payload']; /** A custom hook to get user settings (email, date of birth, address etc) */ const useSettings = () => { const { data, ...rest } = useFetch('get_settings'); + const invalidate = useInvalidateQuery(); + const { mutate } = useRequest('set_settings', { + onSuccess: () => invalidate('get_settings'), + }); + + const set_settings = useCallback( + (values: NonNullable) => mutate({ payload: { ...values } }), + [mutate] + ); const modified_data = useMemo(() => ({ ...data?.get_settings }), [data?.get_settings]); return { /** User information and settings */ data: modified_data, + /** Function to update user settings */ + set_settings, ...rest, }; }; From 2d93e34e6d9ef142cc50f9e799e19f1f305dd9c4 Mon Sep 17 00:00:00 2001 From: Farhan Ahmad Nurzi Date: Thu, 24 Aug 2023 13:58:01 +0800 Subject: [PATCH 09/17] fix: change request type for landing_company --- packages/api/types.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/api/types.ts b/packages/api/types.ts index 4dd95e5a00f5..e2cb7465c0c7 100644 --- a/packages/api/types.ts +++ b/packages/api/types.ts @@ -497,8 +497,9 @@ type TSocketEndpoints = { response: LandingCompanyDetailsResponse; }; landing_company: { - // TODO: Fix typings of this endpoint, because LandingCompany payload should be a string instead of LandingCompany interface - request: { + // TODO: Fix typings of this endpoint, because landing_company payload should be a string instead of LandingCompany interface + request: Omit & { + /** Client's 2-letter country code (obtained from `residence_list` call). */ landing_company: string; }; response: LandingCompanyResponse; From 22a688381eb354a10ee158af660230d8f1110355 Mon Sep 17 00:00:00 2001 From: Farhan Ahmad Nurzi Date: Thu, 24 Aug 2023 13:59:46 +0800 Subject: [PATCH 10/17] chore: combine get_settings with set_settings --- packages/api/src/hooks/useSettings.ts | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/packages/api/src/hooks/useSettings.ts b/packages/api/src/hooks/useSettings.ts index 9fc7b6a0c468..8d52b5a900fa 100644 --- a/packages/api/src/hooks/useSettings.ts +++ b/packages/api/src/hooks/useSettings.ts @@ -1,15 +1,32 @@ -import { useMemo } from 'react'; +import { useCallback, useMemo } from 'react'; import useFetch from '../useFetch'; +import useInvalidateQuery from '../useInvalidateQuery'; +import useRequest from '../useRequest'; + +type TSetSettingsPayload = NonNullable< + NonNullable>['mutate']>>[0] +>['payload']; /** A custom hook to get user settings (email, date of birth, address etc) */ const useSettings = () => { const { data, ...rest } = useFetch('get_settings'); + const invalidate = useInvalidateQuery(); + const { mutate } = useRequest('set_settings', { + onSuccess: () => invalidate('get_settings'), + }); + + const set_settings = useCallback( + (values: NonNullable) => mutate({ payload: { ...values } }), + [mutate] + ); const modified_data = useMemo(() => ({ ...data?.get_settings }), [data?.get_settings]); return { /** User information and settings */ data: modified_data, + /** Function to update user settings */ + set_settings, ...rest, }; }; From 90788f8ed379a6ba438476404a0fae98bfe56384 Mon Sep 17 00:00:00 2001 From: Farhan Ahmad Nurzi Date: Thu, 24 Aug 2023 16:04:40 +0800 Subject: [PATCH 11/17] refactor: change function name --- packages/api/src/hooks/useSettings.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/api/src/hooks/useSettings.ts b/packages/api/src/hooks/useSettings.ts index 8d52b5a900fa..53b9415fbd35 100644 --- a/packages/api/src/hooks/useSettings.ts +++ b/packages/api/src/hooks/useSettings.ts @@ -15,7 +15,7 @@ const useSettings = () => { onSuccess: () => invalidate('get_settings'), }); - const set_settings = useCallback( + const setSettings = useCallback( (values: NonNullable) => mutate({ payload: { ...values } }), [mutate] ); @@ -26,7 +26,7 @@ const useSettings = () => { /** User information and settings */ data: modified_data, /** Function to update user settings */ - set_settings, + setSettings, ...rest, }; }; From 458aab8575c8e74fe460d94447841124effdcb68 Mon Sep 17 00:00:00 2001 From: Farhan Ahmad Nurzi Date: Fri, 25 Aug 2023 15:21:31 +0800 Subject: [PATCH 12/17] chore: add missing dependencies for useLandingCompany return data --- packages/api/src/hooks/useLandingCompany.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/api/src/hooks/useLandingCompany.ts b/packages/api/src/hooks/useLandingCompany.ts index 762aaab28944..7261a5b0c54d 100644 --- a/packages/api/src/hooks/useLandingCompany.ts +++ b/packages/api/src/hooks/useLandingCompany.ts @@ -6,8 +6,8 @@ import useSettings from './useSettings'; const useLandingCompany = () => { const { data: settings_data } = useSettings(); const { data, ...rest } = useFetch('landing_company', { - payload: { landing_company: settings_data.country_code || '' }, - options: { enabled: Boolean(settings_data.country_code) }, + payload: { landing_company: settings_data?.country_code || '' }, + options: { enabled: Boolean(settings_data?.country_code) }, }); const modified_data = useMemo(() => { @@ -21,7 +21,7 @@ const useLandingCompany = () => { /** Short code of virtual landing company */ virtual_company, }; - }, [data]); + }, [data?.landing_company, settings_data?.country_code]); return { /** List of available landing companies */ From 2284c727cfee8035431c0de2e19f33f3f53bc891 Mon Sep 17 00:00:00 2001 From: Farhan Ahmad Nurzi Date: Fri, 25 Aug 2023 15:26:51 +0800 Subject: [PATCH 13/17] chore: return all mutation data --- packages/api/src/hooks/useSettings.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/api/src/hooks/useSettings.ts b/packages/api/src/hooks/useSettings.ts index 53b9415fbd35..bcb178cb4a50 100644 --- a/packages/api/src/hooks/useSettings.ts +++ b/packages/api/src/hooks/useSettings.ts @@ -11,7 +11,7 @@ type TSetSettingsPayload = NonNullable< const useSettings = () => { const { data, ...rest } = useFetch('get_settings'); const invalidate = useInvalidateQuery(); - const { mutate } = useRequest('set_settings', { + const { mutate, ...mutate_rest } = useRequest('set_settings', { onSuccess: () => invalidate('get_settings'), }); @@ -27,6 +27,7 @@ const useSettings = () => { data: modified_data, /** Function to update user settings */ setSettings, + mutation: mutate_rest, ...rest, }; }; From dbd632d62aaffdfd2b1ce7d24859aea25ff18be2 Mon Sep 17 00:00:00 2001 From: Farhan Ahmad Nurzi Date: Fri, 25 Aug 2023 15:28:21 +0800 Subject: [PATCH 14/17] chore: export hook --- packages/api/src/hooks/index.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/api/src/hooks/index.ts b/packages/api/src/hooks/index.ts index 6795a3ac3953..4e7c224e93b1 100644 --- a/packages/api/src/hooks/index.ts +++ b/packages/api/src/hooks/index.ts @@ -4,5 +4,6 @@ export { default as useAuthorize } from './useAuthorize'; export { default as useBalance } from './useBalance'; export { default as useCurrencyConfig } from './useCurrencyConfig'; export { default as useMT5LoginList } from './useMT5LoginList'; +export { default as useSettings } from './useSettings'; export { default as useTradingPlatformAccounts } from './useTradingPlatformAccounts'; export { default as useWalletAccountsList } from './useWalletAccountsList'; From 5b54e202866eacc9404403d218bf9855f3f2b5bb Mon Sep 17 00:00:00 2001 From: Farhan Ahmad Nurzi Date: Sun, 27 Aug 2023 09:10:28 +0800 Subject: [PATCH 15/17] refactor: types and mutation function name --- packages/api/src/hooks/useSettings.ts | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/packages/api/src/hooks/useSettings.ts b/packages/api/src/hooks/useSettings.ts index bcb178cb4a50..d51820815b01 100644 --- a/packages/api/src/hooks/useSettings.ts +++ b/packages/api/src/hooks/useSettings.ts @@ -4,8 +4,8 @@ import useInvalidateQuery from '../useInvalidateQuery'; import useRequest from '../useRequest'; type TSetSettingsPayload = NonNullable< - NonNullable>['mutate']>>[0] ->['payload']; + NonNullable>['mutate']>>[0]>['payload'] +>; /** A custom hook to get user settings (email, date of birth, address etc) */ const useSettings = () => { @@ -15,10 +15,7 @@ const useSettings = () => { onSuccess: () => invalidate('get_settings'), }); - const setSettings = useCallback( - (values: NonNullable) => mutate({ payload: { ...values } }), - [mutate] - ); + const update = useCallback((values: TSetSettingsPayload) => mutate({ payload: { ...values } }), [mutate]); const modified_data = useMemo(() => ({ ...data?.get_settings }), [data?.get_settings]); @@ -26,7 +23,7 @@ const useSettings = () => { /** User information and settings */ data: modified_data, /** Function to update user settings */ - setSettings, + update, mutation: mutate_rest, ...rest, }; From d6097548734186aff13c14998343a29a8af22a96 Mon Sep 17 00:00:00 2001 From: Farhan Ahmad Nurzi Date: Sun, 27 Aug 2023 09:19:39 +0800 Subject: [PATCH 16/17] refactor: use-landing-company-hook --- packages/api/src/hooks/useLandingCompany.ts | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/packages/api/src/hooks/useLandingCompany.ts b/packages/api/src/hooks/useLandingCompany.ts index 7261a5b0c54d..dd816713b2ad 100644 --- a/packages/api/src/hooks/useLandingCompany.ts +++ b/packages/api/src/hooks/useLandingCompany.ts @@ -14,12 +14,13 @@ const useLandingCompany = () => { if (!data?.landing_company) return; const { financial_company, gaming_company, virtual_company } = data.landing_company; return { + ...data.landing_company, /** Short code of financial landing company */ - financial_company: financial_company?.shortcode, + financial_company_shotcode: financial_company?.shortcode, /** Short code of gaming landing company */ - gaming_company: gaming_company?.shortcode, + gaming_company_shortcode: gaming_company?.shortcode, /** Short code of virtual landing company */ - virtual_company, + virtual_company_shortcode: virtual_company, }; }, [data?.landing_company, settings_data?.country_code]); From 60e212eabd6b0323bcf29803ba1196b9002c278a Mon Sep 17 00:00:00 2001 From: Farhan Ahmad Nurzi Date: Sun, 27 Aug 2023 09:25:40 +0800 Subject: [PATCH 17/17] fix: remove dependency --- packages/api/src/hooks/useLandingCompany.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/api/src/hooks/useLandingCompany.ts b/packages/api/src/hooks/useLandingCompany.ts index dd816713b2ad..de69b69eaa82 100644 --- a/packages/api/src/hooks/useLandingCompany.ts +++ b/packages/api/src/hooks/useLandingCompany.ts @@ -16,13 +16,13 @@ const useLandingCompany = () => { return { ...data.landing_company, /** Short code of financial landing company */ - financial_company_shotcode: financial_company?.shortcode, + financial_company_shortcode: financial_company?.shortcode, /** Short code of gaming landing company */ gaming_company_shortcode: gaming_company?.shortcode, /** Short code of virtual landing company */ virtual_company_shortcode: virtual_company, }; - }, [data?.landing_company, settings_data?.country_code]); + }, [data?.landing_company]); return { /** List of available landing companies */