Skip to content

Commit 8cd20c0

Browse files
committed
Merge branch 'main' into bugfix/kuba_nowakowski/offline-mode-expense-in-unreportedExpenses
2 parents 0254024 + 5aa3ba0 commit 8cd20c0

File tree

97 files changed

+1542
-1392
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

97 files changed

+1542
-1392
lines changed

assets/images/document-merge.svg

Lines changed: 9 additions & 0 deletions
Loading

src/CONST.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1207,6 +1207,7 @@ const CONST = {
12071207
DELETE: 'delete',
12081208
ADD_EXPENSE: 'addExpense',
12091209
REOPEN: 'reopen',
1210+
MOVE_EXPENSE: 'moveExpense',
12101211
},
12111212
PRIMARY_ACTIONS: {
12121213
SUBMIT: 'submit',
@@ -6403,7 +6404,7 @@ const CONST = {
64036404
ACTIVE_WORKSPACE_ID: 'ACTIVE_WORKSPACE_ID',
64046405
RETRY_LAZY_REFRESHED: 'RETRY_LAZY_REFRESHED',
64056406
LAST_REFRESH_TIMESTAMP: 'LAST_REFRESH_TIMESTAMP',
6406-
LAST_VISITED_SETTINGS_TAB_PATH: 'LAST_VISITED_SETTINGS_TAB_PATH',
6407+
LAST_VISITED_WORKSPACES_TAB_PATH: 'LAST_VISITED_WORKSPACES_TAB_PATH',
64076408
},
64086409

64096410
RESERVATION_TYPE: {
@@ -7029,7 +7030,6 @@ const CONST = {
70297030
SCAN_TEST_TOOLTIP_MANAGER: 'scanTestTooltipManager',
70307031
SCAN_TEST_CONFIRMATION: 'scanTestConfirmation',
70317032
OUTSANDING_FILTER: 'outstandingFilter',
7032-
SETTINGS_TAB: 'settingsTab',
70337033
WORKSPACES_SETTINGS: 'workspacesSettings',
70347034
GBR_RBR_CHAT: 'chatGBRRBR',
70357035
ACCOUNT_SWITCHER: 'accountSwitcher',

src/NAVIGATORS.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ export default {
1515
TEST_DRIVE_DEMO_NAVIGATOR: 'TestDriveDemoNavigator',
1616
REPORTS_SPLIT_NAVIGATOR: 'ReportsSplitNavigator',
1717
SETTINGS_SPLIT_NAVIGATOR: 'SettingsSplitNavigator',
18+
WORKSPACE_HUB_SPLIT_NAVIGATOR: 'WorkspaceHubSplitNavigator',
1819
WORKSPACE_SPLIT_NAVIGATOR: 'WorkspaceSplitNavigator',
1920
SEARCH_FULLSCREEN_NAVIGATOR: 'SearchFullscreenNavigator',
2021
SHARE_MODAL_NAVIGATOR: 'ShareModalNavigator',

src/ROUTES.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -696,6 +696,15 @@ const ROUTES = {
696696
getRoute: (action: IOUAction, iouType: IOUType, transactionID: string, reportID: string, backTo = '') =>
697697
getUrlWithBackToParam(`${action as string}/${iouType as string}/report/${transactionID}/${reportID}`, backTo),
698698
},
699+
MONEY_REQUEST_EDIT_REPORT: {
700+
route: ':action/:iouType/report/:reportID/edit',
701+
getRoute: (action: IOUAction, iouType: IOUType, reportID?: string, backTo = '') => {
702+
if (!reportID) {
703+
Log.warn('Invalid reportID while building route MONEY_REQUEST_EDIT_REPORT');
704+
}
705+
return getUrlWithBackToParam(`${action as string}/${iouType as string}/report/${reportID}/edit`, backTo);
706+
},
707+
},
699708
SETTINGS_TAGS_ROOT: {
700709
route: 'settings/:policyID/tags',
701710
getRoute: (policyID: string | undefined, backTo = '') => {
@@ -955,6 +964,7 @@ const ROUTES = {
955964
return `${getUrlWithBackToParam(`settings/workspaces/${policyID}`, backTo)}` as const;
956965
},
957966
},
967+
WORKSPACE_HUB_INITIAL: 'settings/workspace-menu',
958968
WORKSPACE_INVITE: {
959969
route: 'settings/workspaces/:policyID/invite',
960970
getRoute: (policyID: string, backTo?: string) => `${getUrlWithBackToParam(`settings/workspaces/${policyID}/invite`, backTo)}` as const,

src/SCREENS.ts

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,6 @@ const SCREENS = {
7474
SETTINGS: {
7575
ROOT: 'Settings_Root',
7676
SHARE_CODE: 'Settings_Share_Code',
77-
WORKSPACES: 'Settings_Workspaces',
7877
SECURITY: 'Settings_Security',
7978
ABOUT: 'Settings_About',
8079
SAVE_THE_WORLD: 'Settings_TeachersUnite',
@@ -137,16 +136,6 @@ const SCREENS = {
137136
CONFIRM: 'Settings_ExitSurvey_Confirm',
138137
},
139138

140-
SUBSCRIPTION: {
141-
ROOT: 'Settings_Subscription',
142-
SIZE: 'Settings_Subscription_Size',
143-
SETTINGS_DETAILS: 'Settings_Subscription_Details',
144-
ADD_PAYMENT_CARD: 'Settings_Subscription_Add_Payment_Card',
145-
DISABLE_AUTO_RENEW_SURVEY: 'Settings_Subscription_DisableAutoRenewSurvey',
146-
CHANGE_BILLING_CURRENCY: 'Settings_Subscription_Change_Billing_Currency',
147-
CHANGE_PAYMENT_CURRENCY: 'Settings_Subscription_Change_Payment_Currency',
148-
REQUEST_EARLY_CANCELLATION: 'Settings_Subscription_RequestEarlyCancellation',
149-
},
150139
DELEGATE: {
151140
ADD_DELEGATE: 'Settings_Delegate_Add',
152141
DELEGATE_ROLE: 'Settings_Delegate_Role',
@@ -266,6 +255,7 @@ const SCREENS = {
266255
STEP_TIME_EDIT: 'Money_Request_Time_Edit',
267256
STEP_SUBRATE_EDIT: 'Money_Request_SubRate_Edit',
268257
STEP_REPORT: 'Money_Request_Report',
258+
EDIT_REPORT: 'Money_Request_Edit_Report',
269259
},
270260

271261
TRANSACTION_DUPLICATE: {
@@ -364,7 +354,21 @@ const SCREENS = {
364354
},
365355

366356
WORKSPACE_CONFIRMATION: {ROOT: 'Workspace_Confirmation_Root'},
357+
WORKSPACE_HUB: {
358+
ROOT: 'Workspace_Hub_Root',
359+
WORKSPACES: 'Workspace_List',
367360

361+
SUBSCRIPTION: {
362+
ROOT: 'Settings_Subscription',
363+
SIZE: 'Settings_Subscription_Size',
364+
SETTINGS_DETAILS: 'Settings_Subscription_Details',
365+
ADD_PAYMENT_CARD: 'Settings_Subscription_Add_Payment_Card',
366+
DISABLE_AUTO_RENEW_SURVEY: 'Settings_Subscription_DisableAutoRenewSurvey',
367+
CHANGE_BILLING_CURRENCY: 'Settings_Subscription_Change_Billing_Currency',
368+
CHANGE_PAYMENT_CURRENCY: 'Settings_Subscription_Change_Payment_Currency',
369+
REQUEST_EARLY_CANCELLATION: 'Settings_Subscription_RequestEarlyCancellation',
370+
},
371+
},
368372
WORKSPACE: {
369373
ACCOUNTING: {
370374
ROOT: 'Policy_Accounting',

src/components/FloatingActionButton.tsx

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ import Svg, {Path} from 'react-native-svg';
88
import useResponsiveLayout from '@hooks/useResponsiveLayout';
99
import useTheme from '@hooks/useTheme';
1010
import useThemeStyles from '@hooks/useThemeStyles';
11-
import getPlatform from '@libs/getPlatform';
1211
import useIsHomeRouteActive from '@navigation/helpers/useIsHomeRouteActive';
1312
import variables from '@styles/variables';
1413
import CONST from '@src/CONST';
@@ -47,8 +46,6 @@ function FloatingActionButton({onPress, isActive, accessibilityLabel, role, isTo
4746
const borderRadius = styles.floatingActionButton.borderRadius;
4847
const fabPressable = useRef<HTMLDivElement | View | Text | null>(null);
4948
const {shouldUseNarrowLayout} = useResponsiveLayout();
50-
const platform = getPlatform();
51-
const isNarrowScreenOnWeb = shouldUseNarrowLayout && platform === CONST.PLATFORM.WEB;
5249
const [isSidebarLoaded] = useOnyx(ONYXKEYS.IS_SIDEBAR_LOADED, {initialValue: false, canBeMissing: true});
5350
const isHomeRouteActive = useIsHomeRouteActive(shouldUseNarrowLayout);
5451
const {renderProductTrainingTooltip, shouldShowProductTrainingTooltip, hideProductTrainingTooltip} = useProductTrainingContext(
@@ -95,10 +92,10 @@ function FloatingActionButton({onPress, isActive, accessibilityLabel, role, isTo
9592
<EducationalTooltip
9693
shouldRender={shouldShowProductTrainingTooltip}
9794
anchorAlignment={{
98-
horizontal: isNarrowScreenOnWeb ? CONST.MODAL.ANCHOR_ORIGIN_HORIZONTAL.CENTER : tooltipHorizontalAnchorAlignment,
95+
horizontal: shouldUseNarrowLayout ? CONST.MODAL.ANCHOR_ORIGIN_HORIZONTAL.CENTER : tooltipHorizontalAnchorAlignment,
9996
vertical: CONST.MODAL.ANCHOR_ORIGIN_VERTICAL.BOTTOM,
10097
}}
101-
shiftHorizontal={isNarrowScreenOnWeb ? 0 : tooltipShiftHorizontal}
98+
shiftHorizontal={shouldUseNarrowLayout ? 0 : tooltipShiftHorizontal}
10299
renderTooltipContent={renderProductTrainingTooltip}
103100
wrapperStyle={styles.productTrainingTooltipWrapper}
104101
shouldHideOnNavigate={false}

src/components/FocusTrap/WIDE_LAYOUT_INACTIVE_SCREENS.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,8 @@ const WIDE_LAYOUT_INACTIVE_SCREENS: string[] = [
1313
SCREENS.SETTINGS.SECURITY,
1414
SCREENS.SETTINGS.WALLET.ROOT,
1515
SCREENS.SETTINGS.ABOUT,
16-
SCREENS.SETTINGS.WORKSPACES,
17-
SCREENS.SETTINGS.SUBSCRIPTION.ROOT,
16+
SCREENS.WORKSPACE_HUB.WORKSPACES,
17+
SCREENS.WORKSPACE_HUB.SUBSCRIPTION.ROOT,
1818
SCREENS.WORKSPACE.ACCOUNTING.ROOT,
1919
SCREENS.WORKSPACE.INITIAL,
2020
SCREENS.WORKSPACE.PROFILE,

src/components/Icon/Expensicons.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@ import CreditCardExclamation from '@assets/images/credit-card-exclamation.svg';
6969
import CreditCardHourglass from '@assets/images/credit-card-hourglass.svg';
7070
import CreditCard from '@assets/images/creditcard.svg';
7171
import Crosshair from '@assets/images/crosshair.svg';
72+
import DocumentMerge from '@assets/images/document-merge.svg';
7273
import DocumentPlus from '@assets/images/document-plus.svg';
7374
import DocumentSlash from '@assets/images/document-slash.svg';
7475
import Document from '@assets/images/document.svg';
@@ -280,6 +281,7 @@ export {
280281
DeletedRoomAvatar,
281282
Document,
282283
DocumentSlash,
284+
DocumentMerge,
283285
DomainRoomAvatar,
284286
DotIndicator,
285287
DotIndicatorUnfilled,

src/components/Indicator.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
import React from 'react';
22
import {StyleSheet, View} from 'react-native';
3-
import useIndicatorStatus from '@hooks/useIndicatorStatus';
3+
import useAccountTabIndicatorStatus from '@hooks/useAccountTabIndicatorStatus';
44
import useThemeStyles from '@hooks/useThemeStyles';
55

66
function Indicator() {
77
const styles = useThemeStyles();
8-
const {indicatorColor, status} = useIndicatorStatus();
8+
const {indicatorColor, status} = useAccountTabIndicatorStatus();
99

1010
const indicatorStyles = [styles.alignItemsCenter, styles.justifyContentCenter, styles.statusIndicator(indicatorColor)];
1111

src/components/MoneyReportHeader.tsx

Lines changed: 34 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import {ActivityIndicator, View} from 'react-native';
44
import type {OnyxEntry} from 'react-native-onyx';
55
import {useOnyx} from 'react-native-onyx';
66
import type {ValueOf} from 'type-fest';
7+
import useActiveRoute from '@hooks/useActiveRoute';
78
import useLocalize from '@hooks/useLocalize';
89
import useMobileSelectionMode from '@hooks/useMobileSelectionMode';
910
import useNetwork from '@hooks/useNetwork';
@@ -38,9 +39,10 @@ import {
3839
hasUpdatedTotal,
3940
isAllowedToApproveExpenseReport,
4041
isExported as isExportedUtils,
41-
isInvoiceReport,
42+
isInvoiceReport as isInvoiceReportUtil,
4243
isProcessingReport,
4344
isReportOwner,
45+
isTrackExpenseReport as isTrackExpenseReportUtil,
4446
navigateToDetailsPage,
4547
reportTransactionsSelector,
4648
} from '@libs/ReportUtils';
@@ -133,6 +135,7 @@ function MoneyReportHeader({policy, report: moneyRequestReport, transactionThrea
133135
const {shouldUseNarrowLayout, isSmallScreenWidth, isMediumScreenWidth} = useResponsiveLayout();
134136
const shouldDisplayNarrowVersion = shouldUseNarrowLayout || isMediumScreenWidth;
135137
const route = useRoute();
138+
const {getReportRHPActiveRoute} = useActiveRoute();
136139
// eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing
137140
const [chatReport] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT}${moneyRequestReport?.chatReportID}`, {canBeMissing: true});
138141
// eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing
@@ -222,6 +225,20 @@ function MoneyReportHeader({policy, report: moneyRequestReport, transactionThrea
222225
[moneyRequestReport, chatReport, policy, transaction],
223226
);
224227

228+
const isInvoiceReport = isInvoiceReportUtil(moneyRequestReport);
229+
const isTrackExpenseReport = isTrackExpenseReportUtil(moneyRequestReport);
230+
231+
const iouType = useMemo(() => {
232+
if (isTrackExpenseReport) {
233+
return CONST.IOU.TYPE.TRACK;
234+
}
235+
if (isInvoiceReport) {
236+
return CONST.IOU.TYPE.INVOICE;
237+
}
238+
239+
return CONST.IOU.TYPE.SUBMIT;
240+
}, [isTrackExpenseReport, isInvoiceReport]);
241+
225242
const [isDownloadErrorModalVisible, setIsDownloadErrorModalVisible] = useState(false);
226243

227244
const {selectedTransactionsID, setSelectedTransactionsID} = useMoneyRequestReportContext();
@@ -290,15 +307,15 @@ function MoneyReportHeader({policy, report: moneyRequestReport, transactionThrea
290307
setIsNoDelegateAccessMenuVisible(true);
291308
} else if (isAnyTransactionOnHold) {
292309
setIsHoldMenuVisible(true);
293-
} else if (isInvoiceReport(moneyRequestReport)) {
310+
} else if (isInvoiceReport) {
294311
startAnimation();
295312
payInvoice(type, chatReport, moneyRequestReport, payAsBusiness, methodID, paymentMethod);
296313
} else {
297314
startAnimation();
298315
payMoneyRequest(type, chatReport, moneyRequestReport, true);
299316
}
300317
},
301-
[chatReport, isAnyTransactionOnHold, isDelegateAccessRestricted, moneyRequestReport, startAnimation],
318+
[chatReport, isAnyTransactionOnHold, isDelegateAccessRestricted, isInvoiceReport, moneyRequestReport, startAnimation],
302319
);
303320

304321
const confirmApproval = () => {
@@ -701,6 +718,20 @@ function MoneyReportHeader({policy, report: moneyRequestReport, transactionThrea
701718
Navigation.navigate(ROUTES.REPORT_WITH_ID_CHANGE_WORKSPACE.getRoute(moneyRequestReport.reportID));
702719
},
703720
},
721+
[CONST.REPORT.SECONDARY_ACTIONS.MOVE_EXPENSE]: {
722+
text: translate('iou.moveExpenses', {count: 1}),
723+
icon: Expensicons.DocumentMerge,
724+
value: CONST.REPORT.SECONDARY_ACTIONS.MOVE_EXPENSE,
725+
onSelected: () => {
726+
if (!moneyRequestReport || !transaction) {
727+
return;
728+
}
729+
730+
Navigation.navigate(
731+
ROUTES.MONEY_REQUEST_STEP_REPORT.getRoute(CONST.IOU.ACTION.EDIT, iouType, transaction.transactionID, moneyRequestReport.reportID, getReportRHPActiveRoute()),
732+
);
733+
},
734+
},
704735
[CONST.REPORT.SECONDARY_ACTIONS.DELETE]: {
705736
text: translate('common.delete'),
706737
icon: Expensicons.Trashcan,

src/components/MoneyRequestReportView/MoneyRequestReportTransactionList.tsx

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -124,28 +124,27 @@ function MoneyRequestReportTransactionList({report, transactions, reportActions,
124124

125125
const {sortBy, sortOrder} = sortConfig;
126126

127-
const newTransactionID = useMemo(() => {
127+
const newTransactionsID = useMemo(() => {
128128
if (!prevTransactions || transactions.length === prevTransactions.length) {
129129
return CONST.EMPTY_ARRAY as unknown as string[];
130130
}
131131

132-
return transactions
133-
.filter((transaction) => !prevTransactions.some((prevTransaction) => prevTransaction.transactionID === transaction.transactionID))
134-
.reduce((latest, t) => {
135-
const inserted = t?.inserted ?? 0;
136-
const latestInserted = latest?.inserted ?? 0;
137-
return inserted > latestInserted ? t : latest;
138-
}, transactions.at(0))?.transactionID;
132+
return transactions.reduce((acc, t) => {
133+
if (!prevTransactions.some((prevTransaction) => prevTransaction.transactionID === t.transactionID)) {
134+
acc.push(t.transactionID);
135+
}
136+
return acc;
137+
}, [] as string[]);
139138
}, [prevTransactions, transactions]);
140139

141140
const sortedTransactions: TransactionWithOptionalHighlight[] = useMemo(() => {
142141
return [...transactions]
143142
.sort((a, b) => compareValues(a[getTransactionKey(a, sortBy)], b[getTransactionKey(b, sortBy)], sortOrder, sortBy))
144143
.map((transaction) => ({
145144
...transaction,
146-
shouldBeHighlighted: newTransactionID === transaction.transactionID,
145+
shouldBeHighlighted: newTransactionsID?.includes(transaction.transactionID),
147146
}));
148-
}, [newTransactionID, sortBy, sortOrder, transactions]);
147+
}, [newTransactionsID, sortBy, sortOrder, transactions]);
149148

150149
const navigateToTransaction = useCallback(
151150
(activeTransaction: OnyxTypes.Transaction) => {

src/components/MoneyRequestReportView/MoneyRequestReportView.tsx

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ import getNonEmptyStringOnyxID from '@libs/getNonEmptyStringOnyxID';
1818
import Log from '@libs/Log';
1919
import {selectAllTransactionsForReport, shouldDisplayReportTableView} from '@libs/MoneyRequestReportUtils';
2020
import navigationRef from '@libs/Navigation/navigationRef';
21-
import {getOneTransactionThreadReportID, isDeletedParentAction, isMoneyRequestAction} from '@libs/ReportActionsUtils';
21+
import {getFilteredReportActionsForReportView, getOneTransactionThreadReportID, isMoneyRequestAction} from '@libs/ReportActionsUtils';
2222
import {canEditReportAction, getReportOfflinePendingActionAndErrors, isReportTransactionThread} from '@libs/ReportUtils';
2323
import {buildCannedSearchQuery} from '@libs/SearchQueryUtils';
2424
import Navigation from '@navigation/Navigation';
@@ -95,8 +95,9 @@ function MoneyRequestReportView({report, policy, reportMetadata, shouldDisplayRe
9595
const [isComposerFullSize] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT_IS_COMPOSER_FULL_SIZE}${reportID}`, {initialValue: false, canBeMissing: true});
9696
const {reportPendingAction, reportErrors} = getReportOfflinePendingActionAndErrors(report);
9797

98-
const {reportActions: reportActionsWithDeletedExpenses, hasNewerActions, hasOlderActions} = usePaginatedReportActions(reportID);
99-
const reportActions = reportActionsWithDeletedExpenses.filter((value) => !isDeletedParentAction(value));
98+
const {reportActions: unfilteredReportActions, hasNewerActions, hasOlderActions} = usePaginatedReportActions(reportID);
99+
const reportActions = getFilteredReportActionsForReportView(unfilteredReportActions);
100+
100101
const transactionThreadReportID = getOneTransactionThreadReportID(reportID, reportActions ?? [], isOffline);
101102

102103
const [transactions = []] = useOnyx(ONYXKEYS.COLLECTION.TRANSACTION, {

src/components/Navigation/DebugTabView.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,7 @@ function DebugTabView({selectedTab, chatTabBrickRoad, activeWorkspaceID}: DebugT
117117
return 'debug.indicatorStatus.theresAReportWithErrors';
118118
}
119119
}
120-
if (selectedTab === NAVIGATION_TABS.SETTINGS) {
120+
if (selectedTab === NAVIGATION_TABS.SETTINGS || selectedTab === NAVIGATION_TABS.WORKSPACES) {
121121
return getSettingsMessage(status);
122122
}
123123
}, [selectedTab, chatTabBrickRoad, status]);
@@ -131,7 +131,7 @@ function DebugTabView({selectedTab, chatTabBrickRoad, activeWorkspaceID}: DebugT
131131
return theme.danger;
132132
}
133133
}
134-
if (selectedTab === NAVIGATION_TABS.SETTINGS) {
134+
if (selectedTab === NAVIGATION_TABS.SETTINGS || selectedTab === NAVIGATION_TABS.WORKSPACES) {
135135
if (status) {
136136
return indicatorColor;
137137
}
@@ -155,7 +155,7 @@ function DebugTabView({selectedTab, chatTabBrickRoad, activeWorkspaceID}: DebugT
155155
}
156156
}, [selectedTab, chatTabBrickRoad, activeWorkspaceID, orderedReports, status, reimbursementAccount, policyIDWithErrors]);
157157

158-
if (!([NAVIGATION_TABS.HOME, NAVIGATION_TABS.SETTINGS] as string[]).includes(selectedTab ?? '') || !indicator) {
158+
if (!([NAVIGATION_TABS.HOME, NAVIGATION_TABS.SETTINGS, NAVIGATION_TABS.WORKSPACES] as string[]).includes(selectedTab ?? '') || !indicator) {
159159
return null;
160160
}
161161

src/components/Navigation/NavigationTabBar/NAVIGATION_TABS.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
const NAVIGATION_TABS = {
22
HOME: 'HOME',
33
SEARCH: 'SEARCH',
4+
WORKSPACES: 'WORKSPACES',
45
SETTINGS: 'SETTINGS',
56
} as const;
67

0 commit comments

Comments
 (0)