Skip to content

Initial implementation of the Side Pane #56490

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 62 commits into from
Mar 4, 2025
Merged
Show file tree
Hide file tree
Changes from 60 commits
Commits
Show all changes
62 commits
Select commit Hold shift + click to select a range
9e2f4e9
Initial implementation of the right pane
blazejkustra Feb 6, 2025
21f586b
Close the right panel when resizing
blazejkustra Feb 6, 2025
b81640c
Merge branch 'main' into feature/right-pane
blazejkustra Feb 18, 2025
ecbf269
Change nvp name
blazejkustra Feb 18, 2025
fe55e51
add help button to the topbar
blazejkustra Feb 18, 2025
37e2915
Clean the code after initial commits
blazejkustra Feb 18, 2025
8eaa8b6
Create HelpButton
blazejkustra Feb 18, 2025
0261b7c
Create SidePane
blazejkustra Feb 18, 2025
01c27bf
Clean AuthScreens
blazejkustra Feb 18, 2025
d93de2a
Fix styles to incorporate side pane
blazejkustra Feb 18, 2025
29937be
Add HelpButton to headerView
blazejkustra Feb 18, 2025
a887953
Add HelpButton to all necessaary components
blazejkustra Feb 18, 2025
72a2f91
Rename to stay consistent
blazejkustra Feb 18, 2025
bb328e2
Merge branch 'main' into feature/right-pane
blazejkustra Feb 19, 2025
5df31e0
Add additional padding for help pane
blazejkustra Feb 21, 2025
a5443c5
Move inline styles to utils
blazejkustra Feb 21, 2025
550a645
Fix styles
blazejkustra Feb 21, 2025
177f82e
Add comments for closing logic
blazejkustra Feb 21, 2025
e65ff94
Reorder the code a bit
blazejkustra Feb 21, 2025
222d095
Add sidepane type
blazejkustra Feb 21, 2025
cbed9d9
Add translations
blazejkustra Feb 21, 2025
1e1f794
Add sidePane inside of navigator
blazejkustra Feb 21, 2025
bbe2b77
Hide toplevelbottomtabbar when sidepane is visible
blazejkustra Feb 21, 2025
dd89146
Add the actual onyx type
blazejkustra Feb 21, 2025
98b4b25
Clean up SidePane page, add screenwrapper to support mobiles
blazejkustra Feb 21, 2025
eee67f8
Add patch for react navigation
blazejkustra Feb 21, 2025
a6afa5d
Add explanation
blazejkustra Feb 21, 2025
3964999
Adjust platform files for better compability
blazejkustra Feb 21, 2025
fb57a91
Fix patches
blazejkustra Feb 24, 2025
3485e7c
Fix padding for side pane
blazejkustra Feb 24, 2025
eaee7c2
Fix styling and translations
blazejkustra Feb 24, 2025
38566a8
Initialize getHelpContent
blazejkustra Feb 24, 2025
396d3db
Create SidePane action file
blazejkustra Feb 24, 2025
a423982
Create substituteRouteParameters
blazejkustra Feb 24, 2025
970c5cb
Fix substituteRouteParameters
blazejkustra Feb 25, 2025
b3e3ccd
Fix positioning for RHP
blazejkustra Feb 25, 2025
41a6e44
Fix substituteRouteParameters
blazejkustra Feb 25, 2025
fafd1a6
Merge branch 'main' into feature/right-pane
blazejkustra Feb 25, 2025
3c48a30
Show help pane on search page
blazejkustra Feb 26, 2025
24bb2a4
Rearrange logic and create sweet animations
blazejkustra Feb 26, 2025
5bb2b9e
Fix other navigators too!
blazejkustra Feb 26, 2025
59b50e9
Refactor side pane logic and improve bottom tab visibility handling
blazejkustra Feb 26, 2025
0117ad6
Refactor HelpButton visibility logic in TopBar and HelpButton components
blazejkustra Feb 26, 2025
c5aa2c7
Merge branch 'main' into feature/right-pane
blazejkustra Feb 27, 2025
f08a011
Fix typecheck
blazejkustra Feb 27, 2025
a53931a
Remove triggerSidePane
blazejkustra Feb 27, 2025
9ec1975
Fix overlay on web
blazejkustra Feb 27, 2025
ad5a509
Improve how overlay and toplevelbottombar are displayed
blazejkustra Feb 27, 2025
ec692b7
Fix styling on natives
blazejkustra Feb 28, 2025
5bb82b1
Hide overlay when in RHP
blazejkustra Feb 28, 2025
f5f71df
Bring back original change
blazejkustra Feb 28, 2025
34202b1
Fix lint
blazejkustra Feb 28, 2025
12b5fa6
Fix ReportScreen
blazejkustra Feb 28, 2025
e288a1c
Hide HelpButton
blazejkustra Feb 28, 2025
41447cd
Hide sidePane when chaining languages
blazejkustra Mar 3, 2025
e438147
Fix backdrop edge cases
blazejkustra Mar 3, 2025
35a026c
Rename SidePane properties
blazejkustra Mar 3, 2025
ac46ca0
Add JSDoc
blazejkustra Mar 3, 2025
445d333
Bring back the old name for large screens
blazejkustra Mar 3, 2025
4062a25
Merge branch 'main' of github.com:Expensify/App into feature/right-pane
blazejkustra Mar 3, 2025
1ac677a
Merge branch 'main' of github.com:Expensify/App into feature/right-pane
blazejkustra Mar 4, 2025
4ad6f71
Simplify logic in isSidePaneHidden function to return boolean directly
blazejkustra Mar 4, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
92 changes: 92 additions & 0 deletions patches/@react-navigation+core+6.4.11+004+side-pane.patch
Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
diff --git a/node_modules/@react-navigation/core/lib/module/useDescriptors.js b/node_modules/@react-navigation/core/lib/module/useDescriptors.js
index 76fdab1..75f315c 100644
--- a/node_modules/@react-navigation/core/lib/module/useDescriptors.js
+++ b/node_modules/@react-navigation/core/lib/module/useDescriptors.js
@@ -112,6 +112,19 @@ export default function useDescriptors(_ref, convertCustomScreenOptions) {
}
return o;
});
+ const SidePane = customOptions.sidePane;
+ let element = /*#__PURE__*/React.createElement(React.Fragment, {
+ children: [/*#__PURE__*/React.createElement(SceneView, {
+ navigation: navigation,
+ route: route,
+ screen: screen,
+ routeState: state.routes[i].state,
+ getState: getState,
+ setState: setState,
+ options: customOptions,
+ clearOptions: clearOptions
+ }), SidePane && /*#__PURE__*/React.createElement(SidePane, {})]
+ });
acc[route.key] = {
route,
// @ts-expect-error: it's missing action helpers, fix later
@@ -123,17 +136,10 @@ export default function useDescriptors(_ref, convertCustomScreenOptions) {
}, /*#__PURE__*/React.createElement(NavigationContext.Provider, {
value: navigation
}, /*#__PURE__*/React.createElement(NavigationRouteContext.Provider, {
- value: route
- }, /*#__PURE__*/React.createElement(SceneView, {
- navigation: navigation,
- route: route,
- screen: screen,
- routeState: state.routes[i].state,
- getState: getState,
- setState: setState,
- options: mergedOptions,
- clearOptions: clearOptions
- }))));
+ value: route,
+ children: element
+ },
+ )));
},
options: mergedOptions
};
diff --git a/node_modules/@react-navigation/core/src/useDescriptors.tsx b/node_modules/@react-navigation/core/src/useDescriptors.tsx
index 2e4ee0f..11ece43 100644
--- a/node_modules/@react-navigation/core/src/useDescriptors.tsx
+++ b/node_modules/@react-navigation/core/src/useDescriptors.tsx
@@ -238,6 +238,23 @@ export default function useDescriptors<
return o;
});

