diff --git a/assets/images/cards-and-domains.svg b/assets/images/cards-and-domains.svg
new file mode 100644
index 000000000000..4467ad4cf222
--- /dev/null
+++ b/assets/images/cards-and-domains.svg
@@ -0,0 +1,5 @@
+
diff --git a/assets/images/home.svg b/assets/images/home.svg
new file mode 100644
index 000000000000..6b2411407be7
--- /dev/null
+++ b/assets/images/home.svg
@@ -0,0 +1,3 @@
+
diff --git a/assets/images/new-expensify.svg b/assets/images/new-expensify.svg
index 7bfef1fd38b4..89102ecbc5e4 100644
--- a/assets/images/new-expensify.svg
+++ b/assets/images/new-expensify.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
diff --git a/assets/images/wrench.svg b/assets/images/wrench.svg
new file mode 100644
index 000000000000..2865c40eb952
--- /dev/null
+++ b/assets/images/wrench.svg
@@ -0,0 +1,10 @@
+
diff --git a/patches/@react-navigation+stack+6.3.16+002+dontDetachScreen.patch b/patches/@react-navigation+stack+6.3.16+002+dontDetachScreen.patch
index d64fc4fecf74..877521094cd4 100644
--- a/patches/@react-navigation+stack+6.3.16+002+dontDetachScreen.patch
+++ b/patches/@react-navigation+stack+6.3.16+002+dontDetachScreen.patch
@@ -43,7 +43,7 @@ index 7558eb3..b7bb75e 100644
}) : STATE_TRANSITIONING_OR_BELOW_TOP;
}
+
-+ const isHomeScreenAndNotOnTop = route.name === 'Home' && isScreenActive !== STATE_ON_TOP;
++ const isHomeScreenAndNotOnTop = (route.name === 'BottomTabNavigator' || route.name === 'Settings_Root') && isScreenActive !== STATE_ON_TOP;
+
const {
headerShown = true,
diff --git a/src/App.js b/src/App.js
index 3553900bbc7f..8045f4eb30ad 100644
--- a/src/App.js
+++ b/src/App.js
@@ -6,6 +6,7 @@ import Onyx from 'react-native-onyx';
import {PickerStateProvider} from 'react-native-picker-select';
import {SafeAreaProvider} from 'react-native-safe-area-context';
import '../wdyr';
+import ActiveWorkspaceContextProvider from './components/ActiveWorkspace/ActiveWorkspaceProvider';
import ColorSchemeWrapper from './components/ColorSchemeWrapper';
import ComposeProviders from './components/ComposeProviders';
import CustomStatusBarAndBackground from './components/CustomStatusBarAndBackground';
@@ -69,6 +70,7 @@ function App() {
PickerStateProvider,
EnvironmentProvider,
CustomStatusBarAndBackgroundContextProvider,
+ ActiveWorkspaceContextProvider,
]}
>
diff --git a/src/CONST.ts b/src/CONST.ts
index f434aa281866..69933a623bed 100755
--- a/src/CONST.ts
+++ b/src/CONST.ts
@@ -490,6 +490,8 @@ const CONST = {
// Use Environment.getEnvironmentURL to get the complete URL with port number
DEV_NEW_EXPENSIFY_URL: 'https://dev.new.expensify.com:',
OLDDOT_URLS: {
+ ADMIN_POLICIES_URL: 'admin_policies',
+ ADMIN_DOMAINS_URL: 'admin_domains',
INBOX: 'inbox',
},
@@ -1013,6 +1015,7 @@ const CONST = {
3: 100,
},
},
+ CENTRAL_PANE_ANIMATION_HEIGHT: 200,
LHN_SKELETON_VIEW_ITEM_HEIGHT: 64,
EXPENSIFY_PARTNER_NAME: 'expensify.com',
EMAIL: {
@@ -1331,6 +1334,7 @@ const CONST = {
REIMBURSEMENT_MANUAL: 'reimburseManual',
},
ID_FAKE: '_FAKE_',
+ EMPTY: 'EMPTY',
},
CUSTOM_UNITS: {
@@ -1481,6 +1485,10 @@ const CONST = {
OTHER_INVISIBLE_CHARACTERS: /[\u3164]/g,
REPORT_FIELD_TITLE: /{report:([a-zA-Z]+)}/g,
+
+ PATH_WITHOUT_POLICY_ID: /\/w\/[a-zA-Z0-9]+(\/|$)/,
+
+ POLICY_ID_FROM_PATH: /\/w\/([a-zA-Z0-9]+)(\/|$)/,
},
PRONOUNS: {
@@ -1490,7 +1498,7 @@ const CONST = {
GUIDES_CALL_TASK_IDS: {
CONCIERGE_DM: 'NewExpensifyConciergeDM',
WORKSPACE_INITIAL: 'WorkspaceHome',
- WORKSPACE_SETTINGS: 'WorkspaceGeneralSettings',
+ WORKSPACE_OVERVIEW: 'WorkspaceOverview',
WORKSPACE_CARD: 'WorkspaceCorporateCards',
WORKSPACE_REIMBURSE: 'WorkspaceReimburseReceipts',
WORKSPACE_BILLS: 'WorkspacePayBills',
@@ -3102,11 +3110,6 @@ const CONST = {
CAROUSEL: 3,
},
- BRICK_ROAD: {
- GBR: 'GBR',
- RBR: 'RBR',
- },
-
/**
* Constants for types of violations.
* Defined here because they need to be referenced by the type system to generate the
@@ -3165,6 +3168,12 @@ const CONST = {
MINI_CONTEXT_MENU_MAX_ITEMS: 4,
+ WORKSPACE_SWITCHER: {
+ NAME: 'Expensify',
+ SUBSCRIPT_ICON_SIZE: 8,
+ MINIMUM_WORKSPACES_TO_SHOW_SEARCH: 8,
+ },
+
REPORT_FIELD_TITLE_FIELD_ID: 'text_title',
} as const;
diff --git a/src/Expensify.js b/src/Expensify.js
index 12003968b284..dfb59a0f8848 100644
--- a/src/Expensify.js
+++ b/src/Expensify.js
@@ -62,7 +62,8 @@ const propTypes = {
/** Whether a new update is available and ready to install. */
updateAvailable: PropTypes.bool,
- /** Tells us if the sidebar has rendered */
+ /** Tells us if the sidebar has rendered - TODO: We don't use it as temporary solution to fix not hidding splashscreen */
+ // eslint-disable-next-line react/no-unused-prop-types
isSidebarLoaded: PropTypes.bool,
/** Information about a screen share call requested by a GuidesPlus agent */
@@ -83,6 +84,9 @@ const propTypes = {
/** Whether we should display the notification alerting the user that focus mode has been auto-enabled */
focusModeNotification: PropTypes.bool,
+ /** Last visited path in the app */
+ lastVisitedPath: PropTypes.string,
+
...withLocalizePropTypes,
};
@@ -97,6 +101,7 @@ const defaultProps = {
isCheckingPublicRoom: true,
updateRequired: false,
focusModeNotification: false,
+ lastVisitedPath: undefined,
};
const SplashScreenHiddenContext = React.createContext({});
@@ -107,6 +112,7 @@ function Expensify(props) {
const [isOnyxMigrated, setIsOnyxMigrated] = useState(false);
const [isSplashHidden, setIsSplashHidden] = useState(false);
const [hasAttemptedToOpenPublicRoom, setAttemptedToOpenPublicRoom] = useState(false);
+ const [initialUrl, setInitialUrl] = useState(null);
useEffect(() => {
if (props.isCheckingPublicRoom) {
@@ -125,7 +131,7 @@ function Expensify(props) {
[isSplashHidden],
);
- const shouldInit = isNavigationReady && (!isAuthenticated || props.isSidebarLoaded) && hasAttemptedToOpenPublicRoom;
+ const shouldInit = isNavigationReady && hasAttemptedToOpenPublicRoom;
const shouldHideSplash = shouldInit && !isSplashHidden;
const initializeClient = () => {
@@ -187,6 +193,7 @@ function Expensify(props) {
// If the app is opened from a deep link, get the reportID (if exists) from the deep link and navigate to the chat report
Linking.getInitialURL().then((url) => {
+ setInitialUrl(url);
Report.openReportFromDeepLink(url, isAuthenticated);
});
@@ -247,6 +254,8 @@ function Expensify(props) {
)}
@@ -286,6 +295,9 @@ export default compose(
key: ONYXKEYS.FOCUS_MODE_NOTIFICATION,
initWithStoredValues: false,
},
+ lastVisitedPath: {
+ key: ONYXKEYS.LAST_VISITED_PATH,
+ },
}),
)(Expensify);
diff --git a/src/NAVIGATORS.ts b/src/NAVIGATORS.ts
index c68a950d3501..3bc9c5e57b9b 100644
--- a/src/NAVIGATORS.ts
+++ b/src/NAVIGATORS.ts
@@ -4,6 +4,7 @@
* */
export default {
CENTRAL_PANE_NAVIGATOR: 'CentralPaneNavigator',
+ BOTTOM_TAB_NAVIGATOR: 'BottomTabNavigator',
LEFT_MODAL_NAVIGATOR: 'LeftModalNavigator',
RIGHT_MODAL_NAVIGATOR: 'RightModalNavigator',
FULL_SCREEN_NAVIGATOR: 'FullScreenNavigator',
diff --git a/src/ONYXKEYS.ts b/src/ONYXKEYS.ts
index 2867cb3905a2..88b740e0e6c8 100755
--- a/src/ONYXKEYS.ts
+++ b/src/ONYXKEYS.ts
@@ -243,6 +243,9 @@ const ONYXKEYS = {
// Max width supported for HTML