Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
79c5adc
Add Vendors tab to Workspace settings (Phase 1: name column only)
Beamanator Jul 14, 2026
f6a5d12
Address Codex review: admin gate + wide-layout focus trap exemption
Beamanator Jul 14, 2026
4d184b9
Address Codex review: Intacct pre-sync gate + read-only vendor rows
Beamanator Jul 14, 2026
de45732
Address Codex review: prefetch connections for Vendors gate
Beamanator Jul 15, 2026
a9f0095
Address Codex review: fetch connections for direct-URL access to Vendors
Beamanator Jul 15, 2026
2ab6b5b
Address Codex review: wait for fetch flag to hydrate before refetching
Beamanator Jul 15, 2026
90fa1fd
Address Codex review: skip connections fetch while offline, retry on …
Beamanator Jul 15, 2026
33c6455
Address Codex review: gate connections prefetch on admin
Beamanator Jul 15, 2026
5072eec
Address Codex review: use login-aware admin check
Beamanator Jul 15, 2026
8c47fcf
Merge remote-tracking branch 'origin/main' into beaman-vendors-tab
Beamanator Jul 15, 2026
acb2c17
Loosen Vendors tab access to read-only roles (Auditor et al.)
Beamanator Jul 15, 2026
0ad9d17
Fix Oxfmt: sort import order in WorkspaceInitialPage.tsx
Beamanator Jul 15, 2026
92181ca
Address Codex review: loosen prefetch gate to match menu-row gate
Beamanator Jul 15, 2026
21d7c86
Extract usePolicyConnectionsPrefetch hook shared by withPolicyConnect…
Beamanator Jul 15, 2026
28a7f46
Merge remote-tracking branch 'origin/main' into beaman-vendors-tab
Beamanator Jul 15, 2026
ec0dfdb
Merge remote-tracking branch 'origin/main' into beaman-vendors-tab
Beamanator Jul 16, 2026
a666286
Fix Oxfmt: restore AuthScreensInitHandler formatting lost in merge fr…
Beamanator Jul 16, 2026
acd0897
Fix Oxfmt: reformat AuthScreensInitHandler to match pinned oxfmt@0.55.0
Beamanator Jul 16, 2026
30a06c1
Redesign Vendors page to match Jenna's mock: table layout + subtitle
Beamanator Jul 17, 2026
5af593f
Refactor Vendors page to follow workspace-table convention
Beamanator Jul 17, 2026
e53412f
Fix Knip: drop unused WorkspaceVendorTableColumnKey type export
Beamanator Jul 17, 2026
0405c51
Sort vendors alphabetically in the page; drop Name-column sort arrow
Beamanator Jul 17, 2026
3926fc5
Restore sortable Name column on the Vendors table
Beamanator Jul 17, 2026
2124bfd
Swap Vendors tab icon to briefcase (Suitcase) to match Jenna's mock
Beamanator Jul 17, 2026
c2a45d4
Use illustrations.Luggage for the Vendors page header icon
Beamanator Jul 17, 2026
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
2 changes: 2 additions & 0 deletions src/CONST/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3972,6 +3972,7 @@ const CONST = {
EXPENSIFY_CARD: 'expensifyCard',
COMPANY_CARDS: 'companyCards',
CATEGORIES: 'categories',
VENDORS: 'vendors',
TAGS: 'tags',
TAXES: 'taxes',
RULES: 'rules',
Expand Down Expand Up @@ -8736,6 +8737,7 @@ const CONST = {
TIME_TRACKING: 'WorkspaceInitial-TimeTracking',
INVOICES: 'WorkspaceInitial-Invoices',
MORE_FEATURES: 'WorkspaceInitial-MoreFeatures',
VENDORS: 'WorkspaceInitial-Vendors',
},
OVERVIEW: {
AVATAR: 'WorkspaceOverview-Avatar',
Expand Down
9 changes: 9 additions & 0 deletions src/ROUTES.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2640,6 +2640,15 @@ const ROUTES = {
return `workspaces/${policyID}/categories` as const;
},
},
WORKSPACE_VENDORS: {
route: 'workspaces/:policyID/vendors',
getRoute: (policyID: string | undefined) => {
if (!policyID) {
Log.warn('Invalid policyID is used to build the WORKSPACE_VENDORS route');
}
return `workspaces/${policyID}/vendors` as const;
},
},
WORKSPACE_UPGRADE: {
route: 'workspaces/:policyID?/upgrade/:featureName?',
getRoute: (policyID?: string, featureName?: string, backTo?: string, reportID?: string, upgradePlanType?: string) => {
Expand Down
1 change: 1 addition & 0 deletions src/SCREENS.ts
Original file line number Diff line number Diff line change
Expand Up @@ -758,6 +758,7 @@ const SCREENS = {
DYNAMIC_WORKSPACE_INVITE_MESSAGE_ROLE: 'Dynamic_Workspace_Invite_Message_Role',
INVITE_MESSAGE_APPROVER: 'Workspace_Invite_Message_Approver',
CATEGORIES: 'Workspace_Categories',
VENDORS: 'Workspace_Vendors',
TAGS: 'Workspace_Tags',
DYNAMIC_TAGS_SETTINGS: 'Dynamic_Tags_Settings',
DYNAMIC_TAGS_EDIT: 'Dynamic_Tags_Edit',
Expand Down
1 change: 1 addition & 0 deletions src/components/FocusTrap/WIDE_LAYOUT_INACTIVE_SCREENS.ts
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ const WIDE_LAYOUT_INACTIVE_SCREENS: string[] = [
SCREENS.WORKSPACE.MEMBERS,
SCREENS.WORKSPACE.HR,
SCREENS.WORKSPACE.CATEGORIES,
SCREENS.WORKSPACE.VENDORS,
SCREENS.WORKSPACE.MORE_FEATURES,
SCREENS.WORKSPACE.TAGS,
SCREENS.WORKSPACE.TAXES,
Expand Down
90 changes: 90 additions & 0 deletions src/components/Tables/WorkspaceVendorsTable/index.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
import type {CompareItemsCallback, IsItemInSearchCallback, TableColumn, TableData} from '@components/Table';
import Table from '@components/Table';
import TextWithTooltip from '@components/TextWithTooltip';

import useLocalize from '@hooks/useLocalize';
import useThemeStyles from '@hooks/useThemeStyles';

import tokenizedSearch from '@libs/tokenizedSearch';

import CONST from '@src/CONST';

import type {ListRenderItemInfo} from '@shopify/flash-list';

import React from 'react';
import {View} from 'react-native';

type WorkspaceVendorTableColumnKey = 'name';

type WorkspaceVendorTableRowData = TableData & {
name: string;
};

type WorkspaceVendorsTableProps = {
vendors: WorkspaceVendorTableRowData[];
};

function WorkspaceVendorsTable({vendors}: WorkspaceVendorsTableProps) {
const styles = useThemeStyles();
const {translate, localeCompare} = useLocalize();

const columns: Array<TableColumn<WorkspaceVendorTableColumnKey>> = [
{
key: 'name',
label: translate('common.name'),
sortable: true,
},
];

const compareItems: CompareItemsCallback<WorkspaceVendorTableRowData> = (item1, item2, activeSorting) => {
const orderMultiplier = activeSorting.order === 'asc' ? 1 : -1;
return localeCompare(item1.name, item2.name) * orderMultiplier;
};

const isItemInSearch: IsItemInSearchCallback<WorkspaceVendorTableRowData> = (item, searchValue) => {
const results = tokenizedSearch([item], searchValue.toLowerCase(), (option) => [option.name]);
return results.length > 0;
};

const renderVendorItem = ({item, index}: ListRenderItemInfo<WorkspaceVendorTableRowData>) => (
<Table.Row
interactive={false}
rowIndex={index}
sentryLabel={CONST.SENTRY_LABEL.WORKSPACE.INITIAL.VENDORS}
>
<View style={[styles.flex1, styles.flexRow, styles.alignItemsCenter]}>
<TextWithTooltip
shouldShowTooltip
numberOfLines={1}
text={item.name}
/>
</View>
</Table.Row>
);

return (
<Table
data={vendors}
initialSortColumn="name"
title={translate('workspace.common.vendors')}
columns={columns}
compareItems={compareItems}
isItemInSearch={isItemInSearch}
renderItem={renderVendorItem}
keyExtractor={(item) => item.keyForList}
>
<Table.FilterBar label={translate('workspace.vendors.findVendor')} />
<Table.EmptyState
title={translate('workspace.vendors.emptyTitle')}
subtitleText={translate('workspace.vendors.emptySubtitle')}
/>
<Table.NoResultsState />
<Table.Header />
<Table.Body />
</Table>
);
}

export default WorkspaceVendorsTable;

export type {WorkspaceVendorTableRowData};
47 changes: 47 additions & 0 deletions src/hooks/usePolicyConnectionsPrefetch.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
import {openPolicyAccountingPage} from '@libs/actions/PolicyConnections';

import ONYXKEYS from '@src/ONYXKEYS';
import type * as OnyxTypes from '@src/types/onyx';
import {isEmptyObject} from '@src/types/utils/EmptyObject';
import isLoadingOnyxValue from '@src/types/utils/isLoadingOnyxValue';

import type {OnyxEntry} from 'react-native-onyx';

import {useEffect} from 'react';

import useNetwork from './useNetwork';
import useOnyx from './useOnyx';

type PrefetchState = {
isFetchNeeded: boolean;
isLoadingFetchedFlag: boolean;
hasBeenFetched: boolean | undefined;
};

/**
* Fetches `policy.connections` lazily for a non-active workspace. `withPolicyConnections`
* uses this to hydrate connections before rendering an accounting-adjacent page, and callers
* that need the connection data without wrapping (e.g. `WorkspaceInitialPage` deciding whether
* to render the Vendors row) pass a scoped `enabled` gate to opt in.
*
* The hook itself only bails on the shared safety guards — Onyx flag still hydrating, offline,
* no policy loaded, no accounting/connections on the policy, already fetched — that need to
* stay in sync across callers so callers don't reinvent them.
*/
function usePolicyConnectionsPrefetch(policy: OnyxEntry<OnyxTypes.Policy>, enabled: boolean): PrefetchState {
const {isOffline} = useNetwork();
const [hasBeenFetched, hasBeenFetchedResult] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY_HAS_CONNECTIONS_DATA_BEEN_FETCHED}${policy?.id}`);
const isLoadingFetchedFlag = isLoadingOnyxValue(hasBeenFetchedResult);
const isFetchNeeded = enabled && !isLoadingFetchedFlag && !isOffline && !!policy && (!!policy.areConnectionsEnabled || !isEmptyObject(policy.connections)) && !hasBeenFetched;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

I think we should add 1 more condition hasVendorFeature(policy, beta) to avoid redundant prefetch for user that has areConnectionsEnabled (no vendor matching)


useEffect(() => {
if (!isFetchNeeded || !policy?.id) {
return;
}
openPolicyAccountingPage(policy.id);
}, [policy?.id, isFetchNeeded]);

return {isFetchNeeded, isLoadingFetchedFlag, hasBeenFetched};
}

export default usePolicyConnectionsPrefetch;
7 changes: 7 additions & 0 deletions src/languages/de.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4453,6 +4453,7 @@ ${amount} für ${merchant} – ${date}`,
delete: 'Arbeitsbereich löschen',
settings: 'Einstellungen',
categories: 'Kategorien',
vendors: 'Lieferanten',
tags: 'Tags',
customField1: 'Benutzerdefiniertes Feld 1',
customField2: 'Benutzerdefiniertes Feld 2',
Expand Down Expand Up @@ -6284,6 +6285,12 @@ _Für ausführlichere Anweisungen [besuchen Sie unsere Hilfeseite](${CONST.NETSU
reportFieldInitialValueRequiredError: 'Bitte wähle einen Anfangswert für ein Berichtsfeld aus',
genericFailureMessage: 'Beim Aktualisieren des Berichtfelds ist ein Fehler aufgetreten. Bitte versuche es erneut.',
},
vendors: {
emptyTitle: 'Noch keine Lieferanten',
emptySubtitle: 'Lieferanten werden hier angezeigt, sobald Ihre Buchhaltungssynchronisierung abgeschlossen ist.',
findVendor: 'Anbieter finden',
managedInAccountingSoftware: 'Lieferanten werden in Ihrer/Ihrem verwaltet',
},
tags: {
tagName: 'Tag-Name',
requiresTag: 'Mitglieder müssen alle Ausgaben taggen',
Expand Down
7 changes: 7 additions & 0 deletions src/languages/en.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4548,6 +4548,7 @@ const translations = {
delete: 'Delete workspace',
settings: 'Settings',
categories: 'Categories',
vendors: 'Vendors',
tags: 'Tags',
customField1: 'Custom field 1',
customField2: 'Custom field 2',
Expand Down Expand Up @@ -6365,6 +6366,12 @@ const translations = {
reportFieldInitialValueRequiredError: 'Please choose a report field initial value',
genericFailureMessage: 'An error occurred while updating the report field. Please try again.',
},
vendors: {
emptyTitle: 'No vendors yet',
emptySubtitle: 'Vendors will appear here after your accounting sync completes.',
findVendor: 'Find vendor',
managedInAccountingSoftware: 'Vendors are managed in your',
},
tags: {
tagName: 'Tag name',
requiresTag: 'Members must tag all expenses',
Expand Down
7 changes: 7 additions & 0 deletions src/languages/es.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4320,6 +4320,7 @@ ${amount} para ${merchant} - ${date}`,
delete: 'Eliminar espacio de trabajo',
settings: 'Configuración',
categories: 'Categorías',
vendors: 'Proveedores',
tags: 'Etiquetas',
customField1: 'Campo personalizado 1',
customField2: 'Campo personalizado 2',
Expand Down Expand Up @@ -6109,6 +6110,12 @@ ${amount} para ${merchant} - ${date}`,
reportFieldInitialValueRequiredError: 'Elige un valor inicial de campo de informe',
genericFailureMessage: 'Se ha producido un error al actualizar el campo de informe. Por favor, inténtalo de nuevo.',
},
vendors: {
emptyTitle: 'Aún no hay proveedores',
emptySubtitle: 'Los proveedores aparecerán aquí cuando se complete la sincronización de contabilidad.',
findVendor: 'Buscar proveedor',
managedInAccountingSoftware: 'Los proveedores se gestionan en tu',
},
tags: {
tagName: 'Nombre de etiqueta',
requiresTag: 'Los miembros deben etiquetar todos los gastos',
Expand Down
7 changes: 7 additions & 0 deletions src/languages/fr.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4463,6 +4463,7 @@ ${amount} pour ${merchant} - ${date}`,
delete: 'Supprimer l’espace de travail',
settings: 'Paramètres',
categories: 'Catégories',
vendors: 'Fournisseurs',
tags: 'Tags',
customField1: 'Champ personnalisé 1',
customField2: 'Champ personnalisé 2',
Expand Down Expand Up @@ -6311,6 +6312,12 @@ _Pour des instructions plus détaillées, [visitez notre site d’aide](${CONST.
reportFieldInitialValueRequiredError: 'Veuillez choisir une valeur initiale pour le champ de note de frais',
genericFailureMessage: 'Une erreur s’est produite lors de la mise à jour du champ de note de frais. Veuillez réessayer.',
},
vendors: {
emptyTitle: 'Aucun fournisseur pour le moment',
emptySubtitle: 'Les fournisseurs apparaîtront ici une fois la synchronisation comptable terminée.',
findVendor: 'Trouver un fournisseur',
managedInAccountingSoftware: 'Les fournisseurs sont gérés dans votre',
},
tags: {
tagName: 'Nom du tag',
requiresTag: 'Les membres doivent taguer toutes les dépenses',
Expand Down
7 changes: 7 additions & 0 deletions src/languages/it.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4438,6 +4438,7 @@ ${amount} per ${merchant} - ${date}`,
delete: 'Elimina spazio di lavoro',
settings: 'Impostazioni',
categories: 'Categorie',
vendors: 'Fornitori',
tags: 'Tag',
customField1: 'Campo personalizzato 1',
customField2: 'Campo personalizzato 2',
Expand Down Expand Up @@ -6272,6 +6273,12 @@ _Per istruzioni più dettagliate, [visita il nostro sito di assistenza](${CONST.
reportFieldInitialValueRequiredError: 'Scegli un valore iniziale per il campo del resoconto',
genericFailureMessage: 'Si è verificato un errore durante l’aggiornamento del campo del report. Riprova.',
},
vendors: {
emptyTitle: 'Nessun fornitore ancora',
emptySubtitle: 'I fornitori verranno visualizzati qui al termine della sincronizzazione contabile.',
findVendor: 'Trova fornitore',
managedInAccountingSoftware: 'I fornitori vengono gestiti nel tuo',
},
tags: {
tagName: 'Nome tag',
requiresTag: 'I membri devono etichettare tutte le spese',
Expand Down
7 changes: 7 additions & 0 deletions src/languages/ja.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4402,6 +4402,7 @@ ${integrationName === CONST.ONBOARDING_ACCOUNTING_MAPPING.other ? 'あなたの'
delete: 'ワークスペースを削除',
settings: '設定',
categories: 'カテゴリ',
vendors: '仕入先',
tags: 'タグ',
customField1: 'カスタムフィールド1',
customField2: 'カスタムフィールド2',
Expand Down Expand Up @@ -6191,6 +6192,12 @@ _詳しい手順については、[ヘルプサイトをご覧ください](${CO
reportFieldInitialValueRequiredError: 'レポート項目の初期値を選択してください',
genericFailureMessage: 'レポートフィールドの更新中にエラーが発生しました。もう一度お試しください。',
},
vendors: {
emptyTitle: '取引先はまだありません',
emptySubtitle: '会計同期が完了すると、ここにベンダーが表示されます。',
findVendor: '取引先を検索',
managedInAccountingSoftware: '仕入先は次の場所で管理されます:',
},
tags: {
tagName: 'タグ名',
requiresTag: 'メンバーはすべての経費にタグを付ける必要があります',
Expand Down
7 changes: 7 additions & 0 deletions src/languages/nl.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4433,6 +4433,7 @@ ${amount} voor ${merchant} - ${date}`,
delete: 'Werkruimte verwijderen',
settings: 'Instellingen',
categories: 'Categorieën',
vendors: 'Leveranciers',
tags: 'Tags',
customField1: 'Aangepast veld 1',
customField2: 'Aangepast veld 2',
Expand Down Expand Up @@ -6254,6 +6255,12 @@ _Voor meer gedetailleerde instructies, [bezoek onze help-site](${CONST.NETSUITE_
reportFieldInitialValueRequiredError: 'Kies een beginwaarde voor een rapportveld',
genericFailureMessage: 'Er is een fout opgetreden bij het bijwerken van het rapportveld. Probeer het opnieuw.',
},
vendors: {
emptyTitle: 'Nog geen leveranciers',
emptySubtitle: 'Leveranciers verschijnen hier nadat je accounting-synchronisatie is voltooid.',
findVendor: 'Leverancier zoeken',
managedInAccountingSoftware: 'Leveranciers worden beheerd in je',
},
tags: {
tagName: 'Tagnaam',
requiresTag: 'Leden moeten alle uitgaven taggen',
Expand Down
7 changes: 7 additions & 0 deletions src/languages/pl.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4419,6 +4419,7 @@ ${amount} dla ${merchant} - ${date}`,
delete: 'Usuń przestrzeń roboczą',
settings: 'Ustawienia',
categories: 'Kategorie',
vendors: 'Dostawcy',
tags: 'Tagi',
customField1: 'Niestandardowe pole 1',
customField2: 'Niestandardowe pole 2',
Expand Down Expand Up @@ -6235,6 +6236,12 @@ _Aby uzyskać bardziej szczegółowe instrukcje, [odwiedź naszą stronę pomocy
reportFieldInitialValueRequiredError: 'Wybierz początkową wartość pola raportu',
genericFailureMessage: 'Wystąpił błąd podczas aktualizowania pola raportu. Spróbuj ponownie.',
},
vendors: {
emptyTitle: 'Brak dostawców',
emptySubtitle: 'Dostawcy pojawią się tutaj po zakończeniu synchronizacji księgowej.',
findVendor: 'Znajdź dostawcę',
managedInAccountingSoftware: 'Dostawcy są zarządzani w twoim',
},
tags: {
tagName: 'Nazwa tagu',
requiresTag: 'Członkowie muszą otagować wszystkie wydatki',
Expand Down
7 changes: 7 additions & 0 deletions src/languages/pt-BR.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4423,6 +4423,7 @@ ${amount} para ${merchant} - ${date}`,
delete: 'Excluir workspace',
settings: 'Configurações',
categories: 'Categorias',
vendors: 'Fornecedores',
tags: 'Tags',
customField1: 'Campo personalizado 1',
customField2: 'Campo personalizado 2',
Expand Down Expand Up @@ -6247,6 +6248,12 @@ _Para instruções mais detalhadas, [visite nossa central de ajuda](${CONST.NETS
reportFieldInitialValueRequiredError: 'Escolha um valor inicial para o campo de relatório',
genericFailureMessage: 'Ocorreu um erro ao atualizar o campo do relatório. Tente novamente.',
},
vendors: {
emptyTitle: 'Ainda não há fornecedores',
emptySubtitle: 'Os fornecedores vão aparecer aqui depois que a sua sincronização contábil for concluída.',
findVendor: 'Encontrar fornecedor',
managedInAccountingSoftware: 'Fornecedores são gerenciados na sua',
},
tags: {
tagName: 'Nome da tag',
requiresTag: 'Membros devem marcar todas as despesas',
Expand Down
2 changes: 2 additions & 0 deletions src/languages/zh-hans.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4311,6 +4311,7 @@ ${amount},商户:${merchant} - 日期:${date}`,
delete: '删除工作区',
settings: '设置',
categories: '类别',
vendors: '供应商',
tags: '标签',
customField1: '自定义字段 1',
customField2: '自定义字段 2',
Expand Down Expand Up @@ -6067,6 +6068,7 @@ _如需更详细的说明,请[访问我们的帮助网站](${CONST.NETSUITE_IM
reportFieldInitialValueRequiredError: '请选择报表字段的初始值',
genericFailureMessage: '更新报表字段时出错。请重试。',
},
vendors: {emptyTitle: '尚无供应商', emptySubtitle: '会计同步完成后,供应商将显示在此处。', findVendor: '查找供应商', managedInAccountingSoftware: '供应商由您在以下位置管理:'},
tags: {
tagName: '标签名称',
requiresTag: '成员必须为所有报销添加标签',
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ const CENTRAL_PANE_WORKSPACE_SCREENS = {
[SCREENS.WORKSPACE.ACCOUNTING.ROOT]: () => require<ReactComponentModule>('../../../../pages/workspace/accounting/PolicyAccountingPage').default,
[SCREENS.WORKSPACE.HR]: () => require<ReactComponentModule>('../../../../pages/workspace/hr/WorkspaceHRPage').default,
[SCREENS.WORKSPACE.CATEGORIES]: () => require<ReactComponentModule>('../../../../pages/workspace/categories/WorkspaceCategoriesPage').default,
[SCREENS.WORKSPACE.VENDORS]: () => require<ReactComponentModule>('../../../../pages/workspace/vendors/WorkspaceVendorsPage').default,
Comment thread
Beamanator marked this conversation as resolved.
[SCREENS.WORKSPACE.MORE_FEATURES]: () => require<ReactComponentModule>('../../../../pages/workspace/WorkspaceMoreFeaturesPage').default,
[SCREENS.WORKSPACE.TAGS]: () => require<ReactComponentModule>('../../../../pages/workspace/tags/WorkspaceTagsPage').default,
[SCREENS.WORKSPACE.TAXES]: () => require<ReactComponentModule>('../../../../pages/workspace/taxes/WorkspaceTaxesPage').default,
Expand Down
Loading
Loading