+ const SidePane = (customOptions as any).sidePane;
+ let element = (
+ <>
+ <SceneView
+ navigation={navigation}
+ route={route}
+ screen={screen}
+ routeState={state.routes[i].state}
+ getState={getState}
+ setState={setState}
+ options={customOptions}
+ clearOptions={clearOptions}
+ />
+ {SidePane && <SidePane />}
+ </>
+ );
+
acc[route.key] = {
route,
// @ts-expect-error: it's missing action helpers, fix later
@@ -247,16 +264,7 @@ export default function useDescriptors<
<NavigationBuilderContext.Provider key={route.key} value={context}>
<NavigationContext.Provider value={navigation}>
<NavigationRouteContext.Provider value={route}>
- <SceneView
- navigation={navigation}
- route={route}
- screen={screen}
- routeState={state.routes[i].state}
- getState={getState}
- setState={setState}
- options={mergedOptions}
- clearOptions={clearOptions}
- />
+ {element}
</NavigationRouteContext.Provider>
</NavigationContext.Provider>
</NavigationBuilderContext.Provider>
4 changes: 4 additions & 0 deletions src/ONYXKEYS.ts
Original file line number Diff line number Diff line change
Expand Up @@ -479,6 +479,9 @@ const ONYXKEYS = {
/** Information about travel provisioning process */
TRAVEL_PROVISIONING: 'travelProvisioning',

/** Stores the information about the state of side panel */
NVP_SIDE_PANE: 'nvp_sidePaneExpanded',

/** Collection Keys */
COLLECTION: {
DOWNLOAD: 'download_',
Expand Down Expand Up @@ -1081,6 +1084,7 @@ type OnyxValuesMapping = {
[ONYXKEYS.CORPAY_ONBOARDING_FIELDS]: OnyxTypes.CorpayOnboardingFields;
[ONYXKEYS.LAST_FULL_RECONNECT_TIME]: string;
[ONYXKEYS.TRAVEL_PROVISIONING]: OnyxTypes.TravelProvisioning;
[ONYXKEYS.NVP_SIDE_PANE]: OnyxTypes.SidePane;
};

type OnyxDerivedValuesMapping = {
Expand Down
3 changes: 3 additions & 0 deletions src/components/HeaderWithBackButton/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import * as Expensicons from '@components/Icon/Expensicons';
import PinButton from '@components/PinButton';
import PressableWithoutFeedback from '@components/Pressable/PressableWithoutFeedback';
import SearchButton from '@components/Search/SearchRouter/SearchButton';
import HelpButton from '@components/SidePane/HelpButton';
import ThreeDotsMenu from '@components/ThreeDotsMenu';
import Tooltip from '@components/Tooltip';
import useLocalize from '@hooks/useLocalize';
Expand Down Expand Up @@ -65,6 +66,7 @@ function HeaderWithBackButton({
shouldOverlayDots = false,
shouldOverlay = false,
shouldNavigateToTopMostReport = false,
shouldDisplayHelpButton = true,
shouldDisplaySearchRouter = false,
progressBarPercentage,
style,
Expand Down Expand Up @@ -275,6 +277,7 @@ function HeaderWithBackButton({
</Tooltip>
)}
</View>
{shouldDisplayHelpButton && <HelpButton />}
{shouldDisplaySearchRouter && <SearchButton style={styles.mr5} />}
</View>
</View>
Expand Down
3 changes: 3 additions & 0 deletions src/components/HeaderWithBackButton/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -143,6 +143,9 @@ type HeaderWithBackButtonProps = Partial<ChildrenProps> & {
/** Whether we should overlay the 3 dots menu */
shouldOverlayDots?: boolean;

/** Whether we should display the button that opens the help pane */
shouldDisplayHelpButton?: boolean;

/** Whether we should display the button that opens new SearchRouter */
shouldDisplaySearchRouter?: boolean;

Expand Down
5 changes: 4 additions & 1 deletion src/components/Navigation/TopBar.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import Breadcrumbs from '@components/Breadcrumbs';
import LoadingBar from '@components/LoadingBar';
import {PressableWithoutFeedback} from '@components/Pressable';
import SearchButton from '@components/Search/SearchRouter/SearchButton';
import HelpButton from '@components/SidePane/HelpButton';
import Text from '@components/Text';
import WorkspaceSwitcherButton from '@components/WorkspaceSwitcherButton';
import useLocalize from '@hooks/useLocalize';
Expand All @@ -19,10 +20,11 @@ type TopBarProps = {
breadcrumbLabel: string;
activeWorkspaceID?: string;
shouldDisplaySearch?: boolean;
shouldDisplaySidePane?: boolean;
cancelSearch?: () => void;
};

function TopBar({breadcrumbLabel, activeWorkspaceID, shouldDisplaySearch = true, cancelSearch}: TopBarProps) {
function TopBar({breadcrumbLabel, activeWorkspaceID, shouldDisplaySearch = true, shouldDisplaySidePane = true, cancelSearch}: TopBarProps) {
const styles = useThemeStyles();
const {translate} = useLocalize();
const policy = usePolicy(activeWorkspaceID);
Expand Down Expand Up @@ -71,6 +73,7 @@ function TopBar({breadcrumbLabel, activeWorkspaceID, shouldDisplaySearch = true,
<Text style={[styles.textBlue]}>{translate('common.cancel')}</Text>
</PressableWithoutFeedback>
)}
{shouldDisplaySidePane && <HelpButton />}
{displaySearch && <SearchButton />}
</View>
<LoadingBar shouldShow={isLoadingReportData ?? false} />
Expand Down
6 changes: 4 additions & 2 deletions src/components/Navigation/TopLevelBottomTabBar/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import {InteractionManager, View} from 'react-native';
import {FullScreenBlockingViewContext} from '@components/FullScreenBlockingViewContextProvider';
import BottomTabBar from '@components/Navigation/BottomTabBar';
import useResponsiveLayout from '@hooks/useResponsiveLayout';
import useSidePane from '@hooks/useSidePane';
import useStyledSafeAreaInsets from '@hooks/useStyledSafeAreaInsets';
import useThemeStyles from '@hooks/useThemeStyles';
import type {PlatformStackNavigationState} from '@libs/Navigation/PlatformStackNavigation/types';
Expand All @@ -30,11 +31,12 @@ function TopLevelBottomTabBar({state}: TopLevelBottomTabBarProps) {
const [isAfterClosingTransition, setIsAfterClosingTransition] = useState(false);
const cancelAfterInteractions = useRef<ReturnType<typeof InteractionManager.runAfterInteractions> | undefined>();
const {isBlockingViewVisible} = useContext(FullScreenBlockingViewContext);
const {shouldHideTopLevelBottomBar} = useSidePane();

// That means it's visible and it's not covered by the overlay.
const isBottomTabVisibleDirectly = getIsBottomTabVisibleDirectly(state);
const isBottomTabVisibleDirectly = getIsBottomTabVisibleDirectly(state) && !shouldHideTopLevelBottomBar;
const isScreenWithBottomTabFocused = getIsScreenWithBottomTabFocused(state) && !shouldHideTopLevelBottomBar;
const selectedTab = getSelectedTab(state);
const isScreenWithBottomTabFocused = getIsScreenWithBottomTabFocused(state);

const shouldDisplayBottomBar = shouldUseNarrowLayout ? isScreenWithBottomTabFocused : isBottomTabVisibleDirectly;
const isReadyToDisplayBottomBar = isAfterClosingTransition && shouldDisplayBottomBar && !isBlockingViewVisible;
Expand Down
4 changes: 3 additions & 1 deletion src/components/Search/SearchAutocompleteInput.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import useActiveWorkspace from '@hooks/useActiveWorkspace';
import useCurrentUserPersonalDetails from '@hooks/useCurrentUserPersonalDetails';
import useLocalize from '@hooks/useLocalize';
import useNetwork from '@hooks/useNetwork';
import useResponsiveLayout from '@hooks/useResponsiveLayout';
import useTheme from '@hooks/useTheme';
import useThemeStyles from '@hooks/useThemeStyles';
import {parseFSAttributes} from '@libs/Fullstory';
Expand Down Expand Up @@ -104,6 +105,7 @@ function SearchAutocompleteInput(
const {isOffline} = useNetwork();
const {activeWorkspaceID} = useActiveWorkspace();
const currentUserPersonalDetails = useCurrentUserPersonalDetails();
const {shouldUseNarrowLayout} = useResponsiveLayout();

const [currencyList] = useOnyx(ONYXKEYS.CURRENCY_LIST);
const currencyAutocompleteList = Object.keys(currencyList ?? {});
Expand Down Expand Up @@ -191,7 +193,7 @@ function SearchAutocompleteInput(
<View style={[outerWrapperStyle]}>
<Animated.View
style={[styles.flexRow, styles.alignItemsCenter, wrapperStyle ?? styles.searchRouterTextInputContainer, wrapperAnimatedStyle]}
layout={LinearTransition}
layout={shouldUseNarrowLayout ? LinearTransition : undefined}
>
<View
style={styles.flex1}
Expand Down
50 changes: 50 additions & 0 deletions src/components/SidePane/HelpButton.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
import React from 'react';
import type {StyleProp, ViewStyle} from 'react-native';
import {useOnyx} from 'react-native-onyx';
import Icon from '@components/Icon';
import * as Expensicons from '@components/Icon/Expensicons';
import {PressableWithoutFeedback} from '@components/Pressable';
import Tooltip from '@components/Tooltip';
import useLocalize from '@hooks/useLocalize';
import useResponsiveLayout from '@hooks/useResponsiveLayout';
import useTheme from '@hooks/useTheme';
import useThemeStyles from '@hooks/useThemeStyles';
import {triggerSidePane} from '@libs/actions/SidePane';
import CONST from '@src/CONST';
import ONYXKEYS from '@src/ONYXKEYS';

type HelpButtonProps = {
style?: StyleProp<ViewStyle>;
};

function HelpButton({style}: HelpButtonProps) {
const styles = useThemeStyles();
const theme = useTheme();
const {translate} = useLocalize();
const [sidePane] = useOnyx(ONYXKEYS.NVP_SIDE_PANE);
const [language] = useOnyx(ONYXKEYS.NVP_PREFERRED_LOCALE);
const {isExtraLargeScreenWidth} = useResponsiveLayout();

if (!sidePane || language !== CONST.LOCALES.EN) {
return null;
}

return (
<Tooltip text={translate('common.help')}>
<PressableWithoutFeedback
accessibilityLabel={translate('common.help')}
style={[styles.flexRow, styles.touchableButtonImage, styles.pr2, style]}
onPress={() => triggerSidePane(isExtraLargeScreenWidth ? !sidePane?.open : !sidePane?.openNarrowScreen, {shouldUpdateNarrowLayout: !isExtraLargeScreenWidth})}
>
<Icon
src={Expensicons.QuestionMark}
fill={theme.icon}
/>
</PressableWithoutFeedback>
</Tooltip>
);
}

HelpButton.displayName = 'HelpButton';

export default HelpButton;
15 changes: 15 additions & 0 deletions src/components/SidePane/getHelpContent.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
import React from 'react';
import {View} from 'react-native';
import Text from '@components/Text';
import type {ThemeStyles} from '@styles/index';

const getHelpContent = (styles: ThemeStyles, route: string) => {
return (
<View style={styles.ph5}>
<Text style={[styles.textHeadlineH1, styles.mb4]}>Missing page for route</Text>
<Text style={styles.textNormal}>{route}</Text>
</View>
);
};

export default getHelpContent;
91 changes: 91 additions & 0 deletions src/components/SidePane/index.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
import {findFocusedRoute, useNavigationState} from '@react-navigation/native';
import React, {useCallback, useEffect, useRef} from 'react';
// eslint-disable-next-line no-restricted-imports
import {Animated, View} from 'react-native';
import HeaderWithBackButton from '@components/HeaderWithBackButton';
import Backdrop from '@components/Modal/BottomDockedModal/Backdrop';
import ScreenWrapper from '@components/ScreenWrapper';
import useLocalize from '@hooks/useLocalize';
import useResponsiveLayout from '@hooks/useResponsiveLayout';
import useSidePane from '@hooks/useSidePane';
import useThemeStyles from '@hooks/useThemeStyles';
import {triggerSidePane} from '@libs/actions/SidePane';
import Navigation from '@libs/Navigation/Navigation';
import {substituteRouteParameters} from '@libs/SidePaneUtils';
import NAVIGATORS from '@src/NAVIGATORS';
import getHelpContent from './getHelpContent';

function SidePane({shouldShowOverlay = false}: {shouldShowOverlay?: boolean}) {
const styles = useThemeStyles();
const {translate} = useLocalize();

const {isExtraLargeScreenWidth, shouldUseNarrowLayout} = useResponsiveLayout();
const {sidePaneTranslateX, shouldHideSidePane, shouldHideSidePaneBackdrop} = useSidePane();

const {route, isInNarrowPaneModal} = useNavigationState((state) => {
const params = (findFocusedRoute(state)?.params as Record<string, string>) ?? {};
const activeRoute = Navigation.getActiveRouteWithoutParams();
return {route: substituteRouteParameters(activeRoute, params), isInNarrowPaneModal: state.routes.some((r) => r.name === NAVIGATORS.RIGHT_MODAL_NAVIGATOR)};
});

const onClose = useCallback(
(shouldUpdateNarrow = false) => {
triggerSidePane(false, {shouldOnlyUpdateNarrowLayout: !isExtraLargeScreenWidth || shouldUpdateNarrow});
},
[isExtraLargeScreenWidth],
);

const sizeChangedFromLargeToNarrow = useRef(!isExtraLargeScreenWidth);
useEffect(() => {
// Close the side pane when the screen size changes from large to small
if (!isExtraLargeScreenWidth && !sizeChangedFromLargeToNarrow.current) {
onClose(true);
sizeChangedFromLargeToNarrow.current = true;
}

// Reset the trigger when the screen size changes back to large
if (isExtraLargeScreenWidth) {
sizeChangedFromLargeToNarrow.current = false;
}
}, [isExtraLargeScreenWidth, onClose]);

if (shouldHideSidePane) {
return null;
}

return (
<>
<View>
{shouldShowOverlay && !shouldHideSidePaneBackdrop && !isInNarrowPaneModal && (
<Backdrop
onBackdropPress={onClose}
style={styles.sidePaneOverlay}
/>
)}
</View>
<Animated.View style={[styles.sidePaneContainer(shouldUseNarrowLayout, isExtraLargeScreenWidth), {transform: [{translateX: sidePaneTranslateX.current}]}]}>
<ScreenWrapper testID={SidePane.displayName}>
<HeaderWithBackButton
title={translate('common.help')}
style={styles.headerBarDesktopHeight}
onBackButtonPress={() => onClose(false)}
onCloseButtonPress={() => onClose(false)}
shouldShowBackButton={!isExtraLargeScreenWidth}
shouldShowCloseButton={isExtraLargeScreenWidth}
shouldDisplayHelpButton={false}
/>
{getHelpContent(styles, route)}
Copy link
Contributor

@hungvu193 hungvu193 May 29, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The help content depends on route value, while reloading the page, route will briefly become undefined which makes the help content return empty. We had an issue for it here: #62215

And We fixed it here: #62349

</ScreenWrapper>
</Animated.View>
</>
);
}

function SidePaneWithOverlay() {
return <SidePane shouldShowOverlay />;
}

SidePane.displayName = 'SidePane';

export default SidePane;
export {SidePaneWithOverlay, useSidePane as useAnimatedPaddingRight};
2 changes: 2 additions & 0 deletions src/hooks/useResponsiveLayout/index.native.ts
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ export default function useResponsiveLayout(): ResponsiveLayoutResult {
const isSmallScreenWidth = true;
const isMediumScreenWidth = false;
const isLargeScreenWidth = false;
const isExtraLargeScreenWidth = false;
const isExtraSmallScreenWidth = windowWidth <= variables.extraSmallMobileResponsiveWidthBreakpoint;
const isSmallScreen = true;

Expand Down Expand Up @@ -74,5 +75,6 @@ export default function useResponsiveLayout(): ResponsiveLayoutResult {
onboardingIsMediumOrLargerScreenWidth,
isLargeScreenWidth,
isSmallScreen,
isExtraLargeScreenWidth,
};
}
Loading