Skip to content

Commit d34cd6b

Browse files
Merge pull request #58540 from rayane-d/Add-RBRorGBR-and-Account-switcher-tooltips
Add RBR/GBR chat and Account switcher tooltips
2 parents 669d303 + 144e62a commit d34cd6b

12 files changed

Lines changed: 197 additions & 30 deletions

File tree

src/CONST.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6992,6 +6992,8 @@ const CONST = {
69926992
SCAN_TEST_TOOLTIP: 'scanTestTooltip',
69936993
SCAN_TEST_TOOLTIP_MANAGER: 'scanTestTooltipManager',
69946994
SCAN_TEST_CONFIRMATION: 'scanTestConfirmation',
6995+
GBR_RBR_CHAT: 'chatGBRRBR',
6996+
ACCOUNT_SWITCHER: 'accountSwitcher',
69956997
EXPENSE_REPORTS_FILTER: 'expenseReportsFilter',
69966998
},
69976999
CHANGE_POLICY_TRAINING_MODAL: 'changePolicyModal',

src/components/AccountSwitcher.tsx

Lines changed: 46 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -26,10 +26,17 @@ import * as Expensicons from './Icon/Expensicons';
2626
import type {PopoverMenuItem} from './PopoverMenu';
2727
import PopoverMenu from './PopoverMenu';
2828
import {PressableWithFeedback} from './Pressable';
29+
import {useProductTrainingContext} from './ProductTrainingContext';
2930
import Text from './Text';
3031
import Tooltip from './Tooltip';
32+
import EducationalTooltip from './Tooltip/EducationalTooltip';
3133

