\ No newline at end of file
diff --git a/docs/_sass/_main.scss b/docs/_sass/_main.scss
index cfdf4ff3a2bc..e05f7d4c08ea 100644
--- a/docs/_sass/_main.scss
+++ b/docs/_sass/_main.scss
@@ -458,6 +458,26 @@ button {
opacity: 0.8;
}
}
+
+ .info {
+ padding: 12px;
+ border-radius: 8px;
+ background-color: $color-highlightBG;
+ color: $color-text;
+ display: flex;
+ gap: 12px;
+ align-items: center;
+
+ img {
+ height: 16px;
+ width: 16px;
+ }
+
+ * {
+ padding: 0;
+ margin: 0;
+ }
+ }
}
}
diff --git a/docs/assets/images/info.svg b/docs/assets/images/info.svg
new file mode 100644
index 000000000000..96924fbb6cf7
--- /dev/null
+++ b/docs/assets/images/info.svg
@@ -0,0 +1,9 @@
+
diff --git a/ios/NewExpensify.xcodeproj/project.pbxproj b/ios/NewExpensify.xcodeproj/project.pbxproj
index 41f53a0b8f7d..5d3bf1c07985 100644
--- a/ios/NewExpensify.xcodeproj/project.pbxproj
+++ b/ios/NewExpensify.xcodeproj/project.pbxproj
@@ -615,6 +615,7 @@
"${PODS_CONFIGURATION_BUILD_DIR}/Airship/AirshipPreferenceCenterResources.bundle",
"${PODS_CONFIGURATION_BUILD_DIR}/GoogleSignIn/GoogleSignIn.bundle",
"${PODS_CONFIGURATION_BUILD_DIR}/React-Core/RCTI18nStrings.bundle",
+ "${PODS_ROOT}/../../node_modules/@expensify/react-native-live-markdown/parser/react-native-live-markdown-parser.js",
);
name = "[CP] Copy Pods Resources";
outputPaths = (
@@ -625,6 +626,7 @@
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/AirshipPreferenceCenterResources.bundle",
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/GoogleSignIn.bundle",
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/RCTI18nStrings.bundle",
+ "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/react-native-live-markdown-parser.js",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
@@ -784,6 +786,7 @@
"${PODS_CONFIGURATION_BUILD_DIR}/Airship/AirshipPreferenceCenterResources.bundle",
"${PODS_CONFIGURATION_BUILD_DIR}/GoogleSignIn/GoogleSignIn.bundle",
"${PODS_CONFIGURATION_BUILD_DIR}/React-Core/RCTI18nStrings.bundle",
+ "${PODS_ROOT}/../../node_modules/@expensify/react-native-live-markdown/parser/react-native-live-markdown-parser.js",
);
name = "[CP] Copy Pods Resources";
outputPaths = (
@@ -794,6 +797,7 @@
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/AirshipPreferenceCenterResources.bundle",
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/GoogleSignIn.bundle",
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/RCTI18nStrings.bundle",
+ "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/react-native-live-markdown-parser.js",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
diff --git a/ios/NewExpensify/Info.plist b/ios/NewExpensify/Info.plist
index 341edd0c9dfe..e6affbb6db34 100644
--- a/ios/NewExpensify/Info.plist
+++ b/ios/NewExpensify/Info.plist
@@ -40,7 +40,7 @@
CFBundleVersion
-
1.4.35.0
+
1.4.35.4
ITSAppUsesNonExemptEncryption
LSApplicationQueriesSchemes
diff --git a/ios/NewExpensifyTests/Info.plist b/ios/NewExpensifyTests/Info.plist
index 6b39db8b2f27..4f46e8c52a85 100644
--- a/ios/NewExpensifyTests/Info.plist
+++ b/ios/NewExpensifyTests/Info.plist
@@ -19,6 +19,6 @@
CFBundleSignature
????
CFBundleVersion
-
1.4.35.0
+
1.4.35.4
diff --git a/ios/NotificationServiceExtension/Info.plist b/ios/NotificationServiceExtension/Info.plist
index ff9b56d72408..228eede8c92f 100644
--- a/ios/NotificationServiceExtension/Info.plist
+++ b/ios/NotificationServiceExtension/Info.plist
@@ -13,7 +13,7 @@
CFBundleShortVersionString
1.4.35
CFBundleVersion
-
1.4.35.0
+
1.4.35.4
NSExtension
NSExtensionPointIdentifier
diff --git a/ios/Podfile.lock b/ios/Podfile.lock
index c3a0a534d9b4..584dd5636773 100644
--- a/ios/Podfile.lock
+++ b/ios/Podfile.lock
@@ -1178,6 +1178,10 @@ PODS:
- React-Core
- react-native-launch-arguments (4.0.2):
- React
+ - react-native-live-markdown (0.1.0):
+ - glog
+ - RCT-Folly (= 2022.05.16.00)
+ - React-Core
- react-native-netinfo (11.2.1):
- React-Core
- react-native-pager-view (6.2.2):
@@ -1525,6 +1529,7 @@ DEPENDENCIES:
- react-native-image-picker (from `../node_modules/react-native-image-picker`)
- react-native-key-command (from `../node_modules/react-native-key-command`)
- react-native-launch-arguments (from `../node_modules/react-native-launch-arguments`)
+ - "react-native-live-markdown (from `../node_modules/@expensify/react-native-live-markdown`)"
- "react-native-netinfo (from `../node_modules/@react-native-community/netinfo`)"
- react-native-pager-view (from `../node_modules/react-native-pager-view`)
- react-native-pdf (from `../node_modules/react-native-pdf`)
@@ -1720,6 +1725,8 @@ EXTERNAL SOURCES:
:path: "../node_modules/react-native-key-command"
react-native-launch-arguments:
:path: "../node_modules/react-native-launch-arguments"
+ react-native-live-markdown:
+ :path: "../node_modules/@expensify/react-native-live-markdown"
react-native-netinfo:
:path: "../node_modules/@react-native-community/netinfo"
react-native-pager-view:
@@ -1915,6 +1922,7 @@ SPEC CHECKSUMS:
react-native-image-picker: c33d4e79f0a14a2b66e5065e14946ae63749660b
react-native-key-command: 5af6ee30ff4932f78da6a2109017549042932aa5
react-native-launch-arguments: 5f41e0abf88a15e3c5309b8875d6fd5ac43df49d
+ react-native-live-markdown: 1ca4275d4dba8eebb736a005148f24a8224f54d9
react-native-netinfo: 8a7fd3f7130ef4ad2fb4276d5c9f8d3f28d2df3d
react-native-pager-view: 02a5c4962530f7efc10dd51ee9cdabeff5e6c631
react-native-pdf: b4ca3d37a9a86d9165287741c8b2ef4d8940c00e
diff --git a/package-lock.json b/package-lock.json
index acadf891d8d7..358cc7f79c62 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,16 +1,17 @@
{
"name": "new.expensify",
- "version": "1.4.35-0",
+ "version": "1.4.35-4",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "new.expensify",
- "version": "1.4.35-0",
+ "version": "1.4.35-4",
"hasInstallScript": true,
"license": "MIT",
"dependencies": {
"@dotlottie/react-player": "^1.6.3",
+ "@expensify/react-native-live-markdown": "git+ssh://git@github.com/Expensify/react-native-live-markdown.git#c316611781f19815caebfed5540e0faf2a274785",
"@expo/metro-runtime": "~3.1.1",
"@formatjs/intl-datetimeformat": "^6.10.0",
"@formatjs/intl-getcanonicallocales": "^2.2.0",
@@ -3349,6 +3350,22 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "node_modules/@expensify/react-native-live-markdown": {
+ "version": "0.1.0",
+ "resolved": "git+ssh://git@github.com/Expensify/react-native-live-markdown.git#c316611781f19815caebfed5540e0faf2a274785",
+ "integrity": "sha512-yF3oaBhqWQonl12LPELYLsgfmqCsGg2bu15g/h8XzVX3f/nzfPtrWE/ax2lWEIpIjk4/+aEu/VGNKLnlehjTxQ==",
+ "license": "MIT",
+ "workspaces": [
+ "example"
+ ],
+ "engines": {
+ "node": ">= 18.0.0"
+ },
+ "peerDependencies": {
+ "react": "*",
+ "react-native": "*"
+ }
+ },
"node_modules/@expo/bunyan": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/@expo/bunyan/-/bunyan-4.0.0.tgz",
@@ -44854,8 +44871,6 @@
},
"node_modules/react-native-flipper": {
"version": "0.159.0",
- "resolved": "https://gitpkg.now.sh/facebook/flipper/react-native/react-native-flipper?9cacc9b59402550eae866e0e81e5f0c2f8203e6b",
- "integrity": "sha512-M784S/qPuN/HqjdvXg98HIDmfm0sF8mACc56YNg87nzEF90zKSKp0XyOE83SEW+UJX2Gq/rf9BvM2GZeXlrhnQ==",
"dev": true,
"license": "MIT",
"peer": true,
diff --git a/package.json b/package.json
index bdbdb27dbf59..e6e81e12c943 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "new.expensify",
- "version": "1.4.35-0",
+ "version": "1.4.35-4",
"author": "Expensify, Inc.",
"homepage": "https://new.expensify.com",
"description": "New Expensify is the next generation of Expensify: a reimagination of payments based atop a foundation of chat.",
@@ -59,6 +59,7 @@
},
"dependencies": {
"@dotlottie/react-player": "^1.6.3",
+ "@expensify/react-native-live-markdown": "git+ssh://git@github.com/Expensify/react-native-live-markdown.git#c316611781f19815caebfed5540e0faf2a274785",
"@expo/metro-runtime": "~3.1.1",
"@formatjs/intl-datetimeformat": "^6.10.0",
"@formatjs/intl-getcanonicallocales": "^2.2.0",
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