From bfb59a46389dd309d5a4806a3faf5a83c5381fef Mon Sep 17 00:00:00 2001 From: Fedi Rajhi Date: Fri, 5 Jul 2024 13:16:54 +0100 Subject: [PATCH 1/8] [Chore]: Add openPolicyProfilePage and openPolicyInitialPage and API parameters --- .../parameters/OpenPolicyInitialPageParams.ts | 5 +++ .../parameters/OpenPolicyProfilePageParams.ts | 5 +++ src/libs/API/parameters/index.ts | 2 + src/libs/API/types.ts | 8 +++- src/libs/actions/Policy/Policy.ts | 44 ++++++++++++++----- 5 files changed, 51 insertions(+), 13 deletions(-) create mode 100644 src/libs/API/parameters/OpenPolicyInitialPageParams.ts create mode 100644 src/libs/API/parameters/OpenPolicyProfilePageParams.ts diff --git a/src/libs/API/parameters/OpenPolicyInitialPageParams.ts b/src/libs/API/parameters/OpenPolicyInitialPageParams.ts new file mode 100644 index 0000000000000..764abe9a6a779 --- /dev/null +++ b/src/libs/API/parameters/OpenPolicyInitialPageParams.ts @@ -0,0 +1,5 @@ +type OpenPolicyInitialPageParams = { + policyID: string; +}; + +export default OpenPolicyInitialPageParams; diff --git a/src/libs/API/parameters/OpenPolicyProfilePageParams.ts b/src/libs/API/parameters/OpenPolicyProfilePageParams.ts new file mode 100644 index 0000000000000..55dce33a3dac4 --- /dev/null +++ b/src/libs/API/parameters/OpenPolicyProfilePageParams.ts @@ -0,0 +1,5 @@ +type OpenPolicyProfilePageParams = { + policyID: string; +}; + +export default OpenPolicyProfilePageParams; diff --git a/src/libs/API/parameters/index.ts b/src/libs/API/parameters/index.ts index 848af7e34634d..adbd40514b2ed 100644 --- a/src/libs/API/parameters/index.ts +++ b/src/libs/API/parameters/index.ts @@ -12,6 +12,8 @@ export type {default as BeginSignInParams} from './BeginSignInParams'; export type {default as CloseAccountParams} from './CloseAccountParams'; export type {default as ConnectBankAccountParams} from './ConnectBankAccountParams'; export type {default as ConnectPolicyToAccountingIntegrationParams} from './ConnectPolicyToAccountingIntegrationParams'; +export type {default as OpenPolicyProfilePageParams} from './OpenPolicyProfilePageParams'; +export type {default as OpenPolicyInitialPageParams} from './OpenPolicyInitialPageParams'; export type {default as SyncPolicyToQuickbooksOnlineParams} from './SyncPolicyToQuickbooksOnlineParams'; export type {default as SyncPolicyToXeroParams} from './SyncPolicyToXeroParams'; export type {default as SyncPolicyToNetSuiteParams} from './SyncPolicyToNetSuiteParams'; diff --git a/src/libs/API/types.ts b/src/libs/API/types.ts index 1bf1efc8af24b..c136f9f857257 100644 --- a/src/libs/API/types.ts +++ b/src/libs/API/types.ts @@ -586,6 +586,8 @@ const READ_COMMANDS = { OPEN_POLICY_DISTANCE_RATES_PAGE: 'OpenPolicyDistanceRatesPage', OPEN_POLICY_MORE_FEATURES_PAGE: 'OpenPolicyMoreFeaturesPage', OPEN_POLICY_ACCOUNTING_PAGE: 'OpenPolicyAccountingPage', + OPEN_POLICY_PROFILE_PAGE: 'OpenPolicyProfilePage', + OPEN_POLICY_INITIAL_PAGE: 'OpenPolicyInitialPage', SEARCH: 'Search', OPEN_SUBSCRIPTION_PAGE: 'OpenSubscriptionPage', } as const; @@ -636,6 +638,8 @@ type ReadCommandParameters = { [READ_COMMANDS.OPEN_POLICY_MORE_FEATURES_PAGE]: Parameters.OpenPolicyMoreFeaturesPageParams; [READ_COMMANDS.OPEN_POLICY_ACCOUNTING_PAGE]: Parameters.OpenPolicyAccountingPageParams; [READ_COMMANDS.OPEN_POLICY_EXPENSIFY_CARDS_PAGE]: Parameters.OpenPolicyExpensifyCardsPageParams; + [READ_COMMANDS.OPEN_POLICY_PROFILE_PAGE]: Parameters.OpenPolicyProfilePageParams; + [READ_COMMANDS.OPEN_POLICY_INITIAL_PAGE]: Parameters.OpenPolicyInitialPageParams; [READ_COMMANDS.SEARCH]: Parameters.SearchParams; [READ_COMMANDS.OPEN_SUBSCRIPTION_PAGE]: null; }; @@ -677,7 +681,7 @@ type ApiCommand = WriteCommand | ReadCommand | SideEffectRequestCommand; type CommandOfType = TRequestType extends typeof CONST.API_REQUEST_TYPE.WRITE ? WriteCommand : TRequestType extends typeof CONST.API_REQUEST_TYPE.READ - ? ReadCommand - : SideEffectRequestCommand; + ? ReadCommand + : SideEffectRequestCommand; export type {ApiCommand, ApiRequestType, ApiRequestCommandParameters, CommandOfType, WriteCommand, ReadCommand, SideEffectRequestCommand}; diff --git a/src/libs/actions/Policy/Policy.ts b/src/libs/actions/Policy/Policy.ts index ca61fceaaa783..808dfb30d6a7b 100644 --- a/src/libs/actions/Policy/Policy.ts +++ b/src/libs/actions/Policy/Policy.ts @@ -19,7 +19,9 @@ import type { LeavePolicyParams, OpenDraftWorkspaceRequestParams, OpenPolicyExpensifyCardsPageParams, + OpenPolicyInitialPageParams, OpenPolicyMoreFeaturesPageParams, + OpenPolicyProfilePageParams, OpenPolicyTaxesPageParams, OpenPolicyWorkflowsPageParams, OpenWorkspaceInvitePageParams, @@ -2593,13 +2595,16 @@ function enablePolicyTaxes(policyID: string, enabled: boolean) { taxRates: { ...defaultTaxRates, taxes: { - ...Object.keys(defaultTaxRates.taxes).reduce((acc, taxKey) => { - acc[taxKey] = { - ...defaultTaxRates.taxes[taxKey], - pendingAction: CONST.RED_BRICK_ROAD_PENDING_ACTION.ADD, - }; - return acc; - }, {} as Record), + ...Object.keys(defaultTaxRates.taxes).reduce( + (acc, taxKey) => { + acc[taxKey] = { + ...defaultTaxRates.taxes[taxKey], + pendingAction: CONST.RED_BRICK_ROAD_PENDING_ACTION.ADD, + }; + return acc; + }, + {} as Record, + ), }, }, }, @@ -2612,10 +2617,13 @@ function enablePolicyTaxes(policyID: string, enabled: boolean) { value: { taxRates: { taxes: { - ...Object.keys(defaultTaxRates.taxes).reduce((acc, taxKey) => { - acc[taxKey] = {pendingAction: null}; - return acc; - }, {} as Record), + ...Object.keys(defaultTaxRates.taxes).reduce( + (acc, taxKey) => { + acc[taxKey] = {pendingAction: null}; + return acc; + }, + {} as Record, + ), }, }, }, @@ -2849,6 +2857,18 @@ function openPolicyMoreFeaturesPage(policyID: string) { API.read(READ_COMMANDS.OPEN_POLICY_MORE_FEATURES_PAGE, params); } +function openPolicyProfilePage(policyID: string) { + const params: OpenPolicyProfilePageParams = {policyID}; + + API.read(READ_COMMANDS.OPEN_POLICY_PROFILE_PAGE, params); +} + +function openPolicyInitialPage(policyID: string) { + const params: OpenPolicyInitialPageParams = {policyID}; + + API.read(READ_COMMANDS.OPEN_POLICY_INITIAL_PAGE, params); +} + function setPolicyCustomTaxName(policyID: string, customTaxName: string) { const policy = getPolicy(policyID); const originalCustomTaxName = policy?.taxRates?.name; @@ -3056,6 +3076,8 @@ export { enablePolicyWorkflows, enableDistanceRequestTax, openPolicyMoreFeaturesPage, + openPolicyProfilePage, + openPolicyInitialPage, generateCustomUnitID, clearQBOErrorField, clearXeroErrorField, From 4450e8d45979958d9a55056fbaf60b9af465493b Mon Sep 17 00:00:00 2001 From: Fedi Rajhi Date: Fri, 5 Jul 2024 14:04:18 +0100 Subject: [PATCH 2/8] [Chore]: Add profile page to withPolicy HOC --- src/pages/workspace/withPolicy.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/src/pages/workspace/withPolicy.tsx b/src/pages/workspace/withPolicy.tsx index 64ebb34e2a5cf..14b070d3d781d 100644 --- a/src/pages/workspace/withPolicy.tsx +++ b/src/pages/workspace/withPolicy.tsx @@ -16,6 +16,7 @@ type PolicyRoute = RouteProp< NavigatorsParamList, | typeof SCREENS.REIMBURSEMENT_ACCOUNT_ROOT | typeof SCREENS.WORKSPACE.INITIAL + | typeof SCREENS.WORKSPACE.PROFILE | typeof SCREENS.WORKSPACE.BILLS | typeof SCREENS.WORKSPACE.MORE_FEATURES | typeof SCREENS.WORKSPACE.MEMBERS From 7c06299e2e9811721d1dd2ba09a186a1170a7d49 Mon Sep 17 00:00:00 2001 From: Fedi Rajhi Date: Fri, 5 Jul 2024 14:05:03 +0100 Subject: [PATCH 3/8] [Chore]: Use openPolicyInitialPage in WorkspaceInitialPage --- src/pages/workspace/WorkspaceInitialPage.tsx | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/src/pages/workspace/WorkspaceInitialPage.tsx b/src/pages/workspace/WorkspaceInitialPage.tsx index 242bb5885d1d0..195d3d565195e 100644 --- a/src/pages/workspace/WorkspaceInitialPage.tsx +++ b/src/pages/workspace/WorkspaceInitialPage.tsx @@ -1,4 +1,4 @@ -import {useNavigationState} from '@react-navigation/native'; +import {useFocusEffect, useNavigationState} from '@react-navigation/native'; import type {StackScreenProps} from '@react-navigation/stack'; import React, {useCallback, useEffect, useMemo, useState} from 'react'; import {View} from 'react-native'; @@ -87,7 +87,7 @@ function dismissError(policyID: string, pendingAction: PendingAction | undefined } } -function WorkspaceInitialPage({policyDraft, policy: policyProp, reimbursementAccount, policyCategories}: WorkspaceInitialPageProps) { +function WorkspaceInitialPage({policyDraft, policy: policyProp, reimbursementAccount, policyCategories, route}: WorkspaceInitialPageProps) { const styles = useThemeStyles(); const policy = policyDraft?.id ? policyDraft : policyProp; const [isCurrencyModalOpen, setIsCurrencyModalOpen] = useState(false); @@ -112,6 +112,21 @@ function WorkspaceInitialPage({policyDraft, policy: policyProp, reimbursementAcc }), [policy], ) as PolicyFeatureStates; + + const fetchPolicyData = useCallback(() => { + if (policyDraft?.id) { + return; + } + Policy.openPolicyInitialPage(route.params.policyID); + }, [policyDraft?.id, route.params.policyID]); + + useNetwork({onReconnect: fetchPolicyData}); + + useFocusEffect( + useCallback(() => { + fetchPolicyData(); + }, [fetchPolicyData]), + ); const policyID = policy?.id ?? '-1'; const policyName = policy?.name ?? ''; From 3c7a6a1fc537e6717d7e96750ff095fccd477dd4 Mon Sep 17 00:00:00 2001 From: Fedi Rajhi Date: Fri, 5 Jul 2024 14:05:41 +0100 Subject: [PATCH 4/8] [Chore]: use openPolicyProfilePage in WorkspaceProfilePage --- src/pages/workspace/WorkspaceProfilePage.tsx | 31 ++++++++++++++++---- 1 file changed, 26 insertions(+), 5 deletions(-) diff --git a/src/pages/workspace/WorkspaceProfilePage.tsx b/src/pages/workspace/WorkspaceProfilePage.tsx index 6a86a83b5d114..25284df69d5a8 100644 --- a/src/pages/workspace/WorkspaceProfilePage.tsx +++ b/src/pages/workspace/WorkspaceProfilePage.tsx @@ -31,20 +31,24 @@ import ONYXKEYS from '@src/ONYXKEYS'; import ROUTES from '@src/ROUTES'; import type * as OnyxTypes from '@src/types/onyx'; import {isEmptyObject} from '@src/types/utils/EmptyObject'; +import type { FullScreenNavigatorParamList } from '@libs/Navigation/types'; +import type { StackScreenProps } from '@react-navigation/stack'; +import type SCREENS from '@src/SCREENS'; +import useNetwork from '@hooks/useNetwork'; +import { useFocusEffect } from '@react-navigation/native'; import withPolicy from './withPolicy'; import type {WithPolicyProps} from './withPolicy'; import WorkspacePageWithSections from './WorkspacePageWithSections'; -type WorkSpaceProfilePageOnyxProps = { +type WorkspaceProfilePageOnyxProps = { /** Constant, list of available currencies */ currencyList: OnyxEntry; }; -type WorkSpaceProfilePageProps = WithPolicyProps & WorkSpaceProfilePageOnyxProps; - +type WorkspaceProfilePageProps = WithPolicyProps & WorkspaceProfilePageOnyxProps & StackScreenProps; const parser = new ExpensiMark(); -function WorkspaceProfilePage({policy, currencyList = {}, route}: WorkSpaceProfilePageProps) { +function WorkspaceProfilePage({policyDraft, policy, currencyList = {}, route}: WorkspaceProfilePageProps) { const styles = useThemeStyles(); const {translate} = useLocalize(); const {isSmallScreenWidth} = useWindowDimensions(); @@ -82,6 +86,23 @@ function WorkspaceProfilePage({policy, currencyList = {}, route}: WorkSpaceProfi const imageStyle: StyleProp = isSmallScreenWidth ? [styles.mhv12, styles.mhn5, styles.mbn5] : [styles.mhv8, styles.mhn8, styles.mbn5]; const shouldShowAddress = !readOnly || formattedAddress; + const fetchPolicyData = useCallback(() => { + if (policyDraft?.id) { + return; + } + Policy.openPolicyProfilePage(route.params.policyID); + }, [policyDraft?.id, route.params.policyID]); + + useNetwork({onReconnect: fetchPolicyData}); + + // We have the same focus effect in the WorkspaceInitialPage, this way we can get the policy data in narrow + // as well as in the wide layout when looking at policy settings. + useFocusEffect( + useCallback(() => { + fetchPolicyData(); + }, [fetchPolicyData]), + ); + const DefaultAvatar = useCallback( () => ( ({ + withOnyx({ currencyList: {key: ONYXKEYS.CURRENCY_LIST}, })(WorkspaceProfilePage), ); From 7aedbf9e32e975ebeb9bd993808f1b98325904c1 Mon Sep 17 00:00:00 2001 From: Fedi Rajhi Date: Fri, 5 Jul 2024 14:43:00 +0100 Subject: [PATCH 5/8] [Chore]: Fix prettier --- src/libs/actions/Policy/Policy.ts | 28 ++++++++------------ src/pages/workspace/WorkspaceInitialPage.tsx | 4 +-- src/pages/workspace/WorkspaceProfilePage.tsx | 10 +++---- 3 files changed, 18 insertions(+), 24 deletions(-) diff --git a/src/libs/actions/Policy/Policy.ts b/src/libs/actions/Policy/Policy.ts index 808dfb30d6a7b..4054316c7a87f 100644 --- a/src/libs/actions/Policy/Policy.ts +++ b/src/libs/actions/Policy/Policy.ts @@ -2595,16 +2595,13 @@ function enablePolicyTaxes(policyID: string, enabled: boolean) { taxRates: { ...defaultTaxRates, taxes: { - ...Object.keys(defaultTaxRates.taxes).reduce( - (acc, taxKey) => { - acc[taxKey] = { - ...defaultTaxRates.taxes[taxKey], - pendingAction: CONST.RED_BRICK_ROAD_PENDING_ACTION.ADD, - }; - return acc; - }, - {} as Record, - ), + ...Object.keys(defaultTaxRates.taxes).reduce((acc, taxKey) => { + acc[taxKey] = { + ...defaultTaxRates.taxes[taxKey], + pendingAction: CONST.RED_BRICK_ROAD_PENDING_ACTION.ADD, + }; + return acc; + }, {} as Record), }, }, }, @@ -2617,13 +2614,10 @@ function enablePolicyTaxes(policyID: string, enabled: boolean) { value: { taxRates: { taxes: { - ...Object.keys(defaultTaxRates.taxes).reduce( - (acc, taxKey) => { - acc[taxKey] = {pendingAction: null}; - return acc; - }, - {} as Record, - ), + ...Object.keys(defaultTaxRates.taxes).reduce((acc, taxKey) => { + acc[taxKey] = {pendingAction: null}; + return acc; + }, {} as Record), }, }, }, diff --git a/src/pages/workspace/WorkspaceInitialPage.tsx b/src/pages/workspace/WorkspaceInitialPage.tsx index 195d3d565195e..7a500a85ee330 100644 --- a/src/pages/workspace/WorkspaceInitialPage.tsx +++ b/src/pages/workspace/WorkspaceInitialPage.tsx @@ -112,8 +112,8 @@ function WorkspaceInitialPage({policyDraft, policy: policyProp, reimbursementAcc }), [policy], ) as PolicyFeatureStates; - - const fetchPolicyData = useCallback(() => { + + const fetchPolicyData = useCallback(() => { if (policyDraft?.id) { return; } diff --git a/src/pages/workspace/WorkspaceProfilePage.tsx b/src/pages/workspace/WorkspaceProfilePage.tsx index 25284df69d5a8..57b5aa42f92a4 100644 --- a/src/pages/workspace/WorkspaceProfilePage.tsx +++ b/src/pages/workspace/WorkspaceProfilePage.tsx @@ -1,3 +1,5 @@ +import {useFocusEffect} from '@react-navigation/native'; +import type {StackScreenProps} from '@react-navigation/stack'; import {ExpensiMark} from 'expensify-common'; import React, {useCallback, useState} from 'react'; import type {ImageStyle, StyleProp} from 'react-native'; @@ -15,12 +17,14 @@ import OfflineWithFeedback from '@components/OfflineWithFeedback'; import Section from '@components/Section'; import useActiveWorkspace from '@hooks/useActiveWorkspace'; import useLocalize from '@hooks/useLocalize'; +import useNetwork from '@hooks/useNetwork'; import usePermissions from '@hooks/usePermissions'; import useThemeIllustrations from '@hooks/useThemeIllustrations'; import useThemeStyles from '@hooks/useThemeStyles'; import useWindowDimensions from '@hooks/useWindowDimensions'; import * as ErrorUtils from '@libs/ErrorUtils'; import Navigation from '@libs/Navigation/Navigation'; +import type {FullScreenNavigatorParamList} from '@libs/Navigation/types'; import * as PolicyUtils from '@libs/PolicyUtils'; import * as ReportUtils from '@libs/ReportUtils'; import StringUtils from '@libs/StringUtils'; @@ -29,13 +33,9 @@ import * as Policy from '@userActions/Policy/Policy'; import CONST from '@src/CONST'; import ONYXKEYS from '@src/ONYXKEYS'; import ROUTES from '@src/ROUTES'; +import type SCREENS from '@src/SCREENS'; import type * as OnyxTypes from '@src/types/onyx'; import {isEmptyObject} from '@src/types/utils/EmptyObject'; -import type { FullScreenNavigatorParamList } from '@libs/Navigation/types'; -import type { StackScreenProps } from '@react-navigation/stack'; -import type SCREENS from '@src/SCREENS'; -import useNetwork from '@hooks/useNetwork'; -import { useFocusEffect } from '@react-navigation/native'; import withPolicy from './withPolicy'; import type {WithPolicyProps} from './withPolicy'; import WorkspacePageWithSections from './WorkspacePageWithSections'; From 30c58608ac92f4a2b7905039bdd78acedf03c095 Mon Sep 17 00:00:00 2001 From: Fedi Rajhi Date: Fri, 5 Jul 2024 15:07:59 +0100 Subject: [PATCH 6/8] [Chore]: Fix prettier --- src/libs/API/types.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/libs/API/types.ts b/src/libs/API/types.ts index c136f9f857257..9bcc7972d5266 100644 --- a/src/libs/API/types.ts +++ b/src/libs/API/types.ts @@ -681,7 +681,7 @@ type ApiCommand = WriteCommand | ReadCommand | SideEffectRequestCommand; type CommandOfType = TRequestType extends typeof CONST.API_REQUEST_TYPE.WRITE ? WriteCommand : TRequestType extends typeof CONST.API_REQUEST_TYPE.READ - ? ReadCommand - : SideEffectRequestCommand; + ? ReadCommand + : SideEffectRequestCommand; export type {ApiCommand, ApiRequestType, ApiRequestCommandParameters, CommandOfType, WriteCommand, ReadCommand, SideEffectRequestCommand}; From b99d5554bfd9c1067b3061172d75787f9ab557ec Mon Sep 17 00:00:00 2001 From: Fedi Rajhi Date: Fri, 5 Jul 2024 16:29:10 +0100 Subject: [PATCH 7/8] [Fix]: use policyDraft in WorkspaceProfilePage --- src/pages/workspace/WorkspaceProfilePage.tsx | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/src/pages/workspace/WorkspaceProfilePage.tsx b/src/pages/workspace/WorkspaceProfilePage.tsx index 57b5aa42f92a4..7b4edaef564ef 100644 --- a/src/pages/workspace/WorkspaceProfilePage.tsx +++ b/src/pages/workspace/WorkspaceProfilePage.tsx @@ -48,7 +48,7 @@ type WorkspaceProfilePageOnyxProps = { type WorkspaceProfilePageProps = WithPolicyProps & WorkspaceProfilePageOnyxProps & StackScreenProps; const parser = new ExpensiMark(); -function WorkspaceProfilePage({policyDraft, policy, currencyList = {}, route}: WorkspaceProfilePageProps) { +function WorkspaceProfilePage({policyDraft, policy: policyProp, currencyList = {}, route}: WorkspaceProfilePageProps) { const styles = useThemeStyles(); const {translate} = useLocalize(); const {isSmallScreenWidth} = useWindowDimensions(); @@ -56,6 +56,7 @@ function WorkspaceProfilePage({policyDraft, policy, currencyList = {}, route}: W const {activeWorkspaceID, setActiveWorkspaceID} = useActiveWorkspace(); const {canUseSpotnanaTravel} = usePermissions(); + const policy = policyDraft?.id ? policyDraft : policyProp; const outputCurrency = policy?.outputCurrency ?? ''; const currencySymbol = currencyList?.[outputCurrency]?.symbol ?? ''; const formattedCurrency = !isEmptyObject(policy) && !isEmptyObject(currencyList) ? `${outputCurrency} - ${currencySymbol}` : ''; @@ -137,11 +138,6 @@ function WorkspaceProfilePage({policyDraft, policy, currencyList = {}, route}: W } }, [policy?.id, policyName, activeWorkspaceID, setActiveWorkspaceID]); - // When we create a new workspaces, the policy prop will not be set on the first render. Therefore, we have to delay rendering until it has been set in Onyx. - if (policy === undefined) { - return null; - } - return ( Date: Fri, 5 Jul 2024 16:46:37 +0100 Subject: [PATCH 8/8] [Chore]: Add comment --- src/pages/workspace/WorkspaceProfilePage.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/src/pages/workspace/WorkspaceProfilePage.tsx b/src/pages/workspace/WorkspaceProfilePage.tsx index 7b4edaef564ef..75532c2565340 100644 --- a/src/pages/workspace/WorkspaceProfilePage.tsx +++ b/src/pages/workspace/WorkspaceProfilePage.tsx @@ -56,6 +56,7 @@ function WorkspaceProfilePage({policyDraft, policy: policyProp, currencyList = { const {activeWorkspaceID, setActiveWorkspaceID} = useActiveWorkspace(); const {canUseSpotnanaTravel} = usePermissions(); + // When we create a new workspace, the policy prop will be empty on the first render. Therefore, we have to use policyDraft until policy has been set in Onyx. const policy = policyDraft?.id ? policyDraft : policyProp; const outputCurrency = policy?.outputCurrency ?? ''; const currencySymbol = currencyList?.[outputCurrency]?.symbol ?? '';