32-
function AccountSwitcher() {
34+
type AccountSwitcherProps = {
35+
/* Whether the screen is focused. Used to hide the product training tooltip */
36+
isScreenFocused: boolean;
37+
};
38+
39+
function AccountSwitcher({isScreenFocused}: AccountSwitcherProps) {
3340
const currentUserPersonalDetails = useCurrentUserPersonalDetails();
3441
const styles = useThemeStyles();
3542
const theme = useTheme();
@@ -46,10 +53,42 @@ function AccountSwitcher() {
4653
const [shouldShowOfflineModal, setShouldShowOfflineModal] = useState(false);
4754
const delegators = account?.delegatedAccess?.delegators ?? [];
4855

49-
const isActingAsDelegate = !!account?.delegatedAccess?.delegate ?? false;
56+
const isActingAsDelegate = !!account?.delegatedAccess?.delegate;
5057
const canSwitchAccounts = delegators.length > 0 || isActingAsDelegate;
5158
const accountSwitcherPopoverStyle = canUseLeftHandBar ? styles.accountSwitcherPopoverWithLHB : styles.accountSwitcherPopover;
5259

60+
const {shouldShowProductTrainingTooltip, renderProductTrainingTooltip, hideProductTrainingTooltip} = useProductTrainingContext(
61+
CONST.PRODUCT_TRAINING_TOOLTIP_NAMES.ACCOUNT_SWITCHER,
62+
isScreenFocused && canSwitchAccounts,
63+
);
64+
65+
const onPressSwitcher = () => {
66+
hideProductTrainingTooltip();
67+
setShouldShowDelegatorMenu(!shouldShowDelegatorMenu);
68+
};
69+
70+
const TooltipToRender = shouldShowProductTrainingTooltip ? EducationalTooltip : Tooltip;
71+
const tooltipProps = shouldShowProductTrainingTooltip
72+
? {
73+
shouldRender: shouldShowProductTrainingTooltip,
74+
renderTooltipContent: renderProductTrainingTooltip,
75+
anchorAlignment: {
76+
horizontal: CONST.MODAL.ANCHOR_ORIGIN_HORIZONTAL.LEFT,
77+
vertical: CONST.MODAL.ANCHOR_ORIGIN_VERTICAL.TOP,
78+
},
79+
shiftVertical: variables.accountSwitcherTooltipShiftVertical,
80+
shiftHorizontal: variables.accountSwitcherTooltipShiftHorizontal,
81+
wrapperStyle: styles.productTrainingTooltipWrapper,
82+
onTooltipPress: onPressSwitcher,
83+
}
84+
: {
85+
text: translate('delegate.copilotAccess'),
86+
shiftVertical: 8,
87+
shiftHorizontal: 8,
88+
anchorAlignment: {horizontal: CONST.MODAL.ANCHOR_ORIGIN_HORIZONTAL.LEFT, vertical: CONST.MODAL.ANCHOR_ORIGIN_VERTICAL.BOTTOM},
89+
shouldRender: canSwitchAccounts,
90+
};
91+
5392
const createBaseMenuItem = (
5493
personalDetails: PersonalDetails | undefined,
5594
errors?: Errors,
@@ -132,19 +171,12 @@ function AccountSwitcher() {
132171

133172
return (
134173
<>
135-
<Tooltip
136-
text={translate('delegate.copilotAccess')}
137-
shiftVertical={8}
138-
shiftHorizontal={8}
139-
anchorAlignment={{horizontal: CONST.MODAL.ANCHOR_ORIGIN_HORIZONTAL.LEFT, vertical: CONST.MODAL.ANCHOR_ORIGIN_VERTICAL.BOTTOM}}
140-
shouldRender={canSwitchAccounts}
141-
>
174+
{/* eslint-disable-next-line react/jsx-props-no-spreading */}
175+
<TooltipToRender {...tooltipProps}>
142176
<PressableWithFeedback
143177
accessible
144178
accessibilityLabel={translate('common.profile')}
145-
onPress={() => {
146-
setShouldShowDelegatorMenu(!shouldShowDelegatorMenu);
147-
}}
179+
onPress={onPressSwitcher}
148180
ref={buttonRef}
149181
interactive={canSwitchAccounts}
150182
pressDimmingValue={canSwitchAccounts ? undefined : 1}
@@ -194,7 +226,8 @@ function AccountSwitcher() {
194226
</View>
195227
</View>
196228
</PressableWithFeedback>
197-
</Tooltip>
229+
</TooltipToRender>
230+
198231
{!!canSwitchAccounts && (
199232
<PopoverMenu
200233
isVisible={shouldShowDelegatorMenu}

src/components/LHNOptionsList/LHNOptionsList.tsx

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import BlockingView from '@components/BlockingViews/BlockingView';
99
import Icon from '@components/Icon';
1010
import * as Expensicons from '@components/Icon/Expensicons';
1111
import LottieAnimations from '@components/LottieAnimations';
12+
import {useProductTrainingContext} from '@components/ProductTrainingContext';
1213
import {ScrollOffsetContext} from '@components/ScrollOffsetContextProvider';
1314
import TextBlock from '@components/TextBlock';
1415
import useLHNEstimatedListSize from '@hooks/useLHNEstimatedListSize';
@@ -21,9 +22,9 @@ import useThemeStyles from '@hooks/useThemeStyles';
2122
import {isValidDraftComment} from '@libs/DraftCommentUtils';
2223
import getPlatform from '@libs/getPlatform';
2324
import Log from '@libs/Log';
24-
import {getIOUReportIDOfLastAction, getLastMessageTextForReport} from '@libs/OptionsListUtils';
25+
import {getIOUReportIDOfLastAction, getLastMessageTextForReport, hasReportErrors} from '@libs/OptionsListUtils';
2526
import {getOneTransactionThreadReportID, getOriginalMessage, getSortedReportActionsForDisplay, isMoneyRequestAction} from '@libs/ReportActionsUtils';
26-
import {canUserPerformWriteAction} from '@libs/ReportUtils';
27+
import {canUserPerformWriteAction, requiresAttentionFromCurrentUser} from '@libs/ReportUtils';
2728
import variables from '@styles/variables';
2829
import CONST from '@src/CONST';
2930
import ONYXKEYS from '@src/ONYXKEYS';
@@ -59,6 +60,27 @@ function LHNOptionsList({style, contentContainerStyles, data, onSelectRow, optio
5960
const platform = getPlatform();
6061
const isWebOrDesktop = platform === CONST.PLATFORM.WEB || platform === CONST.PLATFORM.DESKTOP;
6162

63+
const {shouldShowProductTrainingTooltip} = useProductTrainingContext(CONST.PRODUCT_TRAINING_TOOLTIP_NAMES.GBR_RBR_CHAT, true);
64+
const firstReportIDWithGBRorRBR = useMemo(() => {
65+
if (!shouldShowProductTrainingTooltip) {
66+
return undefined;
67+
}
68+
return data.find((reportID) => {
69+
const itemFullReport = reports?.[`${ONYXKEYS.COLLECTION.REPORT}${reportID}`];
70+
const itemReportActions = reportActions?.[`${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${reportID}`];
71+
if (!itemFullReport) {
72+
return false;
73+
}
74+
if (hasReportErrors(itemFullReport, itemReportActions)) {
75+
return true;
76+
}
77+
const itemParentReportActions = reportActions?.[`${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${itemFullReport?.parentReportID}`];
78+
const itemParentReportAction = itemFullReport?.parentReportActionID ? itemParentReportActions?.[itemFullReport?.parentReportActionID] : undefined;
79+
const hasGBR = requiresAttentionFromCurrentUser(itemFullReport, itemParentReportAction);
80+
return hasGBR;
81+
});
82+
}, [shouldShowProductTrainingTooltip, data, reportActions, reports]);
83+
6284
// When the first item renders we want to call the onFirstItemRendered callback.
6385
// At this point in time we know that the list is actually displaying items.
6486
const hasCalledOnLayout = React.useRef(false);
@@ -181,6 +203,8 @@ function LHNOptionsList({style, contentContainerStyles, data, onSelectRow, optio
181203
}
182204
const lastMessageTextFromReport = getLastMessageTextForReport(itemFullReport, lastActorDetails, itemPolicy, itemReportNameValuePairs);
183205

206+
const shouldShowRBRorGBRTooltip = firstReportIDWithGBRorRBR === reportID;
207+
184208
return (
185209
<OptionRowLHNData
186210
reportID={reportID}
@@ -205,6 +229,7 @@ function LHNOptionsList({style, contentContainerStyles, data, onSelectRow, optio
205229
hasDraftComment={hasDraftComment}
206230
transactionViolations={transactionViolations}
207231
onLayout={onLayoutItem}
232+
shouldShowRBRorGBRTooltip={shouldShowRBRorGBRTooltip}
208233
/>
209234
);
210235
},
@@ -224,6 +249,7 @@ function LHNOptionsList({style, contentContainerStyles, data, onSelectRow, optio
224249
transactionViolations,
225250
onLayoutItem,
226251
isOffline,
252+
firstReportIDWithGBRorRBR,
227253
],
228254
);
229255

src/components/LHNOptionsList/OptionRowLHN.tsx

Lines changed: 33 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import OfflineWithFeedback from '@components/OfflineWithFeedback';
1212
import {useSession} from '@components/OnyxProvider';
1313
import PressableWithSecondaryInteraction from '@components/PressableWithSecondaryInteraction';
1414
import {useProductTrainingContext} from '@components/ProductTrainingContext';
15+
import type {ProductTrainingTooltipName} from '@components/ProductTrainingContext/TOOLTIPS';
1516
import SubscriptAvatar from '@components/SubscriptAvatar';
1617
import Text from '@components/Text';
1718
import Tooltip from '@components/Tooltip';
@@ -49,18 +50,28 @@ import ONYXKEYS from '@src/ONYXKEYS';
4950
import {isEmptyObject} from '@src/types/utils/EmptyObject';
5051
import type {OptionRowLHNProps} from './types';
5152

52-
function OptionRowLHN({reportID, isFocused = false, onSelectRow = () => {}, optionItem, viewMode = 'default', style, onLayout = () => {}, hasDraftComment}: OptionRowLHNProps) {
53+
function OptionRowLHN({
54+
reportID,
55+
isFocused = false,
56+
onSelectRow = () => {},
57+
optionItem,
58+
viewMode = 'default',
59+
style,
60+
onLayout = () => {},
61+
hasDraftComment,
62+
shouldShowRBRorGBRTooltip,
63+
}: OptionRowLHNProps) {
5364
const theme = useTheme();
5465
const styles = useThemeStyles();
5566
const popoverAnchor = useRef<View>(null);
5667
const StyleUtils = useStyleUtils();
5768
const [isScreenFocused, setIsScreenFocused] = useState(false);
5869
const {shouldUseNarrowLayout} = useResponsiveLayout();
5970

60-
const [report] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT}${optionItem?.reportID}`);
61-
const [activePolicyID] = useOnyx(ONYXKEYS.NVP_ACTIVE_POLICY_ID);
62-
const [introSelected] = useOnyx(ONYXKEYS.NVP_INTRO_SELECTED);
63-
const [isFullscreenVisible] = useOnyx(ONYXKEYS.FULLSCREEN_VISIBILITY);
71+
const [report] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT}${optionItem?.reportID}`, {canBeMissing: true});
72+
const [activePolicyID] = useOnyx(ONYXKEYS.NVP_ACTIVE_POLICY_ID, {canBeMissing: true});
73+
const [introSelected] = useOnyx(ONYXKEYS.NVP_INTRO_SELECTED, {canBeMissing: true});
74+
const [isFullscreenVisible] = useOnyx(ONYXKEYS.FULLSCREEN_VISIBILITY, {canBeMissing: true});
6475
const session = useSession();
6576
const shouldShowWorkspaceChatTooltip = isPolicyExpenseChat(report) && !isThread(report) && activePolicyID === report?.policyID && session?.accountID === report?.ownerAccountID;
6677
const isOnboardingGuideAssigned = introSelected?.choice === CONST.ONBOARDING_CHOICES.MANAGE_TEAM && !session?.email?.includes('+');
@@ -69,16 +80,25 @@ function OptionRowLHN({reportID, isFocused = false, onSelectRow = () => {}, opti
6980

7081
const isReportsSplitNavigatorLast = useRootNavigationState((state) => state?.routes?.at(-1)?.name === NAVIGATORS.REPORTS_SPLIT_NAVIGATOR);
7182

72-
const {tooltipToRender, shouldShowTooltip} = useMemo(() => {
83+
const {tooltipToRender, shouldShowTooltip, shouldTooltipBeLeftAligned} = useMemo(() => {
7384
// TODO: CONCIERGE_LHN_GBR tooltip will be replaced by a tooltip in the #admins room
7485
// https://github.com/Expensify/App/issues/57045#issuecomment-2701455668
75-
const tooltip = shouldShowGetStartedTooltip ? CONST.PRODUCT_TRAINING_TOOLTIP_NAMES.CONCIERGE_LHN_GBR : CONST.PRODUCT_TRAINING_TOOLTIP_NAMES.LHN_WORKSPACE_CHAT_TOOLTIP;
76-
const shouldShowTooltips = shouldShowWorkspaceChatTooltip || shouldShowGetStartedTooltip;
86+
let tooltip: ProductTrainingTooltipName = shouldShowGetStartedTooltip
87+
? CONST.PRODUCT_TRAINING_TOOLTIP_NAMES.CONCIERGE_LHN_GBR
88+
: CONST.PRODUCT_TRAINING_TOOLTIP_NAMES.LHN_WORKSPACE_CHAT_TOOLTIP;
89+
if (shouldShowRBRorGBRTooltip) {
90+
tooltip = CONST.PRODUCT_TRAINING_TOOLTIP_NAMES.GBR_RBR_CHAT;
91+
}
92+
const shouldShowTooltips = shouldShowRBRorGBRTooltip || shouldShowWorkspaceChatTooltip || shouldShowGetStartedTooltip;
7793
const shouldTooltipBeVisible = shouldUseNarrowLayout ? isScreenFocused && isReportsSplitNavigatorLast : isReportsSplitNavigatorLast && !isFullscreenVisible;
7894

7995
// eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing
80-
return {tooltipToRender: tooltip, shouldShowTooltip: shouldShowTooltips && shouldTooltipBeVisible};
81-
}, [shouldShowGetStartedTooltip, shouldShowWorkspaceChatTooltip, isScreenFocused, shouldUseNarrowLayout, isReportsSplitNavigatorLast, isFullscreenVisible]);
96+
return {
97+
tooltipToRender: tooltip,
98+
shouldShowTooltip: shouldShowTooltips && shouldTooltipBeVisible,
99+
shouldTooltipBeLeftAligned: shouldShowWorkspaceChatTooltip && !shouldShowRBRorGBRTooltip && !shouldShowGetStartedTooltip,
100+
};
101+
}, [shouldShowRBRorGBRTooltip, shouldShowGetStartedTooltip, shouldShowWorkspaceChatTooltip, isScreenFocused, shouldUseNarrowLayout, isReportsSplitNavigatorLast, isFullscreenVisible]);
82102

83103
const {shouldShowProductTrainingTooltip, renderProductTrainingTooltip, hideProductTrainingTooltip} = useProductTrainingContext(tooltipToRender, shouldShowTooltip);
84104

@@ -195,11 +215,11 @@ function OptionRowLHN({reportID, isFocused = false, onSelectRow = () => {}, opti
195215
shouldRender={shouldShowProductTrainingTooltip}
196216
renderTooltipContent={renderProductTrainingTooltip}
197217
anchorAlignment={{
198-
horizontal: shouldShowWorkspaceChatTooltip ? CONST.MODAL.ANCHOR_ORIGIN_HORIZONTAL.LEFT : CONST.MODAL.ANCHOR_ORIGIN_HORIZONTAL.RIGHT,
218+
horizontal: shouldTooltipBeLeftAligned ? CONST.MODAL.ANCHOR_ORIGIN_HORIZONTAL.LEFT : CONST.MODAL.ANCHOR_ORIGIN_HORIZONTAL.RIGHT,
199219
vertical: CONST.MODAL.ANCHOR_ORIGIN_VERTICAL.TOP,
200220
}}
201-
shiftHorizontal={shouldShowWorkspaceChatTooltip ? variables.workspaceLHNTooltipShiftHorizontal : variables.gbrTooltipShiftHorizontal}
202-
shiftVertical={shouldShowWorkspaceChatTooltip ? 0 : variables.gbrTooltipShiftVertical}
221+
shiftHorizontal={shouldTooltipBeLeftAligned ? variables.workspaceLHNTooltipShiftHorizontal : variables.gbrTooltipShiftHorizontal}
222+
shiftVertical={shouldTooltipBeLeftAligned ? 0 : variables.gbrTooltipShiftVertical}
203223
wrapperStyle={styles.productTrainingTooltipWrapper}
204224
onTooltipPress={onOptionPress}
205225
shouldHideOnScroll

src/components/LHNOptionsList/types.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,9 @@ type OptionRowLHNDataProps = {
116116

117117
/** Callback to execute when the OptionList lays out */
118118
onLayout?: (event: LayoutChangeEvent) => void;
119+
120+
/** Whether to show the educational tooltip for the GBR or RBR */
121+
shouldShowRBRorGBRTooltip: boolean;
119122
};
120123

121124
type OptionRowLHNProps = {
@@ -141,6 +144,9 @@ type OptionRowLHNProps = {
141144
hasDraftComment: boolean;
142145

143146
onLayout?: (event: LayoutChangeEvent) => void;
147+
148+
/** Whether to show the educational tooltip on the GBR or RBR */
149+
shouldShowRBRorGBRTooltip: boolean;
144150
};
145151

146152
type RenderItemProps = {item: string};

src/components/ProductTrainingContext/TOOLTIPS.ts

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@ const {
1212
SCAN_TEST_TOOLTIP,
1313
SCAN_TEST_TOOLTIP_MANAGER,
1414
SCAN_TEST_CONFIRMATION,
15+
GBR_RBR_CHAT,
16+
ACCOUNT_SWITCHER,
1517
EXPENSE_REPORTS_FILTER,
1618
} = CONST.PRODUCT_TRAINING_TOOLTIP_NAMES;
1719

@@ -90,6 +92,29 @@ const TOOLTIPS: Record<ProductTrainingTooltipName, TooltipData> = {
9092
priority: 1800,
9193
shouldShow: ({isUserPolicyEmployee}) => isUserPolicyEmployee,
9294
},
95+
[GBR_RBR_CHAT]: {
96+
content: [
97+
{text: 'productTrainingTooltip.GBRRBRChat.part1', isBold: false},
98+
{text: 'productTrainingTooltip.GBRRBRChat.part2', isBold: true},
99+
{text: 'productTrainingTooltip.GBRRBRChat.part3', isBold: false},
100+
{text: 'productTrainingTooltip.GBRRBRChat.part4', isBold: true},
101+
],
102+
onHideTooltip: () => dismissProductTraining(GBR_RBR_CHAT),
103+
name: GBR_RBR_CHAT,
104+
priority: 1900,
105+
shouldShow: () => true,
106+
},
107+
[ACCOUNT_SWITCHER]: {
108+
content: [
109+
{text: 'productTrainingTooltip.accountSwitcher.part1', isBold: false},
110+
{text: 'productTrainingTooltip.accountSwitcher.part2', isBold: true},
111+
{text: 'productTrainingTooltip.accountSwitcher.part3', isBold: false},
112+
],
113+
onHideTooltip: () => dismissProductTraining(ACCOUNT_SWITCHER),
114+
name: ACCOUNT_SWITCHER,
115+
priority: 1600,
116+
shouldShow: () => true,
117+
},
93118
[EXPENSE_REPORTS_FILTER]: {
94119
content: [
95120
{text: 'productTrainingTooltip.expenseReportsFilter.part1', isBold: false},

src/languages/en.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6228,6 +6228,17 @@ const translations = {
62286228
part3: '\nand more.',
62296229
part4: ' Try it out!',
62306230
},
6231+
GBRRBRChat: {
6232+
part1: 'You’ll see 🟢 on ',
6233+
part2: 'actions to take',
6234+
part3: ',\nand 🔴 on ',
6235+
part4: 'errors to review.',
6236+
},
6237+
accountSwitcher: {
6238+
part1: 'Access your ',
6239+
part2: 'Copilot accounts',
6240+
part3: ' here',
6241+
},
62316242
expenseReportsFilter: {
62326243
part1: 'Welcome! Find all of your',
62336244
part2: "\ncompany's reports",

src/languages/es.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6752,6 +6752,17 @@ const translations = {
67526752
part3: '\ny más.',
67536753
part4: ' ¡Pruébalo!',
67546754
},
6755+
GBRRBRChat: {
6756+
part1: 'Verás 🟢 en ',
6757+
part2: 'las acciones a realizar',
6758+
part3: '\ny 🔴 en ',
6759+
part4: 'los errores que debes revisar.',
6760+
},
6761+
accountSwitcher: {
6762+
part1: 'Accede a tus ',
6763+
part2: 'cuentas copiloto',
6764+
part3: ' aquí',
6765+
},
67556766
expenseReportsFilter: {
67566767
part1: '¡Bienvenido! Aquí encontrarás todos los',
67576768
part2: '\ninformes de tu empresa',
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
import {findFocusedRoute, useNavigationState} from '@react-navigation/native';
2+
import useRootNavigationState from '@hooks/useRootNavigationState';
3+
import NAVIGATORS from '@src/NAVIGATORS';
4+
import SCREENS from '@src/SCREENS';
5+
6+
function useIsAccountSettingsRouteActive(isNarrowLayout: boolean) {
7+
const focusedRoute = useNavigationState(findFocusedRoute);
8+
const navigationState = useRootNavigationState((x) => x);
9+
10+
const isSettingsSplitNavigator = navigationState?.routes.at(-1)?.name === NAVIGATORS.SETTINGS_SPLIT_NAVIGATOR;
11+
const isAccountSettings = focusedRoute?.name === SCREENS.SETTINGS.ROOT;
12+
13+
return isNarrowLayout ? isAccountSettings && isSettingsSplitNavigator : isSettingsSplitNavigator;
14+
}
15+
16+
export default useIsAccountSettingsRouteActive;

0 commit comments

Comments
 (0)