From 3e9270b7ebc438ba15497a946ac0b5105d7e5cc3 Mon Sep 17 00:00:00 2001 From: rory Date: Fri, 7 Jul 2023 15:36:01 -0700 Subject: [PATCH 001/555] Make the same files without crazy git diff --- package-lock.json | 13 +++ package.json | 1 + scripts/AggregateGitHubDataFromUpwork.js | 105 +++++++++++++++++++++++ 3 files changed, 119 insertions(+) create mode 100644 scripts/AggregateGitHubDataFromUpwork.js diff --git a/package-lock.json b/package-lock.json index bc8aade90b76..cfe6e401c585 100644 --- a/package-lock.json +++ b/package-lock.json @@ -142,6 +142,7 @@ "concurrently": "^5.3.0", "copy-webpack-plugin": "^6.4.1", "css-loader": "^6.7.2", + "csv-writer": "^1.6.0", "diff-so-fancy": "^1.3.0", "dotenv": "^16.0.3", "electron": "22.3.14", @@ -21382,6 +21383,12 @@ "version": "3.1.1", "license": "MIT" }, + "node_modules/csv-writer": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/csv-writer/-/csv-writer-1.6.0.tgz", + "integrity": "sha512-NOx7YDFWEsM/fTRAJjRpPp8t+MKRVvniAg9wQlUKx20MFrPs73WLJhFf5iteqrxNYnsy924K3Iroh3yNHeYd2g==", + "dev": true + }, "node_modules/currently-unhandled": { "version": "0.4.1", "dev": true, @@ -58148,6 +58155,12 @@ "csstype": { "version": "3.1.1" }, + "csv-writer": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/csv-writer/-/csv-writer-1.6.0.tgz", + "integrity": "sha512-NOx7YDFWEsM/fTRAJjRpPp8t+MKRVvniAg9wQlUKx20MFrPs73WLJhFf5iteqrxNYnsy924K3Iroh3yNHeYd2g==", + "dev": true + }, "currently-unhandled": { "version": "0.4.1", "dev": true, diff --git a/package.json b/package.json index 9ccdca875ddc..42c8f197dac1 100644 --- a/package.json +++ b/package.json @@ -179,6 +179,7 @@ "concurrently": "^5.3.0", "copy-webpack-plugin": "^6.4.1", "css-loader": "^6.7.2", + "csv-writer": "^1.6.0", "diff-so-fancy": "^1.3.0", "dotenv": "^16.0.3", "electron": "22.3.14", diff --git a/scripts/AggregateGitHubDataFromUpwork.js b/scripts/AggregateGitHubDataFromUpwork.js new file mode 100644 index 000000000000..21d991e1a545 --- /dev/null +++ b/scripts/AggregateGitHubDataFromUpwork.js @@ -0,0 +1,105 @@ +/* + * To run this script from the root of E/App: + * + * node ./scripts/AggregateGitHubDataFromUpwork.js + */ + +/* eslint-disable no-console, @lwc/lwc/no-async-await, no-restricted-syntax, no-await-in-loop */ +const _ = require('underscore'); +const fs = require('fs'); +const {GitHub, getOctokitOptions} = require('@actions/github/lib/utils'); +const {throttling} = require('@octokit/plugin-throttling'); +const {paginateRest} = require('@octokit/plugin-paginate-rest'); +const createCsvWriter = require('csv-writer').createObjectCsvWriter; + +const csvWriter = createCsvWriter({ + path: 'output.csv', + header: [ + {id: 'number', title: 'number'}, + {id: 'title', title: 'title'}, + {id: 'labels', title: 'labels'}, + {id: 'type', title: 'type'}, + ], +}); + +if (process.argv.length < 3) { + throw new Error('Error: must provide filepath for CSV data'); +} + +if (process.argv.length < 4) { + throw new Error('Error: must provide GitHub token'); +} + +// Get filepath for csv +const filepath = process.argv[2]; + +// Get data from csv +let issues = _.filter(fs.readFileSync(filepath).toString().split('\n'), (issue) => !_.isEmpty(issue)); + +// Skip header row +issues = issues.slice(1); + +// Get GitHub token +const token = process.argv[3].trim(); +const Octokit = GitHub.plugin(throttling, paginateRest); +const octokit = new Octokit( + getOctokitOptions(token, { + throttle: { + onRateLimit: (retryAfter, options) => { + console.warn(`Request quota exhausted for request ${options.method} ${options.url}`); + + // Retry once after hitting a rate limit error, then give up + if (options.request.retryCount <= 1) { + console.log(`Retrying after ${retryAfter} seconds!`); + return true; + } + }, + onAbuseLimit: (retryAfter, options) => { + // does not retry, only logs a warning + console.warn(`Abuse detected for request ${options.method} ${options.url}`); + }, + }, + }), +).rest; + +function getType(labels) { + if (_.contains(labels, 'Bug')) { + return 'bug'; + } + if (_.contains(labels, 'NewFeature')) { + return 'feature'; + } + return 'other'; +} + +async function getGitHubData() { + const gitHubData = []; + for (const issueNumber of issues) { + const num = issueNumber.trim(); + console.info(`Fetching ${num}`); + const result = await octokit.issues + .get({ + owner: 'Expensify', + repo: 'App', + issue_number: num, + }) + .catch(() => { + console.warn(`Error getting issue ${num}`); + }); + if (result) { + const issue = result.data; + const labels = _.map(issue.labels, (label) => label.name); + gitHubData.push({ + number: issue.number, + title: issue.title, + labels, + type: getType(labels), + }); + } + } + return gitHubData; +} + +getGitHubData() + .then((gitHubData) => csvWriter.writeRecords(gitHubData)) + .then(() => console.info('Done ✅ Wrote file to output.csv')); From cb1be523c0d5e8f139a29bd482add784decac732 Mon Sep 17 00:00:00 2001 From: rory Date: Tue, 9 Apr 2024 11:42:57 -0700 Subject: [PATCH 002/555] Add project check --- scripts/AggregateGitHubDataFromUpwork.js | 28 ++++++++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) diff --git a/scripts/AggregateGitHubDataFromUpwork.js b/scripts/AggregateGitHubDataFromUpwork.js index 21d991e1a545..9409e430c5ac 100644 --- a/scripts/AggregateGitHubDataFromUpwork.js +++ b/scripts/AggregateGitHubDataFromUpwork.js @@ -60,7 +60,7 @@ const octokit = new Octokit( }, }, }), -).rest; +); function getType(labels) { if (_.contains(labels, 'Bug')) { @@ -77,7 +77,7 @@ async function getGitHubData() { for (const issueNumber of issues) { const num = issueNumber.trim(); console.info(`Fetching ${num}`); - const result = await octokit.issues + const result = await octokit.rest.issues .get({ owner: 'Expensify', repo: 'App', @@ -89,11 +89,35 @@ async function getGitHubData() { if (result) { const issue = result.data; const labels = _.map(issue.labels, (label) => label.name); + const type = getType(labels); + let capSWProjects = []; + if (type === 'NewFeature') { + // eslint-disable-next-line rulesdir/prefer-underscore-method + capSWProjects = await octokit + .graphql( + ` + { + repository(owner: "Expensify", name: "App") { + issue(number: 39322) { + projectsV2(last: 30) { + nodes { + title + } + } + } + } + } + `, + ) + .repository.issue.projectsV2.nodes.map((node) => node.title) + .join(','); + } gitHubData.push({ number: issue.number, title: issue.title, labels, type: getType(labels), + capSWProjects, }); } } From 97b6c82050ab3abc1e0372ececfb37b2b2893c44 Mon Sep 17 00:00:00 2001 From: rory Date: Tue, 9 Jul 2024 09:47:07 -0700 Subject: [PATCH 003/555] Update package-lock.json --- package-lock.json | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/package-lock.json b/package-lock.json index 36cb2639ec4f..276408dcbee1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -209,6 +209,7 @@ "copy-webpack-plugin": "^10.1.0", "css-loader": "^6.7.2", "csv-parse": "^5.5.5", + "csv-writer": "^1.6.0", "diff-so-fancy": "^1.3.0", "dotenv": "^16.0.3", "electron": "^29.4.1", @@ -23198,6 +23199,12 @@ "integrity": "sha512-erCk7tyU3yLWAhk6wvKxnyPtftuy/6Ak622gOO7BCJ05+TYffnPCJF905wmOQm+BpkX54OdAl8pveJwUdpnCXQ==", "dev": true }, + "node_modules/csv-writer": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/csv-writer/-/csv-writer-1.6.0.tgz", + "integrity": "sha512-NOx7YDFWEsM/fTRAJjRpPp8t+MKRVvniAg9wQlUKx20MFrPs73WLJhFf5iteqrxNYnsy924K3Iroh3yNHeYd2g==", + "dev": true + }, "node_modules/dag-map": { "version": "1.0.2", "license": "MIT" From f1d220020b92666c071210a7f84fd5537798db4e Mon Sep 17 00:00:00 2001 From: Adam Horodyski Date: Tue, 30 Jul 2024 14:52:57 +0200 Subject: [PATCH 004/555] fix: improve perf of isActionOfType by limiting calls to the includes --- src/libs/ReportActionsUtils.ts | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/libs/ReportActionsUtils.ts b/src/libs/ReportActionsUtils.ts index 8e9926648c2c..10b6de73b136 100644 --- a/src/libs/ReportActionsUtils.ts +++ b/src/libs/ReportActionsUtils.ts @@ -189,7 +189,14 @@ function isActionOfType( ): action is { [K in keyof T]: ReportAction; }[number] { - return actionNames.includes(action?.actionName as T[number]); + const actionName = action?.actionName as T[number]; + + // This is purely a performance optimization to limit the 'includes()' calls on Hermes + if (actionNames.length === 1) { + return actionNames[0] === actionName; + } + + return actionNames.includes(actionName); } function getOriginalMessage(reportAction: OnyxInputOrEntry>): OriginalMessage | undefined { From 6381821f5f11920a4904669d13f6b4b92807cc19 Mon Sep 17 00:00:00 2001 From: Adam Horodyski Date: Mon, 5 Aug 2024 11:48:28 +0200 Subject: [PATCH 005/555] feat(wip): draft the import-onyx-state perf debug functionality --- src/Expensify.tsx | 6 ++ src/languages/en.ts | 1 + src/languages/es.ts | 1 + .../Troubleshoot/TroubleshootPage.tsx | 84 +++++++++++++++++++ 4 files changed, 92 insertions(+) diff --git a/src/Expensify.tsx b/src/Expensify.tsx index f9fd379d94ce..df77595b4322 100644 --- a/src/Expensify.tsx +++ b/src/Expensify.tsx @@ -15,6 +15,7 @@ import SplashScreenHider from './components/SplashScreenHider'; import UpdateAppModal from './components/UpdateAppModal'; import CONST from './CONST'; import useLocalize from './hooks/useLocalize'; +import * as App from './libs/actions/App'; import * as EmojiPickerAction from './libs/actions/EmojiPickerAction'; import * as Report from './libs/actions/Report'; import * as User from './libs/actions/User'; @@ -52,6 +53,11 @@ Onyx.registerLogger(({level, message}) => { } }); +// This is supposed to restart to the initial state +Onyx.clear(App.KEYS_TO_PRESERVE).then(() => { + App.openApp(); +}); + type ExpensifyOnyxProps = { /** Whether the app is waiting for the server's response to determine if a room is public */ isCheckingPublicRoom: OnyxEntry; diff --git a/src/languages/en.ts b/src/languages/en.ts index 32b9a9eff2b6..5cb41871dc45 100755 --- a/src/languages/en.ts +++ b/src/languages/en.ts @@ -1007,6 +1007,7 @@ export default { destroy: 'Destroy', maskExportOnyxStateData: 'Mask fragile user data while exporting Onyx state', exportOnyxState: 'Export Onyx state', + importOnyxState: 'Import Onyx state', }, debugConsole: { saveLog: 'Save log', diff --git a/src/languages/es.ts b/src/languages/es.ts index 1636512a6fa4..2bf825970e47 100644 --- a/src/languages/es.ts +++ b/src/languages/es.ts @@ -1014,6 +1014,7 @@ export default { destroy: 'Destruir', maskExportOnyxStateData: 'Enmascare los datos frágiles del usuario mientras exporta el estado Onyx', exportOnyxState: 'Exportar estado Onyx', + importOnyxState: 'Importar estado Onyx', }, debugConsole: { saveLog: 'Guardar registro', diff --git a/src/pages/settings/Troubleshoot/TroubleshootPage.tsx b/src/pages/settings/Troubleshoot/TroubleshootPage.tsx index 2ec8ac1e54a0..e8b0e49d9367 100644 --- a/src/pages/settings/Troubleshoot/TroubleshootPage.tsx +++ b/src/pages/settings/Troubleshoot/TroubleshootPage.tsx @@ -1,8 +1,11 @@ import React, {useCallback, useMemo, useState} from 'react'; import {View} from 'react-native'; +import RNFS from 'react-native-fs'; import Onyx, {withOnyx} from 'react-native-onyx'; import type {OnyxEntry} from 'react-native-onyx'; import type {SvgProps} from 'react-native-svg'; +import AttachmentPicker from '@components/AttachmentPicker'; +import Button from '@components/Button'; import ClientSideLoggingToolMenu from '@components/ClientSideLoggingToolMenu'; import ConfirmModal from '@components/ConfirmModal'; import HeaderWithBackButton from '@components/HeaderWithBackButton'; @@ -25,14 +28,45 @@ import useThemeStyles from '@hooks/useThemeStyles'; import useWaitForNavigation from '@hooks/useWaitForNavigation'; import {setShouldMaskOnyxState} from '@libs/actions/MaskOnyx'; import ExportOnyxState from '@libs/ExportOnyxState'; +import localFileDownload from '@libs/localFileDownload'; import Navigation from '@libs/Navigation/Navigation'; import * as App from '@userActions/App'; +import * as Network from '@userActions/Network'; import * as Report from '@userActions/Report'; import type {TranslationPaths} from '@src/languages/types'; import ONYXKEYS from '@src/ONYXKEYS'; import ROUTES from '@src/ROUTES'; import getLightbulbIllustrationStyle from './getLightbulbIllustrationStyle'; +// List of Onyx keys from the .txt file we want to keep for the local override +const keysToInclude = [ + ONYXKEYS.COLLECTION.REPORT, + ONYXKEYS.COLLECTION.REPORT_METADATA, + ONYXKEYS.COLLECTION.REPORT_NAME_VALUE_PAIRS, + ONYXKEYS.COLLECTION.REPORT_VIOLATIONS, + ONYXKEYS.COLLECTION.REPORT_ACTIONS, + ONYXKEYS.COLLECTION.REPORT_ACTIONS_PAGES, + ONYXKEYS.COLLECTION.REPORT_ACTIONS_REACTIONS, + ONYXKEYS.COLLECTION.TRANSACTION, + ONYXKEYS.COLLECTION.TRANSACTION_VIOLATIONS, + ONYXKEYS.COLLECTION.POLICY, + ONYXKEYS.COLLECTION.POLICY_CATEGORIES, + ONYXKEYS.COLLECTION.POLICY_TAGS, + ONYXKEYS.COLLECTION.POLICY_RECENTLY_USED_TAGS, + ONYXKEYS.COLLECTION.POLICY_RECENTLY_USED_CATEGORIES, + ONYXKEYS.PERSONAL_DETAILS_LIST, + ONYXKEYS.PRIVATE_PERSONAL_DETAILS, + ONYXKEYS.ACCOUNT, + ONYXKEYS.SESSION, + ONYXKEYS.WALLET_TRANSFER, + ONYXKEYS.LOGIN_LIST, + ONYXKEYS.USER, + ONYXKEYS.USER_WALLET, + ONYXKEYS.USER_METADATA, + ONYXKEYS.IS_LOADING_REPORT_DATA, + 'nvp_', +]; + type BaseMenuItem = { translationKey: TranslationPaths; icon: React.FC; @@ -46,6 +80,8 @@ type TroubleshootPageOnyxProps = { type TroubleshootPageProps = TroubleshootPageOnyxProps; +Network.setShouldForceOffline(false); + function TroubleshootPage({shouldStoreLogs, shouldMaskOnyxState}: TroubleshootPageProps) { const {translate} = useLocalize(); const styles = useThemeStyles(); @@ -137,6 +173,54 @@ function TroubleshootPage({shouldStoreLogs, shouldMaskOnyxState}: TroubleshootPa )} > + + + {({openPicker}) => { + return ( + - )} - {/** + + {isHidden ? translate('moderation.revealMessage') : translate('moderation.hideMessage')} + + + )} + {/** These are the actionable buttons that appear at the bottom of a Concierge message for example: Invite a user mentioned but not a member of the room https://github.com/Expensify/App/issues/32741 */} - {actionableItemButtons.length > 0 && ( - - )} - - ) : ( - - )} - - + {actionableItemButtons.length > 0 && ( + + )} + + ) : ( + + )} + + + ); } const numberOfThreadReplies = action.childVisibleActionCount ?? 0; @@ -895,100 +897,98 @@ function ReportActionItem({ const displayNamesWithTooltips = isWhisper ? ReportUtils.getDisplayNamesWithTooltips(whisperedToPersonalDetails, isMultipleParticipant) : []; return ( - - shouldUseNarrowLayout && DeviceCapabilities.canUseTouchScreen() && ControlSelection.block()} - onPressOut={() => ControlSelection.unblock()} - onSecondaryInteraction={showPopover} - preventDefaultContextMenu={draftMessage === undefined && !hasErrors} - withoutFocusOnSecondaryInteraction - accessibilityLabel={translate('accessibilityHints.chatMessage')} - accessible + shouldUseNarrowLayout && DeviceCapabilities.canUseTouchScreen() && ControlSelection.block()} + onPressOut={() => ControlSelection.unblock()} + onSecondaryInteraction={showPopover} + preventDefaultContextMenu={draftMessage === undefined && !hasErrors} + withoutFocusOnSecondaryInteraction + accessibilityLabel={translate('accessibilityHints.chatMessage')} + accessible + > + - - {(hovered) => ( - - {shouldDisplayNewMarker && (!shouldUseThreadDividerLine || !isFirstVisibleReportAction) && } - {shouldDisplayContextMenu && ( - + {(hovered) => ( + + {shouldDisplayNewMarker && (!shouldUseThreadDividerLine || !isFirstVisibleReportAction) && } + {shouldDisplayContextMenu && ( + + )} + - { - const transactionID = ReportActionsUtils.isMoneyRequestAction(action) ? ReportActionsUtils.getOriginalMessage(action)?.IOUTransactionID : undefined; - if (transactionID) { - Transaction.clearError(transactionID); - } - ReportActions.clearAllRelatedReportActionErrors(reportID, action); - }} - // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing - pendingAction={ - draftMessage !== undefined ? undefined : action.pendingAction ?? (action.isOptimisticAction ? CONST.RED_BRICK_ROAD_PENDING_ACTION.ADD : undefined) + > + { + const transactionID = ReportActionsUtils.isMoneyRequestAction(action) ? ReportActionsUtils.getOriginalMessage(action)?.IOUTransactionID : undefined; + if (transactionID) { + Transaction.clearError(transactionID); } - shouldHideOnDelete={!ReportActionsUtils.isThreadParentMessage(action, reportID)} - errors={linkedTransactionRouteError ?? ErrorUtils.getLatestErrorMessageField(action as ErrorUtils.OnyxDataWithErrors)} - errorRowStyles={[styles.ml10, styles.mr2]} - needsOffscreenAlphaCompositing={ReportActionsUtils.isMoneyRequestAction(action)} - shouldDisableStrikeThrough - > - {isWhisper && ( - - - - - - {translate('reportActionContextMenu.onlyVisible')} -   - - + {isWhisper && ( + + + - )} - {renderReportActionItem(!!hovered || !!isReportActionLinked, isWhisper, hasErrors)} - - + + {translate('reportActionContextMenu.onlyVisible')} +   + + + + )} + {renderReportActionItem(!!hovered || !!isReportActionLinked, isWhisper, hasErrors)} + - )} - - - - - - + + )} + + + + + ); } From c12613ce176fe27f325a6189ed4025377144f325 Mon Sep 17 00:00:00 2001 From: nkdengineer Date: Wed, 2 Oct 2024 17:13:50 +0700 Subject: [PATCH 401/555] add comment --- src/components/ReportActionItem/MoneyReportView.tsx | 1 + src/components/ReportActionItem/MoneyRequestView.tsx | 1 + 2 files changed, 2 insertions(+) diff --git a/src/components/ReportActionItem/MoneyReportView.tsx b/src/components/ReportActionItem/MoneyReportView.tsx index 11a6f99ae450..1aebfd83c450 100644 --- a/src/components/ReportActionItem/MoneyReportView.tsx +++ b/src/components/ReportActionItem/MoneyReportView.tsx @@ -121,6 +121,7 @@ function MoneyReportView({report, policy, isCombinedReport = false, shouldShowTo return ( (pendingAction ? undefined : transaction?.pendingFields?.[fieldPath]); const getErrorForField = useCallback( From 7652391036c8c9f672dad578fde7cf8a202ee347 Mon Sep 17 00:00:00 2001 From: Zany Renney <56830058+zanyrenney@users.noreply.github.com> Date: Wed, 2 Oct 2024 11:23:00 +0100 Subject: [PATCH 402/555] Update adding-payment-card-subscription-overview.md changed a few things from the preview that didn't look right --- .../adding-payment-card-subscription-overview.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/articles/new-expensify/billing-and-subscriptions/adding-payment-card-subscription-overview.md b/docs/articles/new-expensify/billing-and-subscriptions/adding-payment-card-subscription-overview.md index 3f0495dd7728..d30fa06bc059 100644 --- a/docs/articles/new-expensify/billing-and-subscriptions/adding-payment-card-subscription-overview.md +++ b/docs/articles/new-expensify/billing-and-subscriptions/adding-payment-card-subscription-overview.md @@ -1,4 +1,4 @@ -[title] Subscription Management +Subscription Management Under the subscriptions section of your account, you can manage your payment card details, view your current plan, add a billing card, and adjust your subscription size and renewal date. To view or manage your subscription in New Expensify: **Open the App**: Launch New Expensify on your device. From e074dfdefae8e2fd718a1788898152e0f97b9a50 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hanno=20J=2E=20G=C3=B6decke?= Date: Wed, 2 Oct 2024 12:47:39 +0200 Subject: [PATCH 403/555] update dev instructions --- tests/e2e/README.md | 22 ++++++++++------------ 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/tests/e2e/README.md b/tests/e2e/README.md index 1f590a474ad5..a47d9d8e8631 100644 --- a/tests/e2e/README.md +++ b/tests/e2e/README.md @@ -41,18 +41,16 @@ npm run android 3. We need to modify the app entry to point to the one for the tests. Therefore rename `./index.js` to `./appIndex.js` temporarily. -4. Create a new `./index.js` with the following content: -```js -require('./src/libs/E2E/reactNativeLaunchingTest'); -``` - -5. In `./src/libs/E2E/reactNativeLaunchingTest.ts` change the main app import to the new `./appIndex.js` file: -```diff -- import '../../../index'; -+ import '../../../appIndex'; -``` - -6. You can now run the tests. This command will invoke the test runner: +4. Temporarily add to the `package.json` a `main` field pointing to the e2e entry file: + + ```diff + { + "private": true, ++ "main": "src/libs/E2E/reactNativeEntry.ts" + } + ``` + +5. You can now run the tests. This command will invoke the test runner: ```sh npm run test:e2e:dev From 73db225196e4302c3a9b326194bbb24775a4a86d Mon Sep 17 00:00:00 2001 From: Christoph Pader Date: Mon, 30 Sep 2024 16:17:20 +0200 Subject: [PATCH 404/555] fix: VisionCamera session is not deinitialized when screen gets unmounted on `native-stack` --- ....0.0-beta.13+001+rn75-compatibility.patch} | 47 +++++---------- ...stack-unmount-recycle-camera-session.patch | 59 +++++++++++++++++++ 2 files changed, 73 insertions(+), 33 deletions(-) rename patches/{react-native-vision-camera+4.0.0-beta.13.patch => react-native-vision-camera+4.0.0-beta.13+001+rn75-compatibility.patch} (99%) create mode 100644 patches/react-native-vision-camera+4.0.0-beta.13+002+native-stack-unmount-recycle-camera-session.patch diff --git a/patches/react-native-vision-camera+4.0.0-beta.13.patch b/patches/react-native-vision-camera+4.0.0-beta.13+001+rn75-compatibility.patch similarity index 99% rename from patches/react-native-vision-camera+4.0.0-beta.13.patch rename to patches/react-native-vision-camera+4.0.0-beta.13+001+rn75-compatibility.patch index 4e0961ec536a..b66b659dab57 100644 --- a/patches/react-native-vision-camera+4.0.0-beta.13.patch +++ b/patches/react-native-vision-camera+4.0.0-beta.13+001+rn75-compatibility.patch @@ -1335,7 +1335,7 @@ index 0000000..46c2c2c +#endif /* RCT_NEW_ARCH_ENABLED */ diff --git a/node_modules/react-native-vision-camera/ios/RNCameraView.mm b/node_modules/react-native-vision-camera/ios/RNCameraView.mm new file mode 100644 -index 0000000..019be20 +index 0000000..b90427e --- /dev/null +++ b/node_modules/react-native-vision-camera/ios/RNCameraView.mm @@ -0,0 +1,377 @@ @@ -1384,7 +1384,7 @@ index 0000000..019be20 + + //The remaining part of the initializer is standard Objective-C code to create views and layout them with AutoLayout. Here we can change whatever we want to. + _view = [[CameraView alloc] init]; -+ _view.delegate = self; ++ _view.delegate = self; + + self.contentView = _view; +} @@ -1397,9 +1397,9 @@ index 0000000..019be20 +{ + const auto &newViewProps = *std::static_pointer_cast(props); + const auto &oldViewProps = *std::static_pointer_cast(_props); -+ ++ + NSMutableArray* changedProps = [[NSMutableArray alloc] init]; -+ ++ + if(oldViewProps.isActive != newViewProps.isActive){ + _view.isActive = newViewProps.isActive; + [changedProps addObject:@"isActive"]; @@ -1496,12 +1496,12 @@ index 0000000..019be20 + _view.enableFpsGraph = newViewProps.enableFpsGraph; + [changedProps addObject:@"enableFpsGraph"]; + } -+ -+ ++ ++ + if(_view.format == nil){ + _view.format =[ [NSMutableDictionary alloc] init]; + } -+ ++ + + //Checking format props, TODO: find cleaner way to do it + if(oldViewProps.format.supportsDepthCapture != newViewProps.format.supportsDepthCapture){ @@ -1521,7 +1521,7 @@ index 0000000..019be20 + [_view.format setValue:newPixelFormats forKey:@"pixelFormats"]; + [changedProps addObject:@"format"]; + } -+ ++ + if(oldViewProps.format.videoStabilizationModes.size() != newViewProps.format.videoStabilizationModes.size()){ + NSMutableArray* newVideoStabilizationModes = [[NSMutableArray alloc] init]; + for(int i = 0; i < newViewProps.format.videoStabilizationModes.size(); i++){ @@ -1530,7 +1530,7 @@ index 0000000..019be20 + [_view.format setValue:newVideoStabilizationModes forKey:@"videoStabilizationModes"]; + [changedProps addObject:@"format"]; + } -+ ++ + if(oldViewProps.format.photoHeight != newViewProps.format.photoHeight){ + [_view.format setValue:[NSNumber numberWithDouble:newViewProps.format.photoHeight] forKey:@"photoHeight"]; + [changedProps addObject:@"format"]; @@ -1578,11 +1578,11 @@ index 0000000..019be20 + [_view.format setValue:supportsPhotoHDR forKey:@"supportsPhotoHDR"]; + [changedProps addObject:@"format"]; + } -+ ++ + if (_view.format.count == 0) { + _view.format = nil; + } -+ ++ + if(_view.codeScannerOptions == nil){ + _view.codeScannerOptions =[[NSMutableDictionary alloc] init]; + } @@ -1595,12 +1595,12 @@ index 0000000..019be20 + [_view.codeScannerOptions setValue:newCodeTypes forKey:@"codeTypes"]; + [changedProps addObject:@"codeScannerOptions"]; + } -+ ++ + if(oldViewProps.codeScannerOptions.interval != newViewProps.codeScannerOptions.interval){ + [_view.codeScannerOptions setValue:[NSNumber numberWithDouble:newViewProps.codeScannerOptions.interval] forKey:@"interval"]; + [changedProps addObject:@"codeScannerOptions"]; + } -+ ++ + if( + oldViewProps.codeScannerOptions.regionOfInterest.x != newViewProps.codeScannerOptions.regionOfInterest.x || + oldViewProps.codeScannerOptions.regionOfInterest.y != newViewProps.codeScannerOptions.regionOfInterest.y || @@ -1616,7 +1616,7 @@ index 0000000..019be20 + [_view.codeScannerOptions setValue:newRegionOfInterest forKey:@"regionOfInterest"]; + [changedProps addObject:@"codeScannerOptions"]; + } -+ ++ + if (_view.codeScannerOptions.count == 0) { + _view.codeScannerOptions = nil; + } @@ -2005,25 +2005,6 @@ index 0000000..e47e42f @@ -0,0 +1 @@ +{"version":3,"file":"CameraViewNativeComponent.d.ts","sourceRoot":"","sources":["../../../src/specs/CameraViewNativeComponent.ts"],"names":[],"mappings":";;AACA,OAAO,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAC7D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,2CAA2C,CAAC;AAGnG,MAAM,MAAM,yBAAyB,GAAG,aAAa,CAAC,WAAW,CAAC,CAAC;AAEnE,MAAM,WAAW,WAAY,SAAQ,SAAS;IAC5C,gBAAgB,EAAE,OAAO,CAAC;IAC1B,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,oBAAoB,EAAE,OAAO,CAAC;IAC9B,cAAc,EAAE,OAAO,CAAC;IACxB,uBAAuB,EAAE,OAAO,CAAC;IACjC,mBAAmB,EAAE,MAAM,CAAC;IAC5B,QAAQ,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,QAAQ,CAAC;QAChB,oBAAoB,CAAC,EAAE,OAAO,CAAC;QAC/B,WAAW,EAAE,MAAM,CAAC;QACpB,UAAU,EAAE,MAAM,CAAC;QACnB,WAAW,EAAE,MAAM,CAAC;QACpB,UAAU,EAAE,MAAM,CAAC;QACnB,MAAM,EAAE,MAAM,CAAC;QACf,MAAM,EAAE,MAAM,CAAC;QACf,MAAM,EAAE,MAAM,CAAC;QACf,MAAM,EAAE,MAAM,CAAC;QACf,WAAW,EAAE,MAAM,CAAC;QACpB,gBAAgB,EAAE,OAAO,CAAC;QAC1B,gBAAgB,EAAE,OAAO,CAAC;QAC1B,eAAe,EAAE,MAAM,CAAC;QACxB,uBAAuB,EAAE,MAAM,EAAE,CAAC;QAClC,YAAY,EAAE,MAAM,EAAE,CAAC;KACxB,CAAC,CAAC;IACH,WAAW,EAAE,MAAM,CAAC;IACpB,GAAG,CAAC,EAAE,KAAK,CAAC;IACZ,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,kCAAkC,CAAC,EAAE,OAAO,CAAC;IAC7C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,kBAAkB,CAAC,EAAE,QAAQ,CAAC;QAC5B,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;QACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,gBAAgB,CAAC,EAAE,QAAQ,CAAC;YAC1B,CAAC,CAAC,EAAE,MAAM,CAAC;YACX,CAAC,CAAC,EAAE,MAAM,CAAC;YACX,KAAK,CAAC,EAAE,MAAM,CAAC;YACf,MAAM,CAAC,EAAE,MAAM,CAAC;SACjB,CAAC,CAAC;KACJ,CAAC,CAAC;IACH,aAAa,CAAC,EAAE,kBAAkB,CAChC,QAAQ,CAAC;QACP,KAAK,CAAC,EAAE,QAAQ,CAAC;YACf,IAAI,CAAC,EAAE,MAAM,CAAC;YACd,KAAK,CAAC,EAAE,MAAM,CAAC;YACf,KAAK,CAAC,EAAE,QAAQ,CAAC;gBAAE,CAAC,EAAE,MAAM,CAAC;gBAAC,CAAC,EAAE,MAAM,CAAC;gBAAC,KAAK,EAAE,MAAM,CAAC;gBAAC,MAAM,EAAE,MAAM,CAAA;aAAC,CAAC,CAAC;SAC1E,CAAC,CAAC;QACH,KAAK,CAAC,EAAE,QAAQ,CAAC;YAAE,KAAK,EAAE,KAAK,CAAC;YAAC,MAAM,EAAE,KAAK,CAAA;SAAE,CAAC,CAAC;QAClD,OAAO,CAAC,EAAE,QAAQ,CAAC;YAAE,CAAC,EAAE,MAAM,CAAC;YAAC,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;KAC9C,CAAC,CACH,CAAC;IACF,SAAS,CAAC,EAAE,kBAAkB,CAC5B,QAAQ,CAAC;QACP,IAAI,EAAE,MAAM,CAAC;KACd,CAAC,CACH,CAAC;IACF,SAAS,CAAC,EAAE,kBAAkB,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC;IAC7C,SAAS,CAAC,EAAE,kBAAkB,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC;IAC7C,aAAa,CAAC,EAAE,kBAAkB,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC;IACjD,OAAO,CAAC,EAAE,kBAAkB,CAC1B,QAAQ,CAAC;QACP,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;QAChB,KAAK,EAAE,QAAQ,CAAC;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,MAAM,CAAC;YAAC,OAAO,EAAE,MAAM,CAAC;YAAC,OAAO,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;KACrF,CAAC,CACH,CAAC;IACF,WAAW,EAAE,kBAAkB,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC;CAC/C;;AAED,wBAAiE"} \ No newline at end of file -diff --git a/node_modules/react-native-vision-camera/package.json b/node_modules/react-native-vision-camera/package.json -index 86352fa..7af9577 100644 ---- a/node_modules/react-native-vision-camera/package.json -+++ b/node_modules/react-native-vision-camera/package.json -@@ -166,5 +166,13 @@ - ] - ] - }, -- "packageManager": "yarn@1.22.19+sha1.4ba7fc5c6e704fce2066ecbfb0b0d8976fe62447" -+ "codegenConfig": { -+ "name": "RNVisioncameraSpec", -+ "type": "all", -+ "jsSrcsDir": "./src/specs", -+ "android": { -+ "javaPackageName": "com.mrousavy.camera" -+ } -+ }, -+ "packageManager": "yarn@1.22.19" - } diff --git a/node_modules/react-native-vision-camera/src/Camera.tsx b/node_modules/react-native-vision-camera/src/Camera.tsx index 18733ba..1668322 100644 --- a/node_modules/react-native-vision-camera/src/Camera.tsx diff --git a/patches/react-native-vision-camera+4.0.0-beta.13+002+native-stack-unmount-recycle-camera-session.patch b/patches/react-native-vision-camera+4.0.0-beta.13+002+native-stack-unmount-recycle-camera-session.patch new file mode 100644 index 000000000000..b98b6d30540f --- /dev/null +++ b/patches/react-native-vision-camera+4.0.0-beta.13+002+native-stack-unmount-recycle-camera-session.patch @@ -0,0 +1,59 @@ +diff --git a/node_modules/react-native-vision-camera/ios/RNCameraView.mm b/node_modules/react-native-vision-camera/ios/RNCameraView.mm +index b90427e..feccc33 100644 +--- a/node_modules/react-native-vision-camera/ios/RNCameraView.mm ++++ b/node_modules/react-native-vision-camera/ios/RNCameraView.mm +@@ -34,26 +34,46 @@ + (ComponentDescriptorProvider)componentDescriptorProvider + return concreteComponentDescriptorProvider(); + } + ++- (void) initCamera { ++ static const auto defaultProps = std::make_shared(); ++ _props = defaultProps; ++ ++ //The remaining part of the initializer is standard Objective-C code to create views and layout them with AutoLayout. Here we can change whatever we want to. ++ _view = [[CameraView alloc] init]; ++ _view.delegate = self; ++ ++ self.contentView = _view; ++} ++ + - (instancetype)initWithFrame:(CGRect)frame + { + self = [super initWithFrame:frame]; +-if (self) { +- static const auto defaultProps = std::make_shared(); +- _props = defaultProps; ++ if (self) { ++ [self initCamera]; ++ } ++ return self; ++} ++ + +- //The remaining part of the initializer is standard Objective-C code to create views and layout them with AutoLayout. Here we can change whatever we want to. +- _view = [[CameraView alloc] init]; +- _view.delegate = self; ++- (void) prepareForRecycle { ++ [super prepareForRecycle]; + +- self.contentView = _view; ++ _view.delegate = nil; ++ _view = nil; ++ self.contentView = nil; + } + +-return self; ++- (void) updateLayoutMetrics:(const facebook::react::LayoutMetrics &)layoutMetrics oldLayoutMetrics:(const facebook::react::LayoutMetrics &)oldLayoutMetrics { ++ [super updateLayoutMetrics:layoutMetrics oldLayoutMetrics:oldLayoutMetrics]; + } + + // why we need this func -> https://reactnative.dev/docs/next/the-new-architecture/pillars-fabric-components#write-the-native-ios-code + - (void)updateProps:(Props::Shared const &)props oldProps:(Props::Shared const &)oldProps + { ++ if (_view == nil) { ++ [self initCamera]; ++ } ++ + const auto &newViewProps = *std::static_pointer_cast(props); + const auto &oldViewProps = *std::static_pointer_cast(_props); + From a0aa19d350a259dedd335ee5c8059267e286648e Mon Sep 17 00:00:00 2001 From: Christoph Pader Date: Tue, 1 Oct 2024 18:51:32 +0200 Subject: [PATCH 405/555] update patch --- ...stack-unmount-recycle-camera-session.patch | 62 +++++++++---------- 1 file changed, 29 insertions(+), 33 deletions(-) diff --git a/patches/react-native-vision-camera+4.0.0-beta.13+002+native-stack-unmount-recycle-camera-session.patch b/patches/react-native-vision-camera+4.0.0-beta.13+002+native-stack-unmount-recycle-camera-session.patch index b98b6d30540f..311e5c96e2f8 100644 --- a/patches/react-native-vision-camera+4.0.0-beta.13+002+native-stack-unmount-recycle-camera-session.patch +++ b/patches/react-native-vision-camera+4.0.0-beta.13+002+native-stack-unmount-recycle-camera-session.patch @@ -1,50 +1,46 @@ diff --git a/node_modules/react-native-vision-camera/ios/RNCameraView.mm b/node_modules/react-native-vision-camera/ios/RNCameraView.mm -index b90427e..feccc33 100644 +index b90427e..0be4171 100644 --- a/node_modules/react-native-vision-camera/ios/RNCameraView.mm +++ b/node_modules/react-native-vision-camera/ios/RNCameraView.mm -@@ -34,26 +34,46 @@ + (ComponentDescriptorProvider)componentDescriptorProvider +@@ -34,26 +34,43 @@ + (ComponentDescriptorProvider)componentDescriptorProvider return concreteComponentDescriptorProvider(); } -+- (void) initCamera { -+ static const auto defaultProps = std::make_shared(); -+ _props = defaultProps; -+ -+ //The remaining part of the initializer is standard Objective-C code to create views and layout them with AutoLayout. Here we can change whatever we want to. -+ _view = [[CameraView alloc] init]; -+ _view.delegate = self; -+ -+ self.contentView = _view; -+} -+ - - (instancetype)initWithFrame:(CGRect)frame - { - self = [super initWithFrame:frame]; +-- (instancetype)initWithFrame:(CGRect)frame +-{ +- self = [super initWithFrame:frame]; -if (self) { - static const auto defaultProps = std::make_shared(); -- _props = defaultProps; -+ if (self) { -+ [self initCamera]; -+ } -+ return self; -+} -+ ++- (void) initCamera { ++ static const auto defaultProps = std::make_shared(); + _props = defaultProps; - //The remaining part of the initializer is standard Objective-C code to create views and layout them with AutoLayout. Here we can change whatever we want to. -- _view = [[CameraView alloc] init]; -- _view.delegate = self; -+- (void) prepareForRecycle { -+ [super prepareForRecycle]; ++ // The remaining part of the initializer is standard bjective-C code to create views and layout them with utoLayout. Here we can change whatever we want to. + _view = [[CameraView alloc] init]; + _view.delegate = self; -- self.contentView = _view; -+ _view.delegate = nil; -+ _view = nil; -+ self.contentView = nil; + self.contentView = _view; } -return self; -+- (void) updateLayoutMetrics:(const facebook::react::LayoutMetrics &)layoutMetrics oldLayoutMetrics:(const facebook::react::LayoutMetrics &)oldLayoutMetrics { -+ [super updateLayoutMetrics:layoutMetrics oldLayoutMetrics:oldLayoutMetrics]; ++- (instancetype)initWithFrame:(CGRect)frame ++{ ++ self = [super initWithFrame:frame]; ++ if (self) { ++ [self initCamera]; ++ } ++ ++ return self; ++} ++ ++- (void) prepareForRecycle { ++ [super prepareForRecycle]; ++ ++ self.contentView = _view; ++ _view.delegate = nil; ++ _view = nil; ++ self.contentView = nil; } // why we need this func -> https://reactnative.dev/docs/next/the-new-architecture/pillars-fabric-components#write-the-native-ios-code From 0877308b05a3aa48055fe910296977afc0b5f51f Mon Sep 17 00:00:00 2001 From: Eduardo Date: Wed, 2 Oct 2024 13:17:40 +0200 Subject: [PATCH 406/555] Fixed some eslint issues --- src/libs/actions/PersistedRequests.ts | 3 ++- tests/actions/SessionTest.ts | 4 ++-- tests/unit/PersistedRequests.ts | 4 ++-- tests/unit/SequentialQueueTest.ts | 8 ++++---- 4 files changed, 10 insertions(+), 9 deletions(-) diff --git a/src/libs/actions/PersistedRequests.ts b/src/libs/actions/PersistedRequests.ts index 77d6e3884380..fc14e8c2303b 100644 --- a/src/libs/actions/PersistedRequests.ts +++ b/src/libs/actions/PersistedRequests.ts @@ -13,7 +13,7 @@ Onyx.connect({ persistedRequests = val ?? []; if (ongoingRequest && persistedRequests.length > 0) { - const nextRequestToProcess = persistedRequests[0]; + const nextRequestToProcess = persistedRequests.at(0); // We try to remove the next request from the persistedRequests if it is the same as ongoingRequest // so we don't process it twice. @@ -35,6 +35,7 @@ Onyx.connect({ */ function clear() { ongoingRequest = null; + Onyx.set(ONYXKEYS.PERSISTED_ONGOING_REQUESTS, null); return Onyx.set(ONYXKEYS.PERSISTED_REQUESTS, []); } diff --git a/tests/actions/SessionTest.ts b/tests/actions/SessionTest.ts index e46806bef99e..51dc775da359 100644 --- a/tests/actions/SessionTest.ts +++ b/tests/actions/SessionTest.ts @@ -118,7 +118,7 @@ describe('Session', () => { await waitForBatchedUpdates(); expect(PersistedRequests.getAll().length).toBe(1); - expect(PersistedRequests.getAll()[0].command).toBe(WRITE_COMMANDS.RECONNECT_APP); + expect(PersistedRequests.getAll().at(0)?.command).toBe(WRITE_COMMANDS.RECONNECT_APP); await Onyx.set(ONYXKEYS.NETWORK, {isOffline: false}); @@ -140,7 +140,7 @@ describe('Session', () => { await waitForBatchedUpdates(); expect(PersistedRequests.getAll().length).toBe(1); - expect(PersistedRequests.getAll()[0].command).toBe(WRITE_COMMANDS.RECONNECT_APP); + expect(PersistedRequests.getAll().at(0)?.command).toBe(WRITE_COMMANDS.RECONNECT_APP); await Onyx.set(ONYXKEYS.NETWORK, {isOffline: false}); diff --git a/tests/unit/PersistedRequests.ts b/tests/unit/PersistedRequests.ts index 476b3f963951..7d3a7288ed90 100644 --- a/tests/unit/PersistedRequests.ts +++ b/tests/unit/PersistedRequests.ts @@ -57,7 +57,7 @@ describe('PersistedRequests', () => { PersistedRequests.processNextRequest(); return waitForBatchedUpdates().then(() => { expect(PersistedRequests.getAll().length).toBe(1); - expect(PersistedRequests.getAll()[0]).toEqual(request2); + expect(PersistedRequests.getAll().at(0)).toEqual(request2); }); }); @@ -68,7 +68,7 @@ describe('PersistedRequests', () => { failureData: [{key: 'reportMetadata_2', onyxMethod: 'set', value: {}}], }; PersistedRequests.update(0, newRequest); - expect(PersistedRequests.getAll()[0]).toEqual(newRequest); + expect(PersistedRequests.getAll().at(0)).toEqual(newRequest); }); it('update the ongoing request with new data', () => { diff --git a/tests/unit/SequentialQueueTest.ts b/tests/unit/SequentialQueueTest.ts index 8651d7e95e33..4b5c026eb8f4 100644 --- a/tests/unit/SequentialQueueTest.ts +++ b/tests/unit/SequentialQueueTest.ts @@ -57,7 +57,7 @@ describe('SequentialQueue', () => { expect(PersistedRequests.getLength()).toBe(1); // We know there is only one request in the queue, so we can get the first one and verify // that the persisted request is the second one. - const persistedRequest = PersistedRequests.getAll()[0]; + const persistedRequest = PersistedRequests.getAll().at(0); expect(persistedRequest?.data?.accountID).toBe(56789); }); @@ -179,7 +179,7 @@ describe('SequentialQueue', () => { const persistedRequests = PersistedRequests.getAll(); // We know ReconnectApp is at index 1 in the queue, so we can get it to verify // that was replaced by the new request. - expect(persistedRequests[1]?.data?.accountID).toBe(56789); + expect(persistedRequests.at(1)?.data?.accountID).toBe(56789); }); // need to test a rance condition between processing the next request and then pushing a new request with conflict resolver @@ -223,8 +223,8 @@ describe('SequentialQueue', () => { // We know ReconnectApp is at index 9 in the queue, so we can get it to verify // that was replaced by the new request. - expect(persistedRequests[9]?.command).toBe('ReconnectApp-replaced'); - expect(persistedRequests[9]?.data?.accountID).toBe(56789); + expect(persistedRequests.at(9)?.command).toBe('ReconnectApp-replaced'); + expect(persistedRequests.at(9)?.data?.accountID).toBe(56789); }); // I need to test now when moving the request from the queue to the ongoing request the PERSISTED_REQUESTS is decreased and PERSISTED_ONGOING_REQUESTS has the new request From c31d837efa3a2895dd4b7fa9494c08665f78a6c6 Mon Sep 17 00:00:00 2001 From: FitseTLT Date: Wed, 2 Oct 2024 14:31:29 +0300 Subject: [PATCH 407/555] remove unrelated changes --- src/libs/actions/IOU.ts | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/src/libs/actions/IOU.ts b/src/libs/actions/IOU.ts index 077369704d33..96f71d2aecae 100644 --- a/src/libs/actions/IOU.ts +++ b/src/libs/actions/IOU.ts @@ -7854,13 +7854,6 @@ function putOnHold(transactionID: string, comment: string, reportID: string, sea [createdReportActionComment.reportActionID]: createdReportActionComment as ReportAction, }, }, - { - onyxMethod: Onyx.METHOD.MERGE, - key: `${ONYXKEYS.COLLECTION.REPORT}${reportID}`, - value: { - lastVisibleActionCreated: createdReportActionComment.created, - }, - }, { onyxMethod: Onyx.METHOD.MERGE, key: `${ONYXKEYS.COLLECTION.TRANSACTION}${transactionID}`, @@ -7964,13 +7957,6 @@ function unholdRequest(transactionID: string, reportID: string, searchHash?: num [createdReportAction.reportActionID]: createdReportAction as ReportAction, }, }, - { - onyxMethod: Onyx.METHOD.MERGE, - key: `${ONYXKEYS.COLLECTION.REPORT}${reportID}`, - value: { - lastVisibleActionCreated: createdReportAction.created, - }, - }, { onyxMethod: Onyx.METHOD.MERGE, key: `${ONYXKEYS.COLLECTION.TRANSACTION}${transactionID}`, From c9198e591712f71241609f748e0303d70967819a Mon Sep 17 00:00:00 2001 From: cdOut <88325488+cdOut@users.noreply.github.com> Date: Wed, 2 Oct 2024 13:36:52 +0200 Subject: [PATCH 408/555] add completePaymentOnboarding into AddPaymentMethodMenu --- src/components/AddPaymentMethodMenu.tsx | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/components/AddPaymentMethodMenu.tsx b/src/components/AddPaymentMethodMenu.tsx index 5621c031f959..f21f3e119fb0 100644 --- a/src/components/AddPaymentMethodMenu.tsx +++ b/src/components/AddPaymentMethodMenu.tsx @@ -15,6 +15,7 @@ import * as Expensicons from './Icon/Expensicons'; import type {PaymentMethod} from './KYCWall/types'; import type BaseModalProps from './Modal/types'; import PopoverMenu from './PopoverMenu'; +import { completePaymentOnboarding } from '@libs/actions/IOU'; type AddPaymentMethodMenuOnyxProps = { /** Session info for the currently logged-in user. */ @@ -80,6 +81,7 @@ function AddPaymentMethodMenu({ return; } + completePaymentOnboarding(CONST.PAYMENT_SELECTED.PBA); onItemSelected(CONST.PAYMENT_METHODS.PERSONAL_BANK_ACCOUNT); }, [isPersonalOnlyOption, isVisible, onItemSelected]); @@ -108,7 +110,8 @@ function AddPaymentMethodMenu({ text: translate('common.personalBankAccount'), icon: Expensicons.Bank, onSelected: () => { - onItemSelected(CONST.PAYMENT_METHODS.PERSONAL_BANK_ACCOUNT); + completePaymentOnboarding(CONST.PAYMENT_SELECTED.PBA); + onItemSelected(CONST.PAYMENT_METHODS.PERSONAL_BANK_ACCOUNT); }, }, ] @@ -118,7 +121,10 @@ function AddPaymentMethodMenu({ { text: translate('common.businessBankAccount'), icon: Expensicons.Building, - onSelected: () => onItemSelected(CONST.PAYMENT_METHODS.BUSINESS_BANK_ACCOUNT), + onSelected: () => { + completePaymentOnboarding(CONST.PAYMENT_SELECTED.BBA); + onItemSelected(CONST.PAYMENT_METHODS.BUSINESS_BANK_ACCOUNT); + }, }, ] : []), From 53dee66ea2157e86b7e8b1a017eb60d385e820a7 Mon Sep 17 00:00:00 2001 From: Ted Harris Date: Wed, 2 Oct 2024 12:45:37 +0100 Subject: [PATCH 409/555] Create Finland-per-diem.csv Adding this to the guide because I had to do it for Logitech anyway. --- docs/assets/Files/Finland-per-diem.csv | 1071 ++++++++++++++++++++++++ 1 file changed, 1071 insertions(+) create mode 100644 docs/assets/Files/Finland-per-diem.csv diff --git a/docs/assets/Files/Finland-per-diem.csv b/docs/assets/Files/Finland-per-diem.csv new file mode 100644 index 000000000000..beb7abc5ef62 --- /dev/null +++ b/docs/assets/Files/Finland-per-diem.csv @@ -0,0 +1,1071 @@ +Destination,Amount,Currency,Subrate +*Exceptional,12.75,EUR,1 meal (no destination) +*Exceptional,15.5,EUR,2+ Meals (no destination) +*Exceptional,18,EUR,Travel (no destination) +*Finland,51,EUR,Full day (over 10 hours) +*Finland,24,EUR,Partial day (over 6 hours) +*Finland,51,EUR,Final day (over 6 hours) +*Finland,24,EUR,Final day (over 2 hours) +*Finland,16,EUR,Night Travel supplement +*Finland,-24,EUR,1 meal +*Finland,-51,EUR,2+ Meals +Afghanistan,59,EUR,Full day (over 24 hours) +Afghanistan,59,EUR,Final day (over 10 hours) +Afghanistan,29.5,EUR,Final day (over 2 hours) +Afghanistan,-29.5,EUR,2+ Meals +Afghanistan,16,EUR,Night Travel supplement +Albania,81,EUR,Full day (over 24 hours) +Albania,81,EUR,Final day (over 10 hours) +Albania,40.5,EUR,Final day (over 2 hours) +Albania,-40.5,EUR,2+ Meals +Albania,16,EUR,Night Travel supplement +Algeria,78,EUR,Full day (over 24 hours) +Algeria,78,EUR,Final day (over 10 hours) +Algeria,39,EUR,Final day (over 2 hours) +Algeria,-39,EUR,2+ Meals +Algeria,16,EUR,Night Travel supplement +Andorra,63,EUR,Full day (over 24 hours) +Andorra,63,EUR,Final day (over 10 hours) +Andorra,31.5,EUR,Final day (over 2 hours) +Andorra,-31.5,EUR,2+ Meals +Andorra,16,EUR,Night Travel supplement +Angola,71,EUR,Full day (over 24 hours) +Angola,71,EUR,Final day (over 10 hours) +Angola,35.5,EUR,Final day (over 2 hours) +Angola,-35.5,EUR,2+ Meals +Angola,16,EUR,Night Travel supplement +Antiqua and Barbuda,94,EUR,Full day (over 24 hours) +Antiqua and Barbuda,94,EUR,Final day (over 10 hours) +Antiqua and Barbuda,47,EUR,Final day (over 2 hours) +Antiqua and Barbuda,-47,EUR,2+ Meals +Antiqua and Barbuda,16,EUR,Night Travel supplement +"Any other country, not specified above",52,EUR,Full day (over 24 hours) +"Any other country, not specified above",52,EUR,Final day (over 10 hours) +"Any other country, not specified above",26,EUR,Final day (over 2 hours) +"Any other country, not specified above",-26,EUR,2+ Meals +"Any other country, not specified above",16,EUR,Night Travel supplement +Argentina,38,EUR,Full day (over 24 hours) +Argentina,38,EUR,Final day (over 10 hours) +Argentina,19,EUR,Final day (over 2 hours) +Argentina,-19,EUR,2+ Meals +Argentina,16,EUR,Night Travel supplement +Armenia,61,EUR,Full day (over 24 hours) +Armenia,61,EUR,Final day (over 10 hours) +Armenia,30.5,EUR,Final day (over 2 hours) +Armenia,-30.5,EUR,2+ Meals +Armenia,16,EUR,Night Travel supplement +Aruba,70,EUR,Full day (over 24 hours) +Aruba,70,EUR,Final day (over 10 hours) +Aruba,35,EUR,Final day (over 2 hours) +Aruba,-35,EUR,2+ Meals +Aruba,16,EUR,Night Travel supplement +Australia,74,EUR,Full day (over 24 hours) +Australia,74,EUR,Final day (over 10 hours) +Australia,37,EUR,Final day (over 2 hours) +Australia,-37,EUR,2+ Meals +Australia,16,EUR,Night Travel supplement +Austria,80,EUR,Full day (over 24 hours) +Austria,80,EUR,Final day (over 10 hours) +Austria,40,EUR,Final day (over 2 hours) +Austria,-40,EUR,2+ Meals +Austria,16,EUR,Night Travel supplement +Azerbaidzhan,70,EUR,Full day (over 24 hours) +Azerbaidzhan,70,EUR,Final day (over 10 hours) +Azerbaidzhan,35,EUR,Final day (over 2 hours) +Azerbaidzhan,-35,EUR,2+ Meals +Azerbaidzhan,16,EUR,Night Travel supplement +Azores,69,EUR,Full day (over 24 hours) +Azores,69,EUR,Final day (over 10 hours) +Azores,34.5,EUR,Final day (over 2 hours) +Azores,-34.5,EUR,2+ Meals +Azores,16,EUR,Night Travel supplement +Bahamas,91,EUR,Full day (over 24 hours) +Bahamas,91,EUR,Final day (over 10 hours) +Bahamas,45.5,EUR,Final day (over 2 hours) +Bahamas,-45.5,EUR,2+ Meals +Bahamas,16,EUR,Night Travel supplement +Bahrain,80,EUR,Full day (over 24 hours) +Bahrain,80,EUR,Final day (over 10 hours) +Bahrain,40,EUR,Final day (over 2 hours) +Bahrain,-40,EUR,2+ Meals +Bahrain,16,EUR,Night Travel supplement +Bangladesh,57,EUR,Full day (over 24 hours) +Bangladesh,57,EUR,Final day (over 10 hours) +Bangladesh,28.5,EUR,Final day (over 2 hours) +Bangladesh,-28.5,EUR,2+ Meals +Bangladesh,16,EUR,Night Travel supplement +Barbados,83,EUR,Full day (over 24 hours) +Barbados,83,EUR,Final day (over 10 hours) +Barbados,41.5,EUR,Final day (over 2 hours) +Barbados,-41.5,EUR,2+ Meals +Barbados,16,EUR,Night Travel supplement +Belarus,63,EUR,Full day (over 24 hours) +Belarus,63,EUR,Final day (over 10 hours) +Belarus,31.5,EUR,Final day (over 2 hours) +Belarus,-31.5,EUR,2+ Meals +Belarus,16,EUR,Night Travel supplement +Belgium,77,EUR,Full day (over 24 hours) +Belgium,77,EUR,Final day (over 10 hours) +Belgium,38.5,EUR,Final day (over 2 hours) +Belgium,-38.5,EUR,2+ Meals +Belgium,16,EUR,Night Travel supplement +Belize,52,EUR,Full day (over 24 hours) +Belize,52,EUR,Final day (over 10 hours) +Belize,26,EUR,Final day (over 2 hours) +Belize,-26,EUR,2+ Meals +Belize,16,EUR,Night Travel supplement +Benin,47,EUR,Full day (over 24 hours) +Benin,47,EUR,Final day (over 10 hours) +Benin,23.5,EUR,Final day (over 2 hours) +Benin,-23.5,EUR,2+ Meals +Benin,16,EUR,Night Travel supplement +Bermuda,90,EUR,Full day (over 24 hours) +Bermuda,90,EUR,Final day (over 10 hours) +Bermuda,45,EUR,Final day (over 2 hours) +Bermuda,-45,EUR,2+ Meals +Bermuda,16,EUR,Night Travel supplement +Bhutan,49,EUR,Full day (over 24 hours) +Bhutan,49,EUR,Final day (over 10 hours) +Bhutan,24.5,EUR,Final day (over 2 hours) +Bhutan,-24.5,EUR,2+ Meals +Bhutan,16,EUR,Night Travel supplement +Bolivia,48,EUR,Full day (over 24 hours) +Bolivia,48,EUR,Final day (over 10 hours) +Bolivia,24,EUR,Final day (over 2 hours) +Bolivia,-24,EUR,2+ Meals +Bolivia,16,EUR,Night Travel supplement +Bosnia and Hercegovina,54,EUR,Full day (over 24 hours) +Bosnia and Hercegovina,54,EUR,Final day (over 10 hours) +Bosnia and Hercegovina,27,EUR,Final day (over 2 hours) +Bosnia and Hercegovina,-27,EUR,2+ Meals +Bosnia and Hercegovina,16,EUR,Night Travel supplement +Botswana,41,EUR,Full day (over 24 hours) +Botswana,41,EUR,Final day (over 10 hours) +Botswana,20.5,EUR,Final day (over 2 hours) +Botswana,-20.5,EUR,2+ Meals +Botswana,16,EUR,Night Travel supplement +Brazil,80,EUR,Full day (over 24 hours) +Brazil,80,EUR,Final day (over 10 hours) +Brazil,40,EUR,Final day (over 2 hours) +Brazil,-40,EUR,2+ Meals +Brazil,16,EUR,Night Travel supplement +Brunei,45,EUR,Full day (over 24 hours) +Brunei,45,EUR,Final day (over 10 hours) +Brunei,22.5,EUR,Final day (over 2 hours) +Brunei,-22.5,EUR,2+ Meals +Brunei,16,EUR,Night Travel supplement +Bulgaria,64,EUR,Full day (over 24 hours) +Bulgaria,64,EUR,Final day (over 10 hours) +Bulgaria,32,EUR,Final day (over 2 hours) +Bulgaria,-32,EUR,2+ Meals +Bulgaria,16,EUR,Night Travel supplement +Burkina Faso,40,EUR,Full day (over 24 hours) +Burkina Faso,40,EUR,Final day (over 10 hours) +Burkina Faso,20,EUR,Final day (over 2 hours) +Burkina Faso,-20,EUR,2+ Meals +Burkina Faso,16,EUR,Night Travel supplement +Burundi,46,EUR,Full day (over 24 hours) +Burundi,46,EUR,Final day (over 10 hours) +Burundi,23,EUR,Final day (over 2 hours) +Burundi,-23,EUR,2+ Meals +Burundi,16,EUR,Night Travel supplement +Cambodia,67,EUR,Full day (over 24 hours) +Cambodia,67,EUR,Final day (over 10 hours) +Cambodia,33.5,EUR,Final day (over 2 hours) +Cambodia,-33.5,EUR,2+ Meals +Cambodia,16,EUR,Night Travel supplement +Cameroon,59,EUR,Full day (over 24 hours) +Cameroon,59,EUR,Final day (over 10 hours) +Cameroon,29.5,EUR,Final day (over 2 hours) +Cameroon,-29.5,EUR,2+ Meals +Cameroon,16,EUR,Night Travel supplement +Canada,82,EUR,Full day (over 24 hours) +Canada,82,EUR,Final day (over 10 hours) +Canada,41,EUR,Final day (over 2 hours) +Canada,-41,EUR,2+ Meals +Canada,16,EUR,Night Travel supplement +Canary Islands,71,EUR,Full day (over 24 hours) +Canary Islands,71,EUR,Final day (over 10 hours) +Canary Islands,35.5,EUR,Final day (over 2 hours) +Canary Islands,-35.5,EUR,2+ Meals +Canary Islands,16,EUR,Night Travel supplement +Cape Verde,45,EUR,Full day (over 24 hours) +Cape Verde,45,EUR,Final day (over 10 hours) +Cape Verde,22.5,EUR,Final day (over 2 hours) +Cape Verde,-22.5,EUR,2+ Meals +Cape Verde,16,EUR,Night Travel supplement +Central African Republic,101,EUR,Full day (over 24 hours) +Central African Republic,101,EUR,Final day (over 10 hours) +Central African Republic,50.5,EUR,Final day (over 2 hours) +Central African Republic,-50.5,EUR,2+ Meals +Central African Republic,16,EUR,Night Travel supplement +Chad,47,EUR,Full day (over 24 hours) +Chad,47,EUR,Final day (over 10 hours) +Chad,23.5,EUR,Final day (over 2 hours) +Chad,-23.5,EUR,2+ Meals +Chad,16,EUR,Night Travel supplement +Chile,56,EUR,Full day (over 24 hours) +Chile,56,EUR,Final day (over 10 hours) +Chile,28,EUR,Final day (over 2 hours) +Chile,-28,EUR,2+ Meals +Chile,16,EUR,Night Travel supplement +China,74,EUR,Full day (over 24 hours) +China,74,EUR,Final day (over 10 hours) +China,37,EUR,Final day (over 2 hours) +China,-37,EUR,2+ Meals +China,16,EUR,Night Travel supplement +Colombia,64,EUR,Full day (over 24 hours) +Colombia,64,EUR,Final day (over 10 hours) +Colombia,32,EUR,Final day (over 2 hours) +Colombia,-32,EUR,2+ Meals +Colombia,16,EUR,Night Travel supplement +Comoros,42,EUR,Full day (over 24 hours) +Comoros,42,EUR,Final day (over 10 hours) +Comoros,21,EUR,Final day (over 2 hours) +Comoros,-21,EUR,2+ Meals +Comoros,16,EUR,Night Travel supplement +Congo (Congo-Brazzaville),64,EUR,Full day (over 24 hours) +Congo (Congo-Brazzaville),64,EUR,Final day (over 10 hours) +Congo (Congo-Brazzaville),32,EUR,Final day (over 2 hours) +Congo (Congo-Brazzaville),-32,EUR,2+ Meals +Congo (Congo-Brazzaville),16,EUR,Night Travel supplement +"Congo, Democratic Republic of (Congo-Kinshasa)",51,EUR,Full day (over 24 hours) +"Congo, Democratic Republic of (Congo-Kinshasa)",51,EUR,Final day (over 10 hours) +"Congo, Democratic Republic of (Congo-Kinshasa)",25.5,EUR,Final day (over 2 hours) +"Congo, Democratic Republic of (Congo-Kinshasa)",-25.5,EUR,2+ Meals +"Congo, Democratic Republic of (Congo-Kinshasa)",16,EUR,Night Travel supplement +Cook Islands,70,EUR,Full day (over 24 hours) +Cook Islands,70,EUR,Final day (over 10 hours) +Cook Islands,35,EUR,Final day (over 2 hours) +Cook Islands,-35,EUR,2+ Meals +Cook Islands,16,EUR,Night Travel supplement +Costa Rica,65,EUR,Full day (over 24 hours) +Costa Rica,65,EUR,Final day (over 10 hours) +Costa Rica,32.5,EUR,Final day (over 2 hours) +Costa Rica,-32.5,EUR,2+ Meals +Costa Rica,16,EUR,Night Travel supplement +"Côte d’Ivoire, Ivory Coast",80,EUR,Full day (over 24 hours) +"Côte d’Ivoire, Ivory Coast",80,EUR,Final day (over 10 hours) +"Côte d’Ivoire, Ivory Coast",40,EUR,Final day (over 2 hours) +"Côte d’Ivoire, Ivory Coast",-40,EUR,2+ Meals +"Côte d’Ivoire, Ivory Coast",16,EUR,Night Travel supplement +Croatia,69,EUR,Full day (over 24 hours) +Croatia,69,EUR,Final day (over 10 hours) +Croatia,34.5,EUR,Final day (over 2 hours) +Croatia,-34.5,EUR,2+ Meals +Croatia,16,EUR,Night Travel supplement +Cuba,68,EUR,Full day (over 24 hours) +Cuba,68,EUR,Final day (over 10 hours) +Cuba,34,EUR,Final day (over 2 hours) +Cuba,-34,EUR,2+ Meals +Cuba,16,EUR,Night Travel supplement +Curaçao,58,EUR,Full day (over 24 hours) +Curaçao,58,EUR,Final day (over 10 hours) +Curaçao,29,EUR,Final day (over 2 hours) +Curaçao,-29,EUR,2+ Meals +Curaçao,16,EUR,Night Travel supplement +Cyprus,65,EUR,Full day (over 24 hours) +Cyprus,65,EUR,Final day (over 10 hours) +Cyprus,32.5,EUR,Final day (over 2 hours) +Cyprus,-32.5,EUR,2+ Meals +Cyprus,16,EUR,Night Travel supplement +Czech Republic,89,EUR,Full day (over 24 hours) +Czech Republic,89,EUR,Final day (over 10 hours) +Czech Republic,44.5,EUR,Final day (over 2 hours) +Czech Republic,-44.5,EUR,2+ Meals +Czech Republic,16,EUR,Night Travel supplement +Denmark,79,EUR,Full day (over 24 hours) +Denmark,79,EUR,Final day (over 10 hours) +Denmark,39.5,EUR,Final day (over 2 hours) +Denmark,-39.5,EUR,2+ Meals +Denmark,16,EUR,Night Travel supplement +Djibouti,83,EUR,Full day (over 24 hours) +Djibouti,83,EUR,Final day (over 10 hours) +Djibouti,41.5,EUR,Final day (over 2 hours) +Djibouti,-41.5,EUR,2+ Meals +Djibouti,16,EUR,Night Travel supplement +Dominica,61,EUR,Full day (over 24 hours) +Dominica,61,EUR,Final day (over 10 hours) +Dominica,30.5,EUR,Final day (over 2 hours) +Dominica,-30.5,EUR,2+ Meals +Dominica,16,EUR,Night Travel supplement +Dominican Republic,53,EUR,Full day (over 24 hours) +Dominican Republic,53,EUR,Final day (over 10 hours) +Dominican Republic,26.5,EUR,Final day (over 2 hours) +Dominican Republic,-26.5,EUR,2+ Meals +Dominican Republic,16,EUR,Night Travel supplement +East Timor,46,EUR,Full day (over 24 hours) +East Timor,46,EUR,Final day (over 10 hours) +East Timor,23,EUR,Final day (over 2 hours) +East Timor,-23,EUR,2+ Meals +East Timor,16,EUR,Night Travel supplement +Ecuador,63,EUR,Full day (over 24 hours) +Ecuador,63,EUR,Final day (over 10 hours) +Ecuador,31.5,EUR,Final day (over 2 hours) +Ecuador,-31.5,EUR,2+ Meals +Ecuador,16,EUR,Night Travel supplement +Egypt,66,EUR,Full day (over 24 hours) +Egypt,66,EUR,Final day (over 10 hours) +Egypt,33,EUR,Final day (over 2 hours) +Egypt,-33,EUR,2+ Meals +Egypt,16,EUR,Night Travel supplement +El Salvador,60,EUR,Full day (over 24 hours) +El Salvador,60,EUR,Final day (over 10 hours) +El Salvador,30,EUR,Final day (over 2 hours) +El Salvador,-30,EUR,2+ Meals +El Salvador,16,EUR,Night Travel supplement +Eritrea,95,EUR,Full day (over 24 hours) +Eritrea,95,EUR,Final day (over 10 hours) +Eritrea,47.5,EUR,Final day (over 2 hours) +Eritrea,-47.5,EUR,2+ Meals +Eritrea,16,EUR,Night Travel supplement +Estonia,75,EUR,Full day (over 24 hours) +Estonia,75,EUR,Final day (over 10 hours) +Estonia,37.5,EUR,Final day (over 2 hours) +Estonia,-37.5,EUR,2+ Meals +Estonia,16,EUR,Night Travel supplement +Eswatini,37,EUR,Full day (over 24 hours) +Eswatini,37,EUR,Final day (over 10 hours) +Eswatini,18.5,EUR,Final day (over 2 hours) +Eswatini,-18.5,EUR,2+ Meals +Eswatini,16,EUR,Night Travel supplement +Ethiopia,49,EUR,Full day (over 24 hours) +Ethiopia,49,EUR,Final day (over 10 hours) +Ethiopia,24.5,EUR,Final day (over 2 hours) +Ethiopia,-24.5,EUR,2+ Meals +Ethiopia,16,EUR,Night Travel supplement +Faroe Islands,61,EUR,Full day (over 24 hours) +Faroe Islands,61,EUR,Final day (over 10 hours) +Faroe Islands,30.5,EUR,Final day (over 2 hours) +Faroe Islands,-30.5,EUR,2+ Meals +Faroe Islands,16,EUR,Night Travel supplement +Fiji,52,EUR,Full day (over 24 hours) +Fiji,52,EUR,Final day (over 10 hours) +Fiji,26,EUR,Final day (over 2 hours) +Fiji,-26,EUR,2+ Meals +Fiji,16,EUR,Night Travel supplement +France,78,EUR,Full day (over 24 hours) +France,78,EUR,Final day (over 10 hours) +France,39,EUR,Final day (over 2 hours) +France,-39,EUR,2+ Meals +France,16,EUR,Night Travel supplement +Gabon,92,EUR,Full day (over 24 hours) +Gabon,92,EUR,Final day (over 10 hours) +Gabon,46,EUR,Final day (over 2 hours) +Gabon,-46,EUR,2+ Meals +Gabon,16,EUR,Night Travel supplement +Gambia,46,EUR,Full day (over 24 hours) +Gambia,46,EUR,Final day (over 10 hours) +Gambia,23,EUR,Final day (over 2 hours) +Gambia,-23,EUR,2+ Meals +Gambia,16,EUR,Night Travel supplement +Georgia,49,EUR,Full day (over 24 hours) +Georgia,49,EUR,Final day (over 10 hours) +Georgia,24.5,EUR,Final day (over 2 hours) +Georgia,-24.5,EUR,2+ Meals +Georgia,16,EUR,Night Travel supplement +Germany,76,EUR,Full day (over 24 hours) +Germany,76,EUR,Final day (over 10 hours) +Germany,38,EUR,Final day (over 2 hours) +Germany,-38,EUR,2+ Meals +Germany,16,EUR,Night Travel supplement +Ghana,47,EUR,Full day (over 24 hours) +Ghana,47,EUR,Final day (over 10 hours) +Ghana,23.5,EUR,Final day (over 2 hours) +Ghana,-23.5,EUR,2+ Meals +Ghana,16,EUR,Night Travel supplement +Greece,68,EUR,Full day (over 24 hours) +Greece,68,EUR,Final day (over 10 hours) +Greece,34,EUR,Final day (over 2 hours) +Greece,-34,EUR,2+ Meals +Greece,16,EUR,Night Travel supplement +Greenland,63,EUR,Full day (over 24 hours) +Greenland,63,EUR,Final day (over 10 hours) +Greenland,31.5,EUR,Final day (over 2 hours) +Greenland,-31.5,EUR,2+ Meals +Greenland,16,EUR,Night Travel supplement +Grenada,73,EUR,Full day (over 24 hours) +Grenada,73,EUR,Final day (over 10 hours) +Grenada,36.5,EUR,Final day (over 2 hours) +Grenada,-36.5,EUR,2+ Meals +Grenada,16,EUR,Night Travel supplement +Guadeloupe,53,EUR,Full day (over 24 hours) +Guadeloupe,53,EUR,Final day (over 10 hours) +Guadeloupe,26.5,EUR,Final day (over 2 hours) +Guadeloupe,-26.5,EUR,2+ Meals +Guadeloupe,16,EUR,Night Travel supplement +Guatemala,76,EUR,Full day (over 24 hours) +Guatemala,76,EUR,Final day (over 10 hours) +Guatemala,38,EUR,Final day (over 2 hours) +Guatemala,-38,EUR,2+ Meals +Guatemala,16,EUR,Night Travel supplement +Guinea,83,EUR,Full day (over 24 hours) +Guinea,83,EUR,Final day (over 10 hours) +Guinea,41.5,EUR,Final day (over 2 hours) +Guinea,-41.5,EUR,2+ Meals +Guinea,16,EUR,Night Travel supplement +Guinea-Bissau,41,EUR,Full day (over 24 hours) +Guinea-Bissau,41,EUR,Final day (over 10 hours) +Guinea-Bissau,20.5,EUR,Final day (over 2 hours) +Guinea-Bissau,-20.5,EUR,2+ Meals +Guinea-Bissau,16,EUR,Night Travel supplement +Guyana,51,EUR,Full day (over 24 hours) +Guyana,51,EUR,Final day (over 10 hours) +Guyana,25.5,EUR,Final day (over 2 hours) +Guyana,-25.5,EUR,2+ Meals +Guyana,16,EUR,Night Travel supplement +Haiti,62,EUR,Full day (over 24 hours) +Haiti,62,EUR,Final day (over 10 hours) +Haiti,31,EUR,Final day (over 2 hours) +Haiti,-31,EUR,2+ Meals +Haiti,16,EUR,Night Travel supplement +Honduras,58,EUR,Full day (over 24 hours) +Honduras,58,EUR,Final day (over 10 hours) +Honduras,29,EUR,Final day (over 2 hours) +Honduras,-29,EUR,2+ Meals +Honduras,16,EUR,Night Travel supplement +Hong Kong,86,EUR,Full day (over 24 hours) +Hong Kong,86,EUR,Final day (over 10 hours) +Hong Kong,43,EUR,Final day (over 2 hours) +Hong Kong,-43,EUR,2+ Meals +Hong Kong,16,EUR,Night Travel supplement +Hungary,69,EUR,Full day (over 24 hours) +Hungary,69,EUR,Final day (over 10 hours) +Hungary,34.5,EUR,Final day (over 2 hours) +Hungary,-34.5,EUR,2+ Meals +Hungary,16,EUR,Night Travel supplement +Iceland,92,EUR,Full day (over 24 hours) +Iceland,92,EUR,Final day (over 10 hours) +Iceland,46,EUR,Final day (over 2 hours) +Iceland,-46,EUR,2+ Meals +Iceland,16,EUR,Night Travel supplement +India,62,EUR,Full day (over 24 hours) +India,62,EUR,Final day (over 10 hours) +India,31,EUR,Final day (over 2 hours) +India,-31,EUR,2+ Meals +India,16,EUR,Night Travel supplement +Indonesia,57,EUR,Full day (over 24 hours) +Indonesia,57,EUR,Final day (over 10 hours) +Indonesia,28.5,EUR,Final day (over 2 hours) +Indonesia,-28.5,EUR,2+ Meals +Indonesia,16,EUR,Night Travel supplement +Iran,102,EUR,Full day (over 24 hours) +Iran,102,EUR,Final day (over 10 hours) +Iran,51,EUR,Final day (over 2 hours) +Iran,-51,EUR,2+ Meals +Iran,16,EUR,Night Travel supplement +Iraq,70,EUR,Full day (over 24 hours) +Iraq,70,EUR,Final day (over 10 hours) +Iraq,35,EUR,Final day (over 2 hours) +Iraq,-35,EUR,2+ Meals +Iraq,16,EUR,Night Travel supplement +Ireland,78,EUR,Full day (over 24 hours) +Ireland,78,EUR,Final day (over 10 hours) +Ireland,39,EUR,Final day (over 2 hours) +Ireland,-39,EUR,2+ Meals +Ireland,16,EUR,Night Travel supplement +Israel,88,EUR,Full day (over 24 hours) +Israel,88,EUR,Final day (over 10 hours) +Israel,44,EUR,Final day (over 2 hours) +Israel,-44,EUR,2+ Meals +Israel,16,EUR,Night Travel supplement +Istanbul,37,EUR,Full day (over 24 hours) +Istanbul,37,EUR,Final day (over 10 hours) +Istanbul,18.5,EUR,Final day (over 2 hours) +Istanbul,-18.5,EUR,2+ Meals +Istanbul,16,EUR,Night Travel supplement +Italy,76,EUR,Full day (over 24 hours) +Italy,76,EUR,Final day (over 10 hours) +Italy,38,EUR,Final day (over 2 hours) +Italy,-38,EUR,2+ Meals +Italy,16,EUR,Night Travel supplement +"Ivory Coast, Côte d’Ivoire",80,EUR,Full day (over 24 hours) +"Ivory Coast, Côte d’Ivoire",80,EUR,Final day (over 10 hours) +"Ivory Coast, Côte d’Ivoire",40,EUR,Final day (over 2 hours) +"Ivory Coast, Côte d’Ivoire",-40,EUR,2+ Meals +"Ivory Coast, Côte d’Ivoire",16,EUR,Night Travel supplement +Jamaica,62,EUR,Full day (over 24 hours) +Jamaica,62,EUR,Final day (over 10 hours) +Jamaica,31,EUR,Final day (over 2 hours) +Jamaica,-31,EUR,2+ Meals +Jamaica,16,EUR,Night Travel supplement +Japan,66,EUR,Full day (over 24 hours) +Japan,66,EUR,Final day (over 10 hours) +Japan,33,EUR,Final day (over 2 hours) +Japan,-33,EUR,2+ Meals +Japan,16,EUR,Night Travel supplement +Jordania,90,EUR,Full day (over 24 hours) +Jordania,90,EUR,Final day (over 10 hours) +Jordania,45,EUR,Final day (over 2 hours) +Jordania,-45,EUR,2+ Meals +Jordania,16,EUR,Night Travel supplement +Kazakhstan,59,EUR,Full day (over 24 hours) +Kazakhstan,59,EUR,Final day (over 10 hours) +Kazakhstan,29.5,EUR,Final day (over 2 hours) +Kazakhstan,-29.5,EUR,2+ Meals +Kazakhstan,16,EUR,Night Travel supplement +Kenya,70,EUR,Full day (over 24 hours) +Kenya,70,EUR,Final day (over 10 hours) +Kenya,35,EUR,Final day (over 2 hours) +Kenya,-35,EUR,2+ Meals +Kenya,16,EUR,Night Travel supplement +"Korea, Democratic People's Republic (North Korea)",70,EUR,Full day (over 24 hours) +"Korea, Democratic People's Republic (North Korea)",70,EUR,Final day (over 10 hours) +"Korea, Democratic People's Republic (North Korea)",35,EUR,Final day (over 2 hours) +"Korea, Democratic People's Republic (North Korea)",-35,EUR,2+ Meals +"Korea, Democratic People's Republic (North Korea)",16,EUR,Night Travel supplement +"Korea, Republic of (South Korea)",87,EUR,Full day (over 24 hours) +"Korea, Republic of (South Korea)",87,EUR,Final day (over 10 hours) +"Korea, Republic of (South Korea)",43.5,EUR,Final day (over 2 hours) +"Korea, Republic of (South Korea)",-43.5,EUR,2+ Meals +"Korea, Republic of (South Korea)",16,EUR,Night Travel supplement +Kosovo,58,EUR,Full day (over 24 hours) +Kosovo,58,EUR,Final day (over 10 hours) +Kosovo,29,EUR,Final day (over 2 hours) +Kosovo,-29,EUR,2+ Meals +Kosovo,16,EUR,Night Travel supplement +Kuwait,84,EUR,Full day (over 24 hours) +Kuwait,84,EUR,Final day (over 10 hours) +Kuwait,42,EUR,Final day (over 2 hours) +Kuwait,-42,EUR,2+ Meals +Kuwait,16,EUR,Night Travel supplement +Kyrgystan,41,EUR,Full day (over 24 hours) +Kyrgystan,41,EUR,Final day (over 10 hours) +Kyrgystan,20.5,EUR,Final day (over 2 hours) +Kyrgystan,-20.5,EUR,2+ Meals +Kyrgystan,16,EUR,Night Travel supplement +Laos,32,EUR,Full day (over 24 hours) +Laos,32,EUR,Final day (over 10 hours) +Laos,16,EUR,Final day (over 2 hours) +Laos,-16,EUR,2+ Meals +Laos,16,EUR,Night Travel supplement +Latvia,73,EUR,Full day (over 24 hours) +Latvia,73,EUR,Final day (over 10 hours) +Latvia,36.5,EUR,Final day (over 2 hours) +Latvia,-36.5,EUR,2+ Meals +Latvia,16,EUR,Night Travel supplement +Lebanon,102,EUR,Full day (over 24 hours) +Lebanon,102,EUR,Final day (over 10 hours) +Lebanon,51,EUR,Final day (over 2 hours) +Lebanon,-51,EUR,2+ Meals +Lebanon,16,EUR,Night Travel supplement +Lesotho,34,EUR,Full day (over 24 hours) +Lesotho,34,EUR,Final day (over 10 hours) +Lesotho,17,EUR,Final day (over 2 hours) +Lesotho,-17,EUR,2+ Meals +Lesotho,16,EUR,Night Travel supplement +Liberia,60,EUR,Full day (over 24 hours) +Liberia,60,EUR,Final day (over 10 hours) +Liberia,30,EUR,Final day (over 2 hours) +Liberia,-30,EUR,2+ Meals +Liberia,16,EUR,Night Travel supplement +Libya,52,EUR,Full day (over 24 hours) +Libya,52,EUR,Final day (over 10 hours) +Libya,26,EUR,Final day (over 2 hours) +Libya,-26,EUR,2+ Meals +Libya,16,EUR,Night Travel supplement +Liechtenstein,79,EUR,Full day (over 24 hours) +Liechtenstein,79,EUR,Final day (over 10 hours) +Liechtenstein,39.5,EUR,Final day (over 2 hours) +Liechtenstein,-39.5,EUR,2+ Meals +Liechtenstein,16,EUR,Night Travel supplement +Lithuania,72,EUR,Full day (over 24 hours) +Lithuania,72,EUR,Final day (over 10 hours) +Lithuania,36,EUR,Final day (over 2 hours) +Lithuania,-36,EUR,2+ Meals +Lithuania,16,EUR,Night Travel supplement +London and Edinburgh,83,EUR,Full day (over 24 hours) +London and Edinburgh,83,EUR,Final day (over 10 hours) +London and Edinburgh,41.5,EUR,Final day (over 2 hours) +London and Edinburgh,-41.5,EUR,2+ Meals +London and Edinburgh,16,EUR,Night Travel supplement +Luxembourg,77,EUR,Full day (over 24 hours) +Luxembourg,77,EUR,Final day (over 10 hours) +Luxembourg,38.5,EUR,Final day (over 2 hours) +Luxembourg,-38.5,EUR,2+ Meals +Luxembourg,16,EUR,Night Travel supplement +Madagascar,45,EUR,Full day (over 24 hours) +Madagascar,45,EUR,Final day (over 10 hours) +Madagascar,22.5,EUR,Final day (over 2 hours) +Madagascar,-22.5,EUR,2+ Meals +Madagascar,16,EUR,Night Travel supplement +Madeira,68,EUR,Full day (over 24 hours) +Madeira,68,EUR,Final day (over 10 hours) +Madeira,34,EUR,Final day (over 2 hours) +Madeira,-34,EUR,2+ Meals +Madeira,16,EUR,Night Travel supplement +Malawi,77,EUR,Full day (over 24 hours) +Malawi,77,EUR,Final day (over 10 hours) +Malawi,38.5,EUR,Final day (over 2 hours) +Malawi,-38.5,EUR,2+ Meals +Malawi,16,EUR,Night Travel supplement +Malaysia,50,EUR,Full day (over 24 hours) +Malaysia,50,EUR,Final day (over 10 hours) +Malaysia,25,EUR,Final day (over 2 hours) +Malaysia,-25,EUR,2+ Meals +Malaysia,16,EUR,Night Travel supplement +Maldives,68,EUR,Full day (over 24 hours) +Maldives,68,EUR,Final day (over 10 hours) +Maldives,34,EUR,Final day (over 2 hours) +Maldives,-34,EUR,2+ Meals +Maldives,16,EUR,Night Travel supplement +Mali,47,EUR,Full day (over 24 hours) +Mali,47,EUR,Final day (over 10 hours) +Mali,23.5,EUR,Final day (over 2 hours) +Mali,-23.5,EUR,2+ Meals +Mali,16,EUR,Night Travel supplement +Malta,71,EUR,Full day (over 24 hours) +Malta,71,EUR,Final day (over 10 hours) +Malta,35.5,EUR,Final day (over 2 hours) +Malta,-35.5,EUR,2+ Meals +Malta,16,EUR,Night Travel supplement +Marshall Islands,65,EUR,Full day (over 24 hours) +Marshall Islands,65,EUR,Final day (over 10 hours) +Marshall Islands,32.5,EUR,Final day (over 2 hours) +Marshall Islands,-32.5,EUR,2+ Meals +Marshall Islands,16,EUR,Night Travel supplement +Martinique,55,EUR,Full day (over 24 hours) +Martinique,55,EUR,Final day (over 10 hours) +Martinique,27.5,EUR,Final day (over 2 hours) +Martinique,-27.5,EUR,2+ Meals +Martinique,16,EUR,Night Travel supplement +Mauritania,52,EUR,Full day (over 24 hours) +Mauritania,52,EUR,Final day (over 10 hours) +Mauritania,26,EUR,Final day (over 2 hours) +Mauritania,-26,EUR,2+ Meals +Mauritania,16,EUR,Night Travel supplement +Mauritius,53,EUR,Full day (over 24 hours) +Mauritius,53,EUR,Final day (over 10 hours) +Mauritius,26.5,EUR,Final day (over 2 hours) +Mauritius,-26.5,EUR,2+ Meals +Mauritius,16,EUR,Night Travel supplement +Mexico,81,EUR,Full day (over 24 hours) +Mexico,81,EUR,Final day (over 10 hours) +Mexico,40.5,EUR,Final day (over 2 hours) +Mexico,-40.5,EUR,2+ Meals +Mexico,16,EUR,Night Travel supplement +Micronesia,59,EUR,Full day (over 24 hours) +Micronesia,59,EUR,Final day (over 10 hours) +Micronesia,29.5,EUR,Final day (over 2 hours) +Micronesia,-29.5,EUR,2+ Meals +Micronesia,16,EUR,Night Travel supplement +Moldova,73,EUR,Full day (over 24 hours) +Moldova,73,EUR,Final day (over 10 hours) +Moldova,36.5,EUR,Final day (over 2 hours) +Moldova,-36.5,EUR,2+ Meals +Moldova,16,EUR,Night Travel supplement +Monaco,92,EUR,Full day (over 24 hours) +Monaco,92,EUR,Final day (over 10 hours) +Monaco,46,EUR,Final day (over 2 hours) +Monaco,-46,EUR,2+ Meals +Monaco,16,EUR,Night Travel supplement +Mongolia,42,EUR,Full day (over 24 hours) +Mongolia,42,EUR,Final day (over 10 hours) +Mongolia,21,EUR,Final day (over 2 hours) +Mongolia,-21,EUR,2+ Meals +Mongolia,16,EUR,Night Travel supplement +Montenegro,66,EUR,Full day (over 24 hours) +Montenegro,66,EUR,Final day (over 10 hours) +Montenegro,33,EUR,Final day (over 2 hours) +Montenegro,-33,EUR,2+ Meals +Montenegro,16,EUR,Night Travel supplement +Morocco,71,EUR,Full day (over 24 hours) +Morocco,71,EUR,Final day (over 10 hours) +Morocco,35.5,EUR,Final day (over 2 hours) +Morocco,-35.5,EUR,2+ Meals +Morocco,16,EUR,Night Travel supplement +Moscow,82,EUR,Full day (over 24 hours) +Moscow,82,EUR,Final day (over 10 hours) +Moscow,41,EUR,Final day (over 2 hours) +Moscow,-41,EUR,2+ Meals +Moscow,16,EUR,Night Travel supplement +Mozambique,53,EUR,Full day (over 24 hours) +Mozambique,53,EUR,Final day (over 10 hours) +Mozambique,26.5,EUR,Final day (over 2 hours) +Mozambique,-26.5,EUR,2+ Meals +Mozambique,16,EUR,Night Travel supplement +Myanmar (formerly Burma),58,EUR,Full day (over 24 hours) +Myanmar (formerly Burma),58,EUR,Final day (over 10 hours) +Myanmar (formerly Burma),29,EUR,Final day (over 2 hours) +Myanmar (formerly Burma),-29,EUR,2+ Meals +Myanmar (formerly Burma),16,EUR,Night Travel supplement +Namibia,36,EUR,Full day (over 24 hours) +Namibia,36,EUR,Final day (over 10 hours) +Namibia,18,EUR,Final day (over 2 hours) +Namibia,-18,EUR,2+ Meals +Namibia,16,EUR,Night Travel supplement +Nepal,51,EUR,Full day (over 24 hours) +Nepal,51,EUR,Final day (over 10 hours) +Nepal,25.5,EUR,Final day (over 2 hours) +Nepal,-25.5,EUR,2+ Meals +Nepal,16,EUR,Night Travel supplement +Netherlands,83,EUR,Full day (over 24 hours) +Netherlands,83,EUR,Final day (over 10 hours) +Netherlands,41.5,EUR,Final day (over 2 hours) +Netherlands,-41.5,EUR,2+ Meals +Netherlands,16,EUR,Night Travel supplement +"New York, Los Angeles, Washington",97,EUR,Full day (over 24 hours) +"New York, Los Angeles, Washington",97,EUR,Final day (over 10 hours) +"New York, Los Angeles, Washington",48.5,EUR,Final day (over 2 hours) +"New York, Los Angeles, Washington",-48.5,EUR,2+ Meals +"New York, Los Angeles, Washington",16,EUR,Night Travel supplement +New Zealand,74,EUR,Full day (over 24 hours) +New Zealand,74,EUR,Final day (over 10 hours) +New Zealand,37,EUR,Final day (over 2 hours) +New Zealand,-37,EUR,2+ Meals +New Zealand,16,EUR,Night Travel supplement +Nicaragua,51,EUR,Full day (over 24 hours) +Nicaragua,51,EUR,Final day (over 10 hours) +Nicaragua,25.5,EUR,Final day (over 2 hours) +Nicaragua,-25.5,EUR,2+ Meals +Nicaragua,16,EUR,Night Travel supplement +Niger,50,EUR,Full day (over 24 hours) +Niger,50,EUR,Final day (over 10 hours) +Niger,25,EUR,Final day (over 2 hours) +Niger,-25,EUR,2+ Meals +Niger,16,EUR,Night Travel supplement +Nigeria,78,EUR,Full day (over 24 hours) +Nigeria,78,EUR,Final day (over 10 hours) +Nigeria,39,EUR,Final day (over 2 hours) +Nigeria,-39,EUR,2+ Meals +Nigeria,16,EUR,Night Travel supplement +North Macedonia,64,EUR,Full day (over 24 hours) +North Macedonia,64,EUR,Final day (over 10 hours) +North Macedonia,32,EUR,Final day (over 2 hours) +North Macedonia,-32,EUR,2+ Meals +North Macedonia,16,EUR,Night Travel supplement +Norway,70,EUR,Full day (over 24 hours) +Norway,70,EUR,Final day (over 10 hours) +Norway,35,EUR,Final day (over 2 hours) +Norway,-35,EUR,2+ Meals +Norway,16,EUR,Night Travel supplement +Oman,74,EUR,Full day (over 24 hours) +Oman,74,EUR,Final day (over 10 hours) +Oman,37,EUR,Final day (over 2 hours) +Oman,-37,EUR,2+ Meals +Oman,16,EUR,Night Travel supplement +Pakistan,29,EUR,Full day (over 24 hours) +Pakistan,29,EUR,Final day (over 10 hours) +Pakistan,14.5,EUR,Final day (over 2 hours) +Pakistan,-14.5,EUR,2+ Meals +Pakistan,16,EUR,Night Travel supplement +Palau,99,EUR,Full day (over 24 hours) +Palau,99,EUR,Final day (over 10 hours) +Palau,49.5,EUR,Final day (over 2 hours) +Palau,-49.5,EUR,2+ Meals +Palau,16,EUR,Night Travel supplement +Palestinian territory,76,EUR,Full day (over 24 hours) +Palestinian territory,76,EUR,Final day (over 10 hours) +Palestinian territory,38,EUR,Final day (over 2 hours) +Palestinian territory,-38,EUR,2+ Meals +Palestinian territory,16,EUR,Night Travel supplement +Panama,61,EUR,Full day (over 24 hours) +Panama,61,EUR,Final day (over 10 hours) +Panama,30.5,EUR,Final day (over 2 hours) +Panama,-30.5,EUR,2+ Meals +Panama,16,EUR,Night Travel supplement +Papua New Guinea,76,EUR,Full day (over 24 hours) +Papua New Guinea,76,EUR,Final day (over 10 hours) +Papua New Guinea,38,EUR,Final day (over 2 hours) +Papua New Guinea,-38,EUR,2+ Meals +Papua New Guinea,16,EUR,Night Travel supplement +Paraguay,36,EUR,Full day (over 24 hours) +Paraguay,36,EUR,Final day (over 10 hours) +Paraguay,18,EUR,Final day (over 2 hours) +Paraguay,-18,EUR,2+ Meals +Paraguay,16,EUR,Night Travel supplement +Peru,52,EUR,Full day (over 24 hours) +Peru,52,EUR,Final day (over 10 hours) +Peru,26,EUR,Final day (over 2 hours) +Peru,-26,EUR,2+ Meals +Peru,16,EUR,Night Travel supplement +Philippines,69,EUR,Full day (over 24 hours) +Philippines,69,EUR,Final day (over 10 hours) +Philippines,34.5,EUR,Final day (over 2 hours) +Philippines,-34.5,EUR,2+ Meals +Philippines,16,EUR,Night Travel supplement +Poland,72,EUR,Full day (over 24 hours) +Poland,72,EUR,Final day (over 10 hours) +Poland,36,EUR,Final day (over 2 hours) +Poland,-36,EUR,2+ Meals +Poland,16,EUR,Night Travel supplement +Portugal,70,EUR,Full day (over 24 hours) +Portugal,70,EUR,Final day (over 10 hours) +Portugal,35,EUR,Final day (over 2 hours) +Portugal,-35,EUR,2+ Meals +Portugal,16,EUR,Night Travel supplement +Puerto Rico,70,EUR,Full day (over 24 hours) +Puerto Rico,70,EUR,Final day (over 10 hours) +Puerto Rico,35,EUR,Final day (over 2 hours) +Puerto Rico,-35,EUR,2+ Meals +Puerto Rico,16,EUR,Night Travel supplement +Qatar,78,EUR,Full day (over 24 hours) +Qatar,78,EUR,Final day (over 10 hours) +Qatar,39,EUR,Final day (over 2 hours) +Qatar,-39,EUR,2+ Meals +Qatar,16,EUR,Night Travel supplement +Romania,68,EUR,Full day (over 24 hours) +Romania,68,EUR,Final day (over 10 hours) +Romania,34,EUR,Final day (over 2 hours) +Romania,-34,EUR,2+ Meals +Romania,16,EUR,Night Travel supplement +Russian Federation,66,EUR,Full day (over 24 hours) +Russian Federation,66,EUR,Final day (over 10 hours) +Russian Federation,33,EUR,Final day (over 2 hours) +Russian Federation,-33,EUR,2+ Meals +Russian Federation,16,EUR,Night Travel supplement +Rwanda,37,EUR,Full day (over 24 hours) +Rwanda,37,EUR,Final day (over 10 hours) +Rwanda,18.5,EUR,Final day (over 2 hours) +Rwanda,-18.5,EUR,2+ Meals +Rwanda,16,EUR,Night Travel supplement +Saint Kitts and Nevis,68,EUR,Full day (over 24 hours) +Saint Kitts and Nevis,68,EUR,Final day (over 10 hours) +Saint Kitts and Nevis,34,EUR,Final day (over 2 hours) +Saint Kitts and Nevis,-34,EUR,2+ Meals +Saint Kitts and Nevis,16,EUR,Night Travel supplement +Saint Lucia,86,EUR,Full day (over 24 hours) +Saint Lucia,86,EUR,Final day (over 10 hours) +Saint Lucia,43,EUR,Final day (over 2 hours) +Saint Lucia,-43,EUR,2+ Meals +Saint Lucia,16,EUR,Night Travel supplement +Saint Vincent and the Grenadines,85,EUR,Full day (over 24 hours) +Saint Vincent and the Grenadines,85,EUR,Final day (over 10 hours) +Saint Vincent and the Grenadines,42.5,EUR,Final day (over 2 hours) +Saint Vincent and the Grenadines,-42.5,EUR,2+ Meals +Saint Vincent and the Grenadines,16,EUR,Night Travel supplement +Samoa,61,EUR,Full day (over 24 hours) +Samoa,61,EUR,Final day (over 10 hours) +Samoa,30.5,EUR,Final day (over 2 hours) +Samoa,-30.5,EUR,2+ Meals +Samoa,16,EUR,Night Travel supplement +San Marino,59,EUR,Full day (over 24 hours) +San Marino,59,EUR,Final day (over 10 hours) +San Marino,29.5,EUR,Final day (over 2 hours) +San Marino,-29.5,EUR,2+ Meals +San Marino,16,EUR,Night Travel supplement +Sao Tome and Principe,102,EUR,Full day (over 24 hours) +Sao Tome and Principe,102,EUR,Final day (over 10 hours) +Sao Tome and Principe,51,EUR,Final day (over 2 hours) +Sao Tome and Principe,-51,EUR,2+ Meals +Sao Tome and Principe,16,EUR,Night Travel supplement +Saudi Arabia,80,EUR,Full day (over 24 hours) +Saudi Arabia,80,EUR,Final day (over 10 hours) +Saudi Arabia,40,EUR,Final day (over 2 hours) +Saudi Arabia,-40,EUR,2+ Meals +Saudi Arabia,16,EUR,Night Travel supplement +Senegal,58,EUR,Full day (over 24 hours) +Senegal,58,EUR,Final day (over 10 hours) +Senegal,29,EUR,Final day (over 2 hours) +Senegal,-29,EUR,2+ Meals +Senegal,16,EUR,Night Travel supplement +Serbia,75,EUR,Full day (over 24 hours) +Serbia,75,EUR,Final day (over 10 hours) +Serbia,37.5,EUR,Final day (over 2 hours) +Serbia,-37.5,EUR,2+ Meals +Serbia,16,EUR,Night Travel supplement +Seychelles,87,EUR,Full day (over 24 hours) +Seychelles,87,EUR,Final day (over 10 hours) +Seychelles,43.5,EUR,Final day (over 2 hours) +Seychelles,-43.5,EUR,2+ Meals +Seychelles,16,EUR,Night Travel supplement +Sierra Leone,47,EUR,Full day (over 24 hours) +Sierra Leone,47,EUR,Final day (over 10 hours) +Sierra Leone,23.5,EUR,Final day (over 2 hours) +Sierra Leone,-23.5,EUR,2+ Meals +Sierra Leone,16,EUR,Night Travel supplement +Singapore,79,EUR,Full day (over 24 hours) +Singapore,79,EUR,Final day (over 10 hours) +Singapore,39.5,EUR,Final day (over 2 hours) +Singapore,-39.5,EUR,2+ Meals +Singapore,16,EUR,Night Travel supplement +Slovakia,79,EUR,Full day (over 24 hours) +Slovakia,79,EUR,Final day (over 10 hours) +Slovakia,39.5,EUR,Final day (over 2 hours) +Slovakia,-39.5,EUR,2+ Meals +Slovakia,16,EUR,Night Travel supplement +Slovenia,72,EUR,Full day (over 24 hours) +Slovenia,72,EUR,Final day (over 10 hours) +Slovenia,36,EUR,Final day (over 2 hours) +Slovenia,-36,EUR,2+ Meals +Slovenia,16,EUR,Night Travel supplement +Solomon Islands,63,EUR,Full day (over 24 hours) +Solomon Islands,63,EUR,Final day (over 10 hours) +Solomon Islands,31.5,EUR,Final day (over 2 hours) +Solomon Islands,-31.5,EUR,2+ Meals +Solomon Islands,16,EUR,Night Travel supplement +Somalia,86,EUR,Full day (over 24 hours) +Somalia,86,EUR,Final day (over 10 hours) +Somalia,43,EUR,Final day (over 2 hours) +Somalia,-43,EUR,2+ Meals +Somalia,16,EUR,Night Travel supplement +South Africa,50,EUR,Full day (over 24 hours) +South Africa,50,EUR,Final day (over 10 hours) +South Africa,25,EUR,Final day (over 2 hours) +South Africa,-25,EUR,2+ Meals +South Africa,16,EUR,Night Travel supplement +South Sudan,102,EUR,Full day (over 24 hours) +South Sudan,102,EUR,Final day (over 10 hours) +South Sudan,51,EUR,Final day (over 2 hours) +South Sudan,-51,EUR,2+ Meals +South Sudan,16,EUR,Night Travel supplement +Spain,74,EUR,Full day (over 24 hours) +Spain,74,EUR,Final day (over 10 hours) +Spain,37,EUR,Final day (over 2 hours) +Spain,-37,EUR,2+ Meals +Spain,16,EUR,Night Travel supplement +Sri Lanka,29,EUR,Full day (over 24 hours) +Sri Lanka,29,EUR,Final day (over 10 hours) +Sri Lanka,14.5,EUR,Final day (over 2 hours) +Sri Lanka,-14.5,EUR,2+ Meals +Sri Lanka,16,EUR,Night Travel supplement +St. Petersburg,76,EUR,Full day (over 24 hours) +St. Petersburg,76,EUR,Final day (over 10 hours) +St. Petersburg,38,EUR,Final day (over 2 hours) +St. Petersburg,-38,EUR,2+ Meals +St. Petersburg,16,EUR,Night Travel supplement +Sudan,83,EUR,Full day (over 24 hours) +Sudan,83,EUR,Final day (over 10 hours) +Sudan,41.5,EUR,Final day (over 2 hours) +Sudan,-41.5,EUR,2+ Meals +Sudan,16,EUR,Night Travel supplement +Suriname,78,EUR,Full day (over 24 hours) +Suriname,78,EUR,Final day (over 10 hours) +Suriname,39,EUR,Final day (over 2 hours) +Suriname,-39,EUR,2+ Meals +Suriname,16,EUR,Night Travel supplement +Sweden,64,EUR,Full day (over 24 hours) +Sweden,64,EUR,Final day (over 10 hours) +Sweden,32,EUR,Final day (over 2 hours) +Sweden,-32,EUR,2+ Meals +Sweden,16,EUR,Night Travel supplement +Switzerland,93,EUR,Full day (over 24 hours) +Switzerland,93,EUR,Final day (over 10 hours) +Switzerland,46.5,EUR,Final day (over 2 hours) +Switzerland,-46.5,EUR,2+ Meals +Switzerland,16,EUR,Night Travel supplement +Syria,91,EUR,Full day (over 24 hours) +Syria,91,EUR,Final day (over 10 hours) +Syria,45.5,EUR,Final day (over 2 hours) +Syria,-45.5,EUR,2+ Meals +Syria,16,EUR,Night Travel supplement +Tadzhikistan,35,EUR,Full day (over 24 hours) +Tadzhikistan,35,EUR,Final day (over 10 hours) +Tadzhikistan,17.5,EUR,Final day (over 2 hours) +Tadzhikistan,-17.5,EUR,2+ Meals +Tadzhikistan,16,EUR,Night Travel supplement +Taiwan,69,EUR,Full day (over 24 hours) +Taiwan,69,EUR,Final day (over 10 hours) +Taiwan,34.5,EUR,Final day (over 2 hours) +Taiwan,-34.5,EUR,2+ Meals +Taiwan,16,EUR,Night Travel supplement +Tanzania,54,EUR,Full day (over 24 hours) +Tanzania,54,EUR,Final day (over 10 hours) +Tanzania,27,EUR,Final day (over 2 hours) +Tanzania,-27,EUR,2+ Meals +Tanzania,16,EUR,Night Travel supplement +Thailand,63,EUR,Full day (over 24 hours) +Thailand,63,EUR,Final day (over 10 hours) +Thailand,31.5,EUR,Final day (over 2 hours) +Thailand,-31.5,EUR,2+ Meals +Thailand,16,EUR,Night Travel supplement +Togo,58,EUR,Full day (over 24 hours) +Togo,58,EUR,Final day (over 10 hours) +Togo,29,EUR,Final day (over 2 hours) +Togo,-29,EUR,2+ Meals +Togo,16,EUR,Night Travel supplement +Tonga,62,EUR,Full day (over 24 hours) +Tonga,62,EUR,Final day (over 10 hours) +Tonga,31,EUR,Final day (over 2 hours) +Tonga,-31,EUR,2+ Meals +Tonga,16,EUR,Night Travel supplement +Trinidad and Tobago,83,EUR,Full day (over 24 hours) +Trinidad and Tobago,83,EUR,Final day (over 10 hours) +Trinidad and Tobago,41.5,EUR,Final day (over 2 hours) +Trinidad and Tobago,-41.5,EUR,2+ Meals +Trinidad and Tobago,16,EUR,Night Travel supplement +Tunisia,61,EUR,Full day (over 24 hours) +Tunisia,61,EUR,Final day (over 10 hours) +Tunisia,30.5,EUR,Final day (over 2 hours) +Tunisia,-30.5,EUR,2+ Meals +Tunisia,16,EUR,Night Travel supplement +Turkey,35,EUR,Full day (over 24 hours) +Turkey,35,EUR,Final day (over 10 hours) +Turkey,17.5,EUR,Final day (over 2 hours) +Turkey,-17.5,EUR,2+ Meals +Turkey,16,EUR,Night Travel supplement +Turkmenistan,92,EUR,Full day (over 24 hours) +Turkmenistan,92,EUR,Final day (over 10 hours) +Turkmenistan,46,EUR,Final day (over 2 hours) +Turkmenistan,-46,EUR,2+ Meals +Turkmenistan,16,EUR,Night Travel supplement +Uganda,49,EUR,Full day (over 24 hours) +Uganda,49,EUR,Final day (over 10 hours) +Uganda,24.5,EUR,Final day (over 2 hours) +Uganda,-24.5,EUR,2+ Meals +Uganda,16,EUR,Night Travel supplement +Ukraine,64,EUR,Full day (over 24 hours) +Ukraine,64,EUR,Final day (over 10 hours) +Ukraine,32,EUR,Final day (over 2 hours) +Ukraine,-32,EUR,2+ Meals +Ukraine,16,EUR,Night Travel supplement +United Arab Emirates,73,EUR,Full day (over 24 hours) +United Arab Emirates,73,EUR,Final day (over 10 hours) +United Arab Emirates,36.5,EUR,Final day (over 2 hours) +United Arab Emirates,-36.5,EUR,2+ Meals +United Arab Emirates,16,EUR,Night Travel supplement +United Kingdom,79,EUR,Full day (over 24 hours) +United Kingdom,79,EUR,Final day (over 10 hours) +United Kingdom,39.5,EUR,Final day (over 2 hours) +United Kingdom,-39.5,EUR,2+ Meals +United Kingdom,16,EUR,Night Travel supplement +United States,89,EUR,Full day (over 24 hours) +United States,89,EUR,Final day (over 10 hours) +United States,44.5,EUR,Final day (over 2 hours) +United States,-44.5,EUR,2+ Meals +United States,16,EUR,Night Travel supplement +Uruguay,59,EUR,Full day (over 24 hours) +Uruguay,59,EUR,Final day (over 10 hours) +Uruguay,29.5,EUR,Final day (over 2 hours) +Uruguay,-29.5,EUR,2+ Meals +Uruguay,16,EUR,Night Travel supplement +Uzbekistan,32,EUR,Full day (over 24 hours) +Uzbekistan,32,EUR,Final day (over 10 hours) +Uzbekistan,16,EUR,Final day (over 2 hours) +Uzbekistan,-16,EUR,2+ Meals +Uzbekistan,16,EUR,Night Travel supplement +Vanuatu,70,EUR,Full day (over 24 hours) +Vanuatu,70,EUR,Final day (over 10 hours) +Vanuatu,35,EUR,Final day (over 2 hours) +Vanuatu,-35,EUR,2+ Meals +Vanuatu,16,EUR,Night Travel supplement +Venezuela,102,EUR,Full day (over 24 hours) +Venezuela,102,EUR,Final day (over 10 hours) +Venezuela,51,EUR,Final day (over 2 hours) +Venezuela,-51,EUR,2+ Meals +Venezuela,16,EUR,Night Travel supplement +Viet Nam,69,EUR,Full day (over 24 hours) +Viet Nam,69,EUR,Final day (over 10 hours) +Viet Nam,34.5,EUR,Final day (over 2 hours) +Viet Nam,-34.5,EUR,2+ Meals +Viet Nam,16,EUR,Night Travel supplement +Virgin Islands (USA),64,EUR,Full day (over 24 hours) +Virgin Islands (USA),64,EUR,Final day (over 10 hours) +Virgin Islands (USA),32,EUR,Final day (over 2 hours) +Virgin Islands (USA),-32,EUR,2+ Meals +Virgin Islands (USA),16,EUR,Night Travel supplement +Yemen,102,EUR,Full day (over 24 hours) +Yemen,102,EUR,Final day (over 10 hours) +Yemen,51,EUR,Final day (over 2 hours) +Yemen,-51,EUR,2+ Meals +Yemen,16,EUR,Night Travel supplement +Zambia,55,EUR,Full day (over 24 hours) +Zambia,55,EUR,Final day (over 10 hours) +Zambia,27.5,EUR,Final day (over 2 hours) +Zambia,-27.5,EUR,2+ Meals +Zambia,16,EUR,Night Travel supplement +Zimbabwe,102,EUR,Full day (over 24 hours) +Zimbabwe,102,EUR,Final day (over 10 hours) +Zimbabwe,51,EUR,Final day (over 2 hours) +Zimbabwe,-51,EUR,2+ Meals +Zimbabwe,16,EUR,Night Travel supplement From b2842ca9af89ae65716a48ac771a4b225595239e Mon Sep 17 00:00:00 2001 From: Ted Harris Date: Wed, 2 Oct 2024 12:48:04 +0100 Subject: [PATCH 410/555] Update Enable-per-diem-expenses.md --- .../expensify-classic/workspaces/Enable-per-diem-expenses.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/articles/expensify-classic/workspaces/Enable-per-diem-expenses.md b/docs/articles/expensify-classic/workspaces/Enable-per-diem-expenses.md index 2d2f1b5afddc..87b03e2e69ee 100644 --- a/docs/articles/expensify-classic/workspaces/Enable-per-diem-expenses.md +++ b/docs/articles/expensify-classic/workspaces/Enable-per-diem-expenses.md @@ -16,6 +16,7 @@ To enable and set per diem rates, 6. Create a .csv, .txt, .xls, or .xlsx spreadsheet containing four columns: Destination, Sub-rate, Amount, and Currency. You’ll want a different row for each location that an employee may travel to, which may include states and/or countries to help account for cost differences across various locations. Here are some example templates you can use: - [Germany rates]({{site.url}}/assets/Files/Germany-per-diem.csv) - [Sweden rates]({{site.url}}/assets/Files/Sweden-per-diem.csv) + - [Finland rates]({{site.url}}/assets/Files/Finland-per-diem.csv) - [South Africa single rates]({{site.url}}/assets/Files/South-Africa-per-diem.csv) 7. Click **Import from spreadsheet**. 8. Click **Upload** to select your spreadsheet. From bd074ad4e05bd5d130f2febe4ed06b52b1d1a8d9 Mon Sep 17 00:00:00 2001 From: cdOut <88325488+cdOut@users.noreply.github.com> Date: Wed, 2 Oct 2024 13:51:10 +0200 Subject: [PATCH 411/555] fix prettier --- src/components/AddPaymentMethodMenu.tsx | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/components/AddPaymentMethodMenu.tsx b/src/components/AddPaymentMethodMenu.tsx index f21f3e119fb0..50c7d530a3c2 100644 --- a/src/components/AddPaymentMethodMenu.tsx +++ b/src/components/AddPaymentMethodMenu.tsx @@ -4,6 +4,7 @@ import type {View} from 'react-native'; import type {OnyxEntry} from 'react-native-onyx'; import {withOnyx} from 'react-native-onyx'; import useLocalize from '@hooks/useLocalize'; +import {completePaymentOnboarding} from '@libs/actions/IOU'; import * as ReportActionsUtils from '@libs/ReportActionsUtils'; import * as ReportUtils from '@libs/ReportUtils'; import CONST from '@src/CONST'; @@ -15,7 +16,6 @@ import * as Expensicons from './Icon/Expensicons'; import type {PaymentMethod} from './KYCWall/types'; import type BaseModalProps from './Modal/types'; import PopoverMenu from './PopoverMenu'; -import { completePaymentOnboarding } from '@libs/actions/IOU'; type AddPaymentMethodMenuOnyxProps = { /** Session info for the currently logged-in user. */ @@ -110,8 +110,8 @@ function AddPaymentMethodMenu({ text: translate('common.personalBankAccount'), icon: Expensicons.Bank, onSelected: () => { - completePaymentOnboarding(CONST.PAYMENT_SELECTED.PBA); - onItemSelected(CONST.PAYMENT_METHODS.PERSONAL_BANK_ACCOUNT); + completePaymentOnboarding(CONST.PAYMENT_SELECTED.PBA); + onItemSelected(CONST.PAYMENT_METHODS.PERSONAL_BANK_ACCOUNT); }, }, ] @@ -122,8 +122,8 @@ function AddPaymentMethodMenu({ text: translate('common.businessBankAccount'), icon: Expensicons.Building, onSelected: () => { - completePaymentOnboarding(CONST.PAYMENT_SELECTED.BBA); - onItemSelected(CONST.PAYMENT_METHODS.BUSINESS_BANK_ACCOUNT); + completePaymentOnboarding(CONST.PAYMENT_SELECTED.BBA); + onItemSelected(CONST.PAYMENT_METHODS.BUSINESS_BANK_ACCOUNT); }, }, ] From 00944c0ddbf6ba7171e0aad89490fdd57828e871 Mon Sep 17 00:00:00 2001 From: Christoph Pader Date: Wed, 2 Oct 2024 13:51:51 +0200 Subject: [PATCH 412/555] fix: patches --- ...4.0.0-beta.13+001+rn75-compatibility.patch | 47 +++++++++++++------ ...stack-unmount-recycle-camera-session.patch | 2 +- 2 files changed, 34 insertions(+), 15 deletions(-) diff --git a/patches/react-native-vision-camera+4.0.0-beta.13+001+rn75-compatibility.patch b/patches/react-native-vision-camera+4.0.0-beta.13+001+rn75-compatibility.patch index b66b659dab57..4e0961ec536a 100644 --- a/patches/react-native-vision-camera+4.0.0-beta.13+001+rn75-compatibility.patch +++ b/patches/react-native-vision-camera+4.0.0-beta.13+001+rn75-compatibility.patch @@ -1335,7 +1335,7 @@ index 0000000..46c2c2c +#endif /* RCT_NEW_ARCH_ENABLED */ diff --git a/node_modules/react-native-vision-camera/ios/RNCameraView.mm b/node_modules/react-native-vision-camera/ios/RNCameraView.mm new file mode 100644 -index 0000000..b90427e +index 0000000..019be20 --- /dev/null +++ b/node_modules/react-native-vision-camera/ios/RNCameraView.mm @@ -0,0 +1,377 @@ @@ -1384,7 +1384,7 @@ index 0000000..b90427e + + //The remaining part of the initializer is standard Objective-C code to create views and layout them with AutoLayout. Here we can change whatever we want to. + _view = [[CameraView alloc] init]; -+ _view.delegate = self; ++ _view.delegate = self; + + self.contentView = _view; +} @@ -1397,9 +1397,9 @@ index 0000000..b90427e +{ + const auto &newViewProps = *std::static_pointer_cast(props); + const auto &oldViewProps = *std::static_pointer_cast(_props); -+ ++ + NSMutableArray* changedProps = [[NSMutableArray alloc] init]; -+ ++ + if(oldViewProps.isActive != newViewProps.isActive){ + _view.isActive = newViewProps.isActive; + [changedProps addObject:@"isActive"]; @@ -1496,12 +1496,12 @@ index 0000000..b90427e + _view.enableFpsGraph = newViewProps.enableFpsGraph; + [changedProps addObject:@"enableFpsGraph"]; + } -+ -+ ++ ++ + if(_view.format == nil){ + _view.format =[ [NSMutableDictionary alloc] init]; + } -+ ++ + + //Checking format props, TODO: find cleaner way to do it + if(oldViewProps.format.supportsDepthCapture != newViewProps.format.supportsDepthCapture){ @@ -1521,7 +1521,7 @@ index 0000000..b90427e + [_view.format setValue:newPixelFormats forKey:@"pixelFormats"]; + [changedProps addObject:@"format"]; + } -+ ++ + if(oldViewProps.format.videoStabilizationModes.size() != newViewProps.format.videoStabilizationModes.size()){ + NSMutableArray* newVideoStabilizationModes = [[NSMutableArray alloc] init]; + for(int i = 0; i < newViewProps.format.videoStabilizationModes.size(); i++){ @@ -1530,7 +1530,7 @@ index 0000000..b90427e + [_view.format setValue:newVideoStabilizationModes forKey:@"videoStabilizationModes"]; + [changedProps addObject:@"format"]; + } -+ ++ + if(oldViewProps.format.photoHeight != newViewProps.format.photoHeight){ + [_view.format setValue:[NSNumber numberWithDouble:newViewProps.format.photoHeight] forKey:@"photoHeight"]; + [changedProps addObject:@"format"]; @@ -1578,11 +1578,11 @@ index 0000000..b90427e + [_view.format setValue:supportsPhotoHDR forKey:@"supportsPhotoHDR"]; + [changedProps addObject:@"format"]; + } -+ ++ + if (_view.format.count == 0) { + _view.format = nil; + } -+ ++ + if(_view.codeScannerOptions == nil){ + _view.codeScannerOptions =[[NSMutableDictionary alloc] init]; + } @@ -1595,12 +1595,12 @@ index 0000000..b90427e + [_view.codeScannerOptions setValue:newCodeTypes forKey:@"codeTypes"]; + [changedProps addObject:@"codeScannerOptions"]; + } -+ ++ + if(oldViewProps.codeScannerOptions.interval != newViewProps.codeScannerOptions.interval){ + [_view.codeScannerOptions setValue:[NSNumber numberWithDouble:newViewProps.codeScannerOptions.interval] forKey:@"interval"]; + [changedProps addObject:@"codeScannerOptions"]; + } -+ ++ + if( + oldViewProps.codeScannerOptions.regionOfInterest.x != newViewProps.codeScannerOptions.regionOfInterest.x || + oldViewProps.codeScannerOptions.regionOfInterest.y != newViewProps.codeScannerOptions.regionOfInterest.y || @@ -1616,7 +1616,7 @@ index 0000000..b90427e + [_view.codeScannerOptions setValue:newRegionOfInterest forKey:@"regionOfInterest"]; + [changedProps addObject:@"codeScannerOptions"]; + } -+ ++ + if (_view.codeScannerOptions.count == 0) { + _view.codeScannerOptions = nil; + } @@ -2005,6 +2005,25 @@ index 0000000..e47e42f @@ -0,0 +1 @@ +{"version":3,"file":"CameraViewNativeComponent.d.ts","sourceRoot":"","sources":["../../../src/specs/CameraViewNativeComponent.ts"],"names":[],"mappings":";;AACA,OAAO,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAC7D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,2CAA2C,CAAC;AAGnG,MAAM,MAAM,yBAAyB,GAAG,aAAa,CAAC,WAAW,CAAC,CAAC;AAEnE,MAAM,WAAW,WAAY,SAAQ,SAAS;IAC5C,gBAAgB,EAAE,OAAO,CAAC;IAC1B,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,oBAAoB,EAAE,OAAO,CAAC;IAC9B,cAAc,EAAE,OAAO,CAAC;IACxB,uBAAuB,EAAE,OAAO,CAAC;IACjC,mBAAmB,EAAE,MAAM,CAAC;IAC5B,QAAQ,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,QAAQ,CAAC;QAChB,oBAAoB,CAAC,EAAE,OAAO,CAAC;QAC/B,WAAW,EAAE,MAAM,CAAC;QACpB,UAAU,EAAE,MAAM,CAAC;QACnB,WAAW,EAAE,MAAM,CAAC;QACpB,UAAU,EAAE,MAAM,CAAC;QACnB,MAAM,EAAE,MAAM,CAAC;QACf,MAAM,EAAE,MAAM,CAAC;QACf,MAAM,EAAE,MAAM,CAAC;QACf,MAAM,EAAE,MAAM,CAAC;QACf,WAAW,EAAE,MAAM,CAAC;QACpB,gBAAgB,EAAE,OAAO,CAAC;QAC1B,gBAAgB,EAAE,OAAO,CAAC;QAC1B,eAAe,EAAE,MAAM,CAAC;QACxB,uBAAuB,EAAE,MAAM,EAAE,CAAC;QAClC,YAAY,EAAE,MAAM,EAAE,CAAC;KACxB,CAAC,CAAC;IACH,WAAW,EAAE,MAAM,CAAC;IACpB,GAAG,CAAC,EAAE,KAAK,CAAC;IACZ,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,kCAAkC,CAAC,EAAE,OAAO,CAAC;IAC7C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,kBAAkB,CAAC,EAAE,QAAQ,CAAC;QAC5B,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;QACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,gBAAgB,CAAC,EAAE,QAAQ,CAAC;YAC1B,CAAC,CAAC,EAAE,MAAM,CAAC;YACX,CAAC,CAAC,EAAE,MAAM,CAAC;YACX,KAAK,CAAC,EAAE,MAAM,CAAC;YACf,MAAM,CAAC,EAAE,MAAM,CAAC;SACjB,CAAC,CAAC;KACJ,CAAC,CAAC;IACH,aAAa,CAAC,EAAE,kBAAkB,CAChC,QAAQ,CAAC;QACP,KAAK,CAAC,EAAE,QAAQ,CAAC;YACf,IAAI,CAAC,EAAE,MAAM,CAAC;YACd,KAAK,CAAC,EAAE,MAAM,CAAC;YACf,KAAK,CAAC,EAAE,QAAQ,CAAC;gBAAE,CAAC,EAAE,MAAM,CAAC;gBAAC,CAAC,EAAE,MAAM,CAAC;gBAAC,KAAK,EAAE,MAAM,CAAC;gBAAC,MAAM,EAAE,MAAM,CAAA;aAAC,CAAC,CAAC;SAC1E,CAAC,CAAC;QACH,KAAK,CAAC,EAAE,QAAQ,CAAC;YAAE,KAAK,EAAE,KAAK,CAAC;YAAC,MAAM,EAAE,KAAK,CAAA;SAAE,CAAC,CAAC;QAClD,OAAO,CAAC,EAAE,QAAQ,CAAC;YAAE,CAAC,EAAE,MAAM,CAAC;YAAC,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;KAC9C,CAAC,CACH,CAAC;IACF,SAAS,CAAC,EAAE,kBAAkB,CAC5B,QAAQ,CAAC;QACP,IAAI,EAAE,MAAM,CAAC;KACd,CAAC,CACH,CAAC;IACF,SAAS,CAAC,EAAE,kBAAkB,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC;IAC7C,SAAS,CAAC,EAAE,kBAAkB,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC;IAC7C,aAAa,CAAC,EAAE,kBAAkB,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC;IACjD,OAAO,CAAC,EAAE,kBAAkB,CAC1B,QAAQ,CAAC;QACP,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;QAChB,KAAK,EAAE,QAAQ,CAAC;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,MAAM,CAAC;YAAC,OAAO,EAAE,MAAM,CAAC;YAAC,OAAO,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;KACrF,CAAC,CACH,CAAC;IACF,WAAW,EAAE,kBAAkB,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC;CAC/C;;AAED,wBAAiE"} \ No newline at end of file +diff --git a/node_modules/react-native-vision-camera/package.json b/node_modules/react-native-vision-camera/package.json +index 86352fa..7af9577 100644 +--- a/node_modules/react-native-vision-camera/package.json ++++ b/node_modules/react-native-vision-camera/package.json +@@ -166,5 +166,13 @@ + ] + ] + }, +- "packageManager": "yarn@1.22.19+sha1.4ba7fc5c6e704fce2066ecbfb0b0d8976fe62447" ++ "codegenConfig": { ++ "name": "RNVisioncameraSpec", ++ "type": "all", ++ "jsSrcsDir": "./src/specs", ++ "android": { ++ "javaPackageName": "com.mrousavy.camera" ++ } ++ }, ++ "packageManager": "yarn@1.22.19" + } diff --git a/node_modules/react-native-vision-camera/src/Camera.tsx b/node_modules/react-native-vision-camera/src/Camera.tsx index 18733ba..1668322 100644 --- a/node_modules/react-native-vision-camera/src/Camera.tsx diff --git a/patches/react-native-vision-camera+4.0.0-beta.13+002+native-stack-unmount-recycle-camera-session.patch b/patches/react-native-vision-camera+4.0.0-beta.13+002+native-stack-unmount-recycle-camera-session.patch index 311e5c96e2f8..ac9bda68f9d9 100644 --- a/patches/react-native-vision-camera+4.0.0-beta.13+002+native-stack-unmount-recycle-camera-session.patch +++ b/patches/react-native-vision-camera+4.0.0-beta.13+002+native-stack-unmount-recycle-camera-session.patch @@ -12,7 +12,7 @@ index b90427e..0be4171 100644 -if (self) { - static const auto defaultProps = std::make_shared(); +- (void) initCamera { -+ static const auto defaultProps = std::make_shared(); ++ static const auto defaultProps = std::make_shared(); _props = defaultProps; - //The remaining part of the initializer is standard Objective-C code to create views and layout them with AutoLayout. Here we can change whatever we want to. From 8016c3c77654b948daa68a7bf8a4d52331faa278 Mon Sep 17 00:00:00 2001 From: cdOut <88325488+cdOut@users.noreply.github.com> Date: Wed, 2 Oct 2024 13:57:44 +0200 Subject: [PATCH 413/555] refactor AddPaymentMethodMenu into useOnyx --- src/components/AddPaymentMethodMenu.tsx | 17 ++++------------- 1 file changed, 4 insertions(+), 13 deletions(-) diff --git a/src/components/AddPaymentMethodMenu.tsx b/src/components/AddPaymentMethodMenu.tsx index 50c7d530a3c2..934083faab17 100644 --- a/src/components/AddPaymentMethodMenu.tsx +++ b/src/components/AddPaymentMethodMenu.tsx @@ -2,7 +2,7 @@ import type {RefObject} from 'react'; import React, {useEffect, useState} from 'react'; import type {View} from 'react-native'; import type {OnyxEntry} from 'react-native-onyx'; -import {withOnyx} from 'react-native-onyx'; +import {useOnyx} from 'react-native-onyx'; import useLocalize from '@hooks/useLocalize'; import {completePaymentOnboarding} from '@libs/actions/IOU'; import * as ReportActionsUtils from '@libs/ReportActionsUtils'; @@ -17,12 +17,7 @@ import type {PaymentMethod} from './KYCWall/types'; import type BaseModalProps from './Modal/types'; import PopoverMenu from './PopoverMenu'; -type AddPaymentMethodMenuOnyxProps = { - /** Session info for the currently logged-in user. */ - session: OnyxEntry; -}; - -type AddPaymentMethodMenuProps = AddPaymentMethodMenuOnyxProps & { +type AddPaymentMethodMenuProps = { /** Should the component be visible? */ isVisible: boolean; @@ -59,11 +54,11 @@ function AddPaymentMethodMenu({ anchorRef, iouReport, onItemSelected, - session, shouldShowPersonalBankAccountOption = false, }: AddPaymentMethodMenuProps) { const {translate} = useLocalize(); const [restoreFocusType, setRestoreFocusType] = useState(); + const [session] = useOnyx(ONYXKEYS.SESSION); // Users can choose to pay with business bank account in case of Expense reports or in case of P2P IOU report // which then starts a bottom up flow and creates a Collect workspace where the payer is an admin and payee is an employee. @@ -146,8 +141,4 @@ function AddPaymentMethodMenu({ AddPaymentMethodMenu.displayName = 'AddPaymentMethodMenu'; -export default withOnyx({ - session: { - key: ONYXKEYS.SESSION, - }, -})(AddPaymentMethodMenu); +export default AddPaymentMethodMenu; From e656ec4fd61503250cb42b256ef361e890b14171 Mon Sep 17 00:00:00 2001 From: Anusha <93134676+Nodebrute@users.noreply.github.com> Date: Wed, 2 Oct 2024 17:14:41 +0500 Subject: [PATCH 414/555] Update src/components/DeeplinkWrapper/DeeplinkRedirectLoadingIndicator.tsx Co-authored-by: Rory Abraham <47436092+roryabraham@users.noreply.github.com> --- .../DeeplinkWrapper/DeeplinkRedirectLoadingIndicator.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/DeeplinkWrapper/DeeplinkRedirectLoadingIndicator.tsx b/src/components/DeeplinkWrapper/DeeplinkRedirectLoadingIndicator.tsx index 96288d052fdb..0f3d881c5f52 100644 --- a/src/components/DeeplinkWrapper/DeeplinkRedirectLoadingIndicator.tsx +++ b/src/components/DeeplinkWrapper/DeeplinkRedirectLoadingIndicator.tsx @@ -21,7 +21,7 @@ function DeeplinkRedirectLoadingIndicator({openLinkInBrowser}: DeeplinkRedirectL const {translate} = useLocalize(); const theme = useTheme(); const styles = useThemeStyles(); - const [session] = useOnyx(ONYXKEYS.SESSION); + const [email] = useOnyx(ONYXKEYS.SESSION, {selector: (session) => session?.email ?? ''}); return ( From d425f25b00dbb0ed0707bfa2937aed4762dcb23e Mon Sep 17 00:00:00 2001 From: cdOut <88325488+cdOut@users.noreply.github.com> Date: Wed, 2 Oct 2024 14:24:23 +0200 Subject: [PATCH 415/555] fix eslint errors --- src/components/AddPaymentMethodMenu.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/AddPaymentMethodMenu.tsx b/src/components/AddPaymentMethodMenu.tsx index 934083faab17..0057438e3913 100644 --- a/src/components/AddPaymentMethodMenu.tsx +++ b/src/components/AddPaymentMethodMenu.tsx @@ -10,7 +10,7 @@ import * as ReportUtils from '@libs/ReportUtils'; import CONST from '@src/CONST'; import ONYXKEYS from '@src/ONYXKEYS'; import type {AnchorPosition} from '@src/styles'; -import type {Report, Session} from '@src/types/onyx'; +import type {Report} from '@src/types/onyx'; import type AnchorAlignment from '@src/types/utils/AnchorAlignment'; import * as Expensicons from './Icon/Expensicons'; import type {PaymentMethod} from './KYCWall/types'; From bb654254ae4fb02abbd0dcd9d3617926efdd20bc Mon Sep 17 00:00:00 2001 From: Anusha Date: Wed, 2 Oct 2024 17:29:07 +0500 Subject: [PATCH 416/555] use email instead of session --- .../DeeplinkWrapper/DeeplinkRedirectLoadingIndicator.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/DeeplinkWrapper/DeeplinkRedirectLoadingIndicator.tsx b/src/components/DeeplinkWrapper/DeeplinkRedirectLoadingIndicator.tsx index 0f3d881c5f52..0b5f7b82c547 100644 --- a/src/components/DeeplinkWrapper/DeeplinkRedirectLoadingIndicator.tsx +++ b/src/components/DeeplinkWrapper/DeeplinkRedirectLoadingIndicator.tsx @@ -34,7 +34,7 @@ function DeeplinkRedirectLoadingIndicator({openLinkInBrowser}: DeeplinkRedirectL {translate('deeplinkWrapper.launching')} - {translate('deeplinkWrapper.loggedInAs', {email: session?.email ?? ''})} + {translate('deeplinkWrapper.loggedInAs', {email})} {translate('deeplinkWrapper.doNotSeePrompt')} openLinkInBrowser(true)}>{translate('deeplinkWrapper.tryAgain')} {translate('deeplinkWrapper.or')} Navigation.goBack()}>{translate('deeplinkWrapper.continueInWeb')}. From ec5aacf6bb3b1c90eed169b9110574c07848660f Mon Sep 17 00:00:00 2001 From: Anusha Date: Wed, 2 Oct 2024 17:35:24 +0500 Subject: [PATCH 417/555] fix type error --- src/languages/types.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/languages/types.ts b/src/languages/types.ts index a7a11fafb27b..03f8d3d25334 100644 --- a/src/languages/types.ts +++ b/src/languages/types.ts @@ -1,3 +1,4 @@ +import {OnyxEntry} from 'react-native-onyx'; import type {OnyxInputOrEntry, ReportAction} from '@src/types/onyx'; import type {Unit} from '@src/types/onyx/Policy'; import type {ViolationDataType} from '@src/types/onyx/TransactionViolation'; @@ -16,7 +17,7 @@ type ZipCodeExampleFormatParams = { }; type LoggedInAsParams = { - email: string; + email: OnyxEntry; }; type SignUpNewFaceCodeParams = { From a5313b59bf67060ab50b49ae2c11497d52b16d5d Mon Sep 17 00:00:00 2001 From: Anusha Date: Wed, 2 Oct 2024 17:38:35 +0500 Subject: [PATCH 418/555] resolve conflicts --- src/languages/types.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/languages/types.ts b/src/languages/types.ts index 03f8d3d25334..975df98d9c90 100644 --- a/src/languages/types.ts +++ b/src/languages/types.ts @@ -17,7 +17,7 @@ type ZipCodeExampleFormatParams = { }; type LoggedInAsParams = { - email: OnyxEntry; + email: string; }; type SignUpNewFaceCodeParams = { From 5c5d29f3c9b46bd1bb9e9a4089ac4a233e9bc95d Mon Sep 17 00:00:00 2001 From: Anusha Date: Wed, 2 Oct 2024 17:39:59 +0500 Subject: [PATCH 419/555] resolve --- src/languages/types.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/languages/types.ts b/src/languages/types.ts index 975df98d9c90..a7a11fafb27b 100644 --- a/src/languages/types.ts +++ b/src/languages/types.ts @@ -1,4 +1,3 @@ -import {OnyxEntry} from 'react-native-onyx'; import type {OnyxInputOrEntry, ReportAction} from '@src/types/onyx'; import type {Unit} from '@src/types/onyx/Policy'; import type {ViolationDataType} from '@src/types/onyx/TransactionViolation'; From 3329f6c8d603b5598bc7b52d27ab2ea9927cab07 Mon Sep 17 00:00:00 2001 From: Anusha Date: Wed, 2 Oct 2024 17:43:45 +0500 Subject: [PATCH 420/555] type error fixed --- src/languages/params.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/languages/params.ts b/src/languages/params.ts index 5560316d2ddd..744589c06f08 100644 --- a/src/languages/params.ts +++ b/src/languages/params.ts @@ -1,3 +1,4 @@ +import {OnyxEntry} from 'react-native-onyx'; import type {OnyxInputOrEntry, ReportAction} from '@src/types/onyx'; import type {DelegateRole} from '@src/types/onyx/Account'; import type {AllConnectionName, ConnectionName, PolicyConnectionSyncStage, SageIntacctMappingName, Unit} from '@src/types/onyx/Policy'; @@ -25,7 +26,7 @@ type ZipCodeExampleFormatParams = { }; type LoggedInAsParams = { - email: string; + email: OnyxEntry; }; type SignUpNewFaceCodeParams = { From 6439b7bbc2cc31c73618bb9bd8da04e850d7b17b Mon Sep 17 00:00:00 2001 From: Mykhailo Kravchenko Date: Wed, 2 Oct 2024 15:12:14 +0200 Subject: [PATCH 421/555] refactor ReportActionItemMessage for useOnyx --- .../home/report/ReportActionItemMessage.tsx | 21 ++++++------------- 1 file changed, 6 insertions(+), 15 deletions(-) diff --git a/src/pages/home/report/ReportActionItemMessage.tsx b/src/pages/home/report/ReportActionItemMessage.tsx index 41b36fb3e2de..da2f3dd151c8 100644 --- a/src/pages/home/report/ReportActionItemMessage.tsx +++ b/src/pages/home/report/ReportActionItemMessage.tsx @@ -2,8 +2,7 @@ import type {ReactElement} from 'react'; import React from 'react'; import type {StyleProp, TextStyle, ViewStyle} from 'react-native'; import {View} from 'react-native'; -import {withOnyx} from 'react-native-onyx'; -import type {OnyxEntry} from 'react-native-onyx'; +import {useOnyx} from 'react-native-onyx'; import Button from '@components/Button'; import Text from '@components/Text'; import useLocalize from '@hooks/useLocalize'; @@ -14,16 +13,11 @@ import * as ReportUtils from '@libs/ReportUtils'; import CONST from '@src/CONST'; import ONYXKEYS from '@src/ONYXKEYS'; import ROUTES from '@src/ROUTES'; -import type {ReportAction, Transaction} from '@src/types/onyx'; +import type {ReportAction} from '@src/types/onyx'; import TextCommentFragment from './comment/TextCommentFragment'; import ReportActionItemFragment from './ReportActionItemFragment'; -type ReportActionItemMessageOnyxProps = { - /** The transaction linked to the report action. */ - transaction: OnyxEntry; -}; - -type ReportActionItemMessageProps = ReportActionItemMessageOnyxProps & { +type ReportActionItemMessageProps = { /** The report action */ action: ReportAction; @@ -40,9 +34,10 @@ type ReportActionItemMessageProps = ReportActionItemMessageOnyxProps & { reportID: string; }; -function ReportActionItemMessage({action, transaction, displayAsGroup, reportID, style, isHidden = false}: ReportActionItemMessageProps) { +function ReportActionItemMessage({action, displayAsGroup, reportID, style, isHidden = false}: ReportActionItemMessageProps) { const styles = useThemeStyles(); const {translate} = useLocalize(); + const [transaction] = useOnyx(`${ONYXKEYS.COLLECTION.TRANSACTION}${ReportActionsUtils.getLinkedTransactionID(action) ?? -1}`); const fragments = ReportActionsUtils.getReportActionMessageFragments(action); const isIOUReport = ReportActionsUtils.isMoneyRequestAction(action); @@ -159,8 +154,4 @@ function ReportActionItemMessage({action, transaction, displayAsGroup, reportID, ReportActionItemMessage.displayName = 'ReportActionItemMessage'; -export default withOnyx({ - transaction: { - key: ({action}) => `${ONYXKEYS.COLLECTION.TRANSACTION}${ReportActionsUtils.getLinkedTransactionID(action) ?? -1}`, - }, -})(ReportActionItemMessage); +export default ReportActionItemMessage; From c22556d8f5df18ea8386cbf7b45637f4cded0784 Mon Sep 17 00:00:00 2001 From: Anusha Date: Wed, 2 Oct 2024 18:24:15 +0500 Subject: [PATCH 422/555] fix userlogin --- .../DeeplinkWrapper/DeeplinkRedirectLoadingIndicator.tsx | 4 ++-- src/languages/params.ts | 3 +-- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/src/components/DeeplinkWrapper/DeeplinkRedirectLoadingIndicator.tsx b/src/components/DeeplinkWrapper/DeeplinkRedirectLoadingIndicator.tsx index 0b5f7b82c547..d2a622bf7d8d 100644 --- a/src/components/DeeplinkWrapper/DeeplinkRedirectLoadingIndicator.tsx +++ b/src/components/DeeplinkWrapper/DeeplinkRedirectLoadingIndicator.tsx @@ -21,7 +21,7 @@ function DeeplinkRedirectLoadingIndicator({openLinkInBrowser}: DeeplinkRedirectL const {translate} = useLocalize(); const theme = useTheme(); const styles = useThemeStyles(); - const [email] = useOnyx(ONYXKEYS.SESSION, {selector: (session) => session?.email ?? ''}); + const [currentUserLogin] = useOnyx(ONYXKEYS.SESSION, {selector: (session) => session?.email}); return ( @@ -34,7 +34,7 @@ function DeeplinkRedirectLoadingIndicator({openLinkInBrowser}: DeeplinkRedirectL {translate('deeplinkWrapper.launching')} - {translate('deeplinkWrapper.loggedInAs', {email})} + {translate('deeplinkWrapper.loggedInAs', {email: currentUserLogin ?? ''})} {translate('deeplinkWrapper.doNotSeePrompt')} openLinkInBrowser(true)}>{translate('deeplinkWrapper.tryAgain')} {translate('deeplinkWrapper.or')} Navigation.goBack()}>{translate('deeplinkWrapper.continueInWeb')}. diff --git a/src/languages/params.ts b/src/languages/params.ts index 744589c06f08..5560316d2ddd 100644 --- a/src/languages/params.ts +++ b/src/languages/params.ts @@ -1,4 +1,3 @@ -import {OnyxEntry} from 'react-native-onyx'; import type {OnyxInputOrEntry, ReportAction} from '@src/types/onyx'; import type {DelegateRole} from '@src/types/onyx/Account'; import type {AllConnectionName, ConnectionName, PolicyConnectionSyncStage, SageIntacctMappingName, Unit} from '@src/types/onyx/Policy'; @@ -26,7 +25,7 @@ type ZipCodeExampleFormatParams = { }; type LoggedInAsParams = { - email: OnyxEntry; + email: string; }; type SignUpNewFaceCodeParams = { From 1be218652113e09ef2a967bdde894a09afa4da3c Mon Sep 17 00:00:00 2001 From: Shubham Agrawal Date: Wed, 2 Oct 2024 19:38:26 +0530 Subject: [PATCH 423/555] Fix name of component --- src/pages/MissingPersonalDetails/substeps/Confirmation.tsx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/pages/MissingPersonalDetails/substeps/Confirmation.tsx b/src/pages/MissingPersonalDetails/substeps/Confirmation.tsx index 8cc570ea0e04..b5c27912cd6a 100644 --- a/src/pages/MissingPersonalDetails/substeps/Confirmation.tsx +++ b/src/pages/MissingPersonalDetails/substeps/Confirmation.tsx @@ -14,7 +14,7 @@ import INPUT_IDS from '@src/types/form/PersonalDetailsForm'; const PERSONAL_DETAILS_STEP_INDEXES = CONST.MISSING_PERSONAL_DETAILS_INDEXES.MAPPING; -function Confirmation({personalDetailsValues: values, onNext, onMove}: CustomSubStepProps) { +function ConfirmationStep({personalDetailsValues: values, onNext, onMove}: CustomSubStepProps) { const {translate} = useLocalize(); const styles = useThemeStyles(); const {isOffline} = useNetwork(); @@ -77,6 +77,6 @@ function Confirmation({personalDetailsValues: values, onNext, onMove}: CustomSub ); } -Confirmation.displayName = 'ConfirmationStep'; +ConfirmationStep.displayName = 'ConfirmationStep'; -export default Confirmation; +export default ConfirmationStep; From 48e49236733d7f5a9ffce8feda21ec157bcbce15 Mon Sep 17 00:00:00 2001 From: Georgia Monahan Date: Wed, 2 Oct 2024 15:32:34 +0100 Subject: [PATCH 424/555] don't show just track it unless on CombinedTrackSubmit --- src/pages/iou/request/step/IOURequestStepParticipants.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/pages/iou/request/step/IOURequestStepParticipants.tsx b/src/pages/iou/request/step/IOURequestStepParticipants.tsx index 7449042141f3..b27e61df743c 100644 --- a/src/pages/iou/request/step/IOURequestStepParticipants.tsx +++ b/src/pages/iou/request/step/IOURequestStepParticipants.tsx @@ -46,7 +46,7 @@ function IOURequestStepParticipants({ const {translate} = useLocalize(); const styles = useThemeStyles(); const isFocused = useIsFocused(); - const {canUseP2PDistanceRequests} = usePermissions(iouType); + const {canUseP2PDistanceRequests, canUseCombinedTrackSubmit} = usePermissions(iouType); // We need to set selectedReportID if user has navigated back from confirmation page and navigates to confirmation page with already selected participant const selectedReportID = useRef(participants?.length === 1 ? participants.at(0)?.reportID ?? reportID : reportID); @@ -76,7 +76,7 @@ function IOURequestStepParticipants({ }, [iouType, translate, isSplitRequest, action]); const selfDMReportID = useMemo(() => ReportUtils.findSelfDMReportID(), []); - const shouldDisplayTrackExpenseButton = !!selfDMReportID; + const shouldDisplayTrackExpenseButton = !!selfDMReportID && canUseCombinedTrackSubmit; const receiptFilename = transaction?.filename; const receiptPath = transaction?.receipt?.source; From 9e424cbb2dae76e322a732ff5d81fa69dc52f082 Mon Sep 17 00:00:00 2001 From: Shubham Agrawal Date: Wed, 2 Oct 2024 20:12:20 +0530 Subject: [PATCH 425/555] Fix lint --- src/components/ReportActionItem/IssueCardMessage.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/ReportActionItem/IssueCardMessage.tsx b/src/components/ReportActionItem/IssueCardMessage.tsx index c8e0bcf165bd..c1f4e534a3c1 100644 --- a/src/components/ReportActionItem/IssueCardMessage.tsx +++ b/src/components/ReportActionItem/IssueCardMessage.tsx @@ -24,7 +24,7 @@ function IssueCardMessage({action}: IssueCardMessageProps) { const [privatePersonalDetails] = useOnyx(ONYXKEYS.PRIVATE_PERSONAL_DETAILS); const [session] = useOnyx(ONYXKEYS.SESSION); - const assigneeAccountID = (action?.originalMessage as IssueNewCardOriginalMessage)?.assigneeAccountID; + const assigneeAccountID = (ReportActionsUtils.getOriginalMessage(action) as IssueNewCardOriginalMessage)?.assigneeAccountID; const missingDetails = !privatePersonalDetails?.legalFirstName || From 45ce5f5c9794bbb4bb40b8aefcc6632d95b65469 Mon Sep 17 00:00:00 2001 From: Georgia Monahan Date: Wed, 2 Oct 2024 15:46:17 +0100 Subject: [PATCH 426/555] fix :) --- src/pages/iou/request/step/IOURequestStepParticipants.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/pages/iou/request/step/IOURequestStepParticipants.tsx b/src/pages/iou/request/step/IOURequestStepParticipants.tsx index b27e61df743c..e8f02f0c1975 100644 --- a/src/pages/iou/request/step/IOURequestStepParticipants.tsx +++ b/src/pages/iou/request/step/IOURequestStepParticipants.tsx @@ -46,7 +46,7 @@ function IOURequestStepParticipants({ const {translate} = useLocalize(); const styles = useThemeStyles(); const isFocused = useIsFocused(); - const {canUseP2PDistanceRequests, canUseCombinedTrackSubmit} = usePermissions(iouType); + const {canUseP2PDistanceRequests} = usePermissions(iouType); // We need to set selectedReportID if user has navigated back from confirmation page and navigates to confirmation page with already selected participant const selectedReportID = useRef(participants?.length === 1 ? participants.at(0)?.reportID ?? reportID : reportID); @@ -76,7 +76,7 @@ function IOURequestStepParticipants({ }, [iouType, translate, isSplitRequest, action]); const selfDMReportID = useMemo(() => ReportUtils.findSelfDMReportID(), []); - const shouldDisplayTrackExpenseButton = !!selfDMReportID && canUseCombinedTrackSubmit; + const shouldDisplayTrackExpenseButton = !!selfDMReportID && action === CONST.IOU.ACTION.CREATE; const receiptFilename = transaction?.filename; const receiptPath = transaction?.receipt?.source; From 2f7068adb2072ce53d91a3505d9bc5d4ad381f67 Mon Sep 17 00:00:00 2001 From: Wildan Muhlis Date: Wed, 2 Oct 2024 22:08:14 +0700 Subject: [PATCH 427/555] -1 check for array access using .at --- .../Attachments/AttachmentCarousel/index.native.tsx | 4 ++-- src/components/Attachments/AttachmentCarousel/index.tsx | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/components/Attachments/AttachmentCarousel/index.native.tsx b/src/components/Attachments/AttachmentCarousel/index.native.tsx index 5edb4c3c8f64..754dcce6c73e 100644 --- a/src/components/Attachments/AttachmentCarousel/index.native.tsx +++ b/src/components/Attachments/AttachmentCarousel/index.native.tsx @@ -43,11 +43,11 @@ function AttachmentCarousel({report, source, onNavigate, setDownloadButtonVisibi const index = attachments.findIndex(compareImage); // If no matching attachment with the same index, dismiss the modal - if (newIndex === -1 && newAttachments.at(index)) { + if (newIndex === -1 && index !== -1 && newAttachments.at(index)) { newIndex = index; } - if (newIndex === -1 && attachments.at(index)) { + if (newIndex === -1 && index !== -1 && attachments.at(index)) { Navigation.dismissModal(); } else { setPage(newIndex); diff --git a/src/components/Attachments/AttachmentCarousel/index.tsx b/src/components/Attachments/AttachmentCarousel/index.tsx index 8a4542d25fb4..1672f5a4dfdb 100644 --- a/src/components/Attachments/AttachmentCarousel/index.tsx +++ b/src/components/Attachments/AttachmentCarousel/index.tsx @@ -93,11 +93,11 @@ function AttachmentCarousel({report, source, onNavigate, setDownloadButtonVisibi const index = attachments.findIndex(compareImage); // If no matching attachment with the same index, dismiss the modal - if (newIndex === -1 && newAttachments.at(index)) { + if (newIndex === -1 && index !== -1 && newAttachments.at(index)) { newIndex = index; } - if (newIndex === -1 && attachments.at(index)) { + if (newIndex === -1 && index !== -1 && attachments.at(index)) { Navigation.dismissModal(); } else { setPage(newIndex); From d9642490826031116f6850a556cf4a9ee7281bb0 Mon Sep 17 00:00:00 2001 From: Ishpaul Singh Date: Wed, 2 Oct 2024 20:56:35 +0530 Subject: [PATCH 428/555] fixes the issue --- src/components/SelectionList/Search/ReportListItem.tsx | 4 ++-- src/components/SelectionList/Search/TransactionListItem.tsx | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/components/SelectionList/Search/ReportListItem.tsx b/src/components/SelectionList/Search/ReportListItem.tsx index 9b6cf6045b17..91213e046bb0 100644 --- a/src/components/SelectionList/Search/ReportListItem.tsx +++ b/src/components/SelectionList/Search/ReportListItem.tsx @@ -86,10 +86,10 @@ function ReportListItem({ styles.pv1half, styles.ph0, styles.overflowHidden, - item.isSelected && styles.activeComponentBG, - isFocused && styles.sidebarLinkActive, // Removing some of the styles because they are added to the parent OpacityView via animatedHighlightStyle {backgroundColor: 'unset'}, + item.isSelected && styles.activeComponentBG, + isFocused && styles.sidebarLinkActive, styles.mh0, ]; diff --git a/src/components/SelectionList/Search/TransactionListItem.tsx b/src/components/SelectionList/Search/TransactionListItem.tsx index a9bbdf1d1a65..e42609bdeb15 100644 --- a/src/components/SelectionList/Search/TransactionListItem.tsx +++ b/src/components/SelectionList/Search/TransactionListItem.tsx @@ -31,10 +31,10 @@ function TransactionListItem({ styles.selectionListPressableItemWrapper, styles.pv3, styles.ph3, - item.isSelected && styles.activeComponentBG, - isFocused && styles.sidebarLinkActive, // Removing some of the styles because they are added to the parent OpacityView via animatedHighlightStyle {backgroundColor: 'unset'}, + item.isSelected && styles.activeComponentBG, + isFocused && styles.sidebarLinkActive, styles.mh0, ]; From 524eb8b275cacbb14d9aee65cb66911230aac3f6 Mon Sep 17 00:00:00 2001 From: Jakub Szymczak Date: Wed, 2 Oct 2024 18:19:30 +0200 Subject: [PATCH 429/555] focus list item if it exists --- src/components/Search/SearchRouter/SearchRouter.tsx | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/components/Search/SearchRouter/SearchRouter.tsx b/src/components/Search/SearchRouter/SearchRouter.tsx index 76fc42a4f5a9..b3f147b7ac28 100644 --- a/src/components/Search/SearchRouter/SearchRouter.tsx +++ b/src/components/Search/SearchRouter/SearchRouter.tsx @@ -50,9 +50,7 @@ function SearchRouter() { return Object.values(recentSearches ?? {}).sort((a, b) => b.timestamp.localeCompare(a.timestamp)); }, [recentSearches]); - const {options, areOptionsInitialized} = useOptionsList({ - shouldInitialize: true, - }); + const {options, areOptionsInitialized} = useOptionsList(); const searchOptions = useMemo(() => { if (!areOptionsInitialized) { return {recentReports: [], personalDetails: [], userToInvite: null, currentUserOption: null, categoryOptions: [], tagOptions: [], taxRatesOptions: []}; @@ -91,6 +89,15 @@ function SearchRouter() { Report.searchInServer(debouncedInputValue.trim()); }, [debouncedInputValue]); + useEffect(() => { + if (!textInputValue && isSearchRouterDisplayed) { + return; + } + listRef.current?.updateAndScrollToFocusedIndex(0); + // eslint-disable-next-line react-compiler/react-compiler + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [isSearchRouterDisplayed]); + const contextualReportData = contextualReportID ? searchOptions.recentReports?.find((option) => option.reportID === contextualReportID) : undefined; const clearUserQuery = () => { From 570cc3fa6033c3d6aa0c4c89a29f15ea7cefc6e1 Mon Sep 17 00:00:00 2001 From: truph01 Date: Wed, 2 Oct 2024 23:26:18 +0700 Subject: [PATCH 430/555] fix: LHN - Members' room names are displayed incorrectly --- src/libs/ReportUtils.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libs/ReportUtils.ts b/src/libs/ReportUtils.ts index 687ef177609e..8d48566a2d2d 100644 --- a/src/libs/ReportUtils.ts +++ b/src/libs/ReportUtils.ts @@ -3763,7 +3763,7 @@ function getReportName( if (reportID && !isUserCreatedPolicyRoom(report) && !isDefaultRoom(report)) { const reportNameFromCache = reportNameCache.get(cacheKey); - if (reportNameFromCache?.reportName && reportNameFromCache.reportName === report?.reportName) { + if (reportNameFromCache?.reportName && reportNameFromCache.reportName === report?.reportName && reportNameFromCache.reportName !== CONST.REPORT.DEFAULT_REPORT_NAME ) { return reportNameFromCache.reportName; } } From 7caca60c5dc977a94d8272a871a84d0324a10b39 Mon Sep 17 00:00:00 2001 From: Jasper Huang Date: Wed, 2 Oct 2024 09:29:04 -0700 Subject: [PATCH 431/555] ensure that round trips do not display the duplicate waypoint error incorrectly --- src/libs/TransactionUtils/index.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/libs/TransactionUtils/index.ts b/src/libs/TransactionUtils/index.ts index 9fbed928423f..0db771eaa96b 100644 --- a/src/libs/TransactionUtils/index.ts +++ b/src/libs/TransactionUtils/index.ts @@ -646,7 +646,10 @@ function getValidWaypoints(waypoints: WaypointCollection | undefined, reArrangeI let waypointIndex = -1; return waypointValues.reduce((acc, currentWaypoint, index) => { - const previousWaypoint = waypointValues.at(lastWaypointIndex); + // Array.at(-1) returns the last element of the array + // If a user does a round trip, the last waypoint will be the same as the first waypoint + // We want to avoid comparing them as this will result in an incorrect duplicate waypoint error. + const previousWaypoint = lastWaypointIndex !== -1 ? waypointValues.at(lastWaypointIndex) : undefined; // Check if the waypoint has a valid address if (!waypointHasValidAddress(currentWaypoint)) { From db86b4b38279683995043d33b989be20965ae3be Mon Sep 17 00:00:00 2001 From: truph01 Date: Wed, 2 Oct 2024 23:35:05 +0700 Subject: [PATCH 432/555] fix: prettier --- src/libs/ReportUtils.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libs/ReportUtils.ts b/src/libs/ReportUtils.ts index 8d48566a2d2d..ad9d27f3f484 100644 --- a/src/libs/ReportUtils.ts +++ b/src/libs/ReportUtils.ts @@ -3763,7 +3763,7 @@ function getReportName( if (reportID && !isUserCreatedPolicyRoom(report) && !isDefaultRoom(report)) { const reportNameFromCache = reportNameCache.get(cacheKey); - if (reportNameFromCache?.reportName && reportNameFromCache.reportName === report?.reportName && reportNameFromCache.reportName !== CONST.REPORT.DEFAULT_REPORT_NAME ) { + if (reportNameFromCache?.reportName && reportNameFromCache.reportName === report?.reportName && reportNameFromCache.reportName !== CONST.REPORT.DEFAULT_REPORT_NAME) { return reportNameFromCache.reportName; } } From c301698782eb2c337938e1fe327e070de9c6ee49 Mon Sep 17 00:00:00 2001 From: OSBotify Date: Wed, 2 Oct 2024 17:00:11 +0000 Subject: [PATCH 433/555] Update version to 9.0.43-2 --- android/app/build.gradle | 4 ++-- ios/NewExpensify/Info.plist | 2 +- ios/NewExpensifyTests/Info.plist | 2 +- ios/NotificationServiceExtension/Info.plist | 2 +- package-lock.json | 4 ++-- package.json | 2 +- 6 files changed, 8 insertions(+), 8 deletions(-) diff --git a/android/app/build.gradle b/android/app/build.gradle index 64b903fdbe24..150d243a185c 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -110,8 +110,8 @@ android { minSdkVersion rootProject.ext.minSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion multiDexEnabled rootProject.ext.multiDexEnabled - versionCode 1009004301 - versionName "9.0.43-1" + versionCode 1009004302 + versionName "9.0.43-2" // Supported language variants must be declared here to avoid from being removed during the compilation. // This also helps us to not include unnecessary language variants in the APK. resConfigs "en", "es" diff --git a/ios/NewExpensify/Info.plist b/ios/NewExpensify/Info.plist index a62749c0629e..56189182168b 100644 --- a/ios/NewExpensify/Info.plist +++ b/ios/NewExpensify/Info.plist @@ -40,7 +40,7 @@ CFBundleVersion - 9.0.43.1 + 9.0.43.2 FullStory OrgId diff --git a/ios/NewExpensifyTests/Info.plist b/ios/NewExpensifyTests/Info.plist index 16d99226f854..eb194441e455 100644 --- a/ios/NewExpensifyTests/Info.plist +++ b/ios/NewExpensifyTests/Info.plist @@ -19,6 +19,6 @@ CFBundleSignature ???? CFBundleVersion - 9.0.43.1 + 9.0.43.2 diff --git a/ios/NotificationServiceExtension/Info.plist b/ios/NotificationServiceExtension/Info.plist index 16c7823a1cf8..1b093f940673 100644 --- a/ios/NotificationServiceExtension/Info.plist +++ b/ios/NotificationServiceExtension/Info.plist @@ -13,7 +13,7 @@ CFBundleShortVersionString 9.0.43 CFBundleVersion - 9.0.43.1 + 9.0.43.2 NSExtension NSExtensionPointIdentifier diff --git a/package-lock.json b/package-lock.json index 657c49656503..bc4b22a37d48 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "new.expensify", - "version": "9.0.43-1", + "version": "9.0.43-2", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "new.expensify", - "version": "9.0.43-1", + "version": "9.0.43-2", "hasInstallScript": true, "license": "MIT", "dependencies": { diff --git a/package.json b/package.json index 41db1e2e46b4..4cd5726a4f82 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "new.expensify", - "version": "9.0.43-1", + "version": "9.0.43-2", "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.", From 3a53c2d9fb8c8d2d63858b3ef45834b303d7e960 Mon Sep 17 00:00:00 2001 From: Ishpaul Singh Date: Wed, 2 Oct 2024 22:36:48 +0530 Subject: [PATCH 434/555] fixes issue on android --- src/components/SelectionList/Search/ReportListItem.tsx | 2 +- src/components/SelectionList/Search/TransactionListItem.tsx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/SelectionList/Search/ReportListItem.tsx b/src/components/SelectionList/Search/ReportListItem.tsx index 91213e046bb0..f4457662b86a 100644 --- a/src/components/SelectionList/Search/ReportListItem.tsx +++ b/src/components/SelectionList/Search/ReportListItem.tsx @@ -87,7 +87,7 @@ function ReportListItem({ styles.ph0, styles.overflowHidden, // Removing some of the styles because they are added to the parent OpacityView via animatedHighlightStyle - {backgroundColor: 'unset'}, + {backgroundColor: 'transparent'}, item.isSelected && styles.activeComponentBG, isFocused && styles.sidebarLinkActive, styles.mh0, diff --git a/src/components/SelectionList/Search/TransactionListItem.tsx b/src/components/SelectionList/Search/TransactionListItem.tsx index e42609bdeb15..76fe7eb429a8 100644 --- a/src/components/SelectionList/Search/TransactionListItem.tsx +++ b/src/components/SelectionList/Search/TransactionListItem.tsx @@ -32,7 +32,7 @@ function TransactionListItem({ styles.pv3, styles.ph3, // Removing some of the styles because they are added to the parent OpacityView via animatedHighlightStyle - {backgroundColor: 'unset'}, + {backgroundColor: 'transparent'}, item.isSelected && styles.activeComponentBG, isFocused && styles.sidebarLinkActive, styles.mh0, From 4d7a154c3c101b45e011eac49e077628a85205c3 Mon Sep 17 00:00:00 2001 From: Ishpaul Singh Date: Wed, 2 Oct 2024 22:38:47 +0530 Subject: [PATCH 435/555] fixes issue on android --- src/components/SelectionList/Search/ReportListItem.tsx | 4 ++-- src/components/SelectionList/Search/TransactionListItem.tsx | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/components/SelectionList/Search/ReportListItem.tsx b/src/components/SelectionList/Search/ReportListItem.tsx index f4457662b86a..2cc3e7d5b2a4 100644 --- a/src/components/SelectionList/Search/ReportListItem.tsx +++ b/src/components/SelectionList/Search/ReportListItem.tsx @@ -86,8 +86,8 @@ function ReportListItem({ styles.pv1half, styles.ph0, styles.overflowHidden, - // Removing some of the styles because they are added to the parent OpacityView via animatedHighlightStyle - {backgroundColor: 'transparent'}, + // Removing background style because they are added to the parent OpacityView via animatedHighlightStyle + styles.bgTransparent, item.isSelected && styles.activeComponentBG, isFocused && styles.sidebarLinkActive, styles.mh0, diff --git a/src/components/SelectionList/Search/TransactionListItem.tsx b/src/components/SelectionList/Search/TransactionListItem.tsx index 76fe7eb429a8..9259583c9f9d 100644 --- a/src/components/SelectionList/Search/TransactionListItem.tsx +++ b/src/components/SelectionList/Search/TransactionListItem.tsx @@ -31,8 +31,8 @@ function TransactionListItem({ styles.selectionListPressableItemWrapper, styles.pv3, styles.ph3, - // Removing some of the styles because they are added to the parent OpacityView via animatedHighlightStyle - {backgroundColor: 'transparent'}, + // Removing background style because they are added to the parent OpacityView via animatedHighlightStyle + styles.bgTransparent, item.isSelected && styles.activeComponentBG, isFocused && styles.sidebarLinkActive, styles.mh0, From 8d2b0a65521084bafe79496faa6b945b8bf861ea Mon Sep 17 00:00:00 2001 From: Gandalf Date: Thu, 3 Oct 2024 00:03:55 +0530 Subject: [PATCH 436/555] Update TaxIdBusiness.tsx --- .../BusinessInfo/substeps/TaxIdBusiness.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pages/ReimbursementAccount/BusinessInfo/substeps/TaxIdBusiness.tsx b/src/pages/ReimbursementAccount/BusinessInfo/substeps/TaxIdBusiness.tsx index 2c55a0b8c251..9cc2e87fd95d 100644 --- a/src/pages/ReimbursementAccount/BusinessInfo/substeps/TaxIdBusiness.tsx +++ b/src/pages/ReimbursementAccount/BusinessInfo/substeps/TaxIdBusiness.tsx @@ -48,7 +48,7 @@ function TaxIdBusiness({reimbursementAccount, onNext, isEditing}: TaxIdBusinessP const handleSubmit = useReimbursementAccountStepFormSubmit({ fieldIds: STEP_FIELDS, onNext, - shouldSaveDraft: isEditing, + shouldSaveDraft: true, }); return ( From ae698fcece1233509aea5682668126a4169d3171 Mon Sep 17 00:00:00 2001 From: Gandalf Date: Thu, 3 Oct 2024 00:19:28 +0530 Subject: [PATCH 437/555] Update WebsiteBusiness.tsx --- .../BusinessInfo/substeps/WebsiteBusiness.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pages/ReimbursementAccount/BusinessInfo/substeps/WebsiteBusiness.tsx b/src/pages/ReimbursementAccount/BusinessInfo/substeps/WebsiteBusiness.tsx index 00ce90ddeb05..3d8fcd944f4f 100644 --- a/src/pages/ReimbursementAccount/BusinessInfo/substeps/WebsiteBusiness.tsx +++ b/src/pages/ReimbursementAccount/BusinessInfo/substeps/WebsiteBusiness.tsx @@ -47,7 +47,7 @@ function WebsiteBusiness({onNext, isEditing}: SubStepProps) { BankAccounts.addBusinessWebsiteForDraft((values as {website: string})?.website); onNext(); }, - shouldSaveDraft: isEditing, + shouldSaveDraft: true, }); return ( From 840299e0e19f00e9097180cedd3ce2bfc5c972e7 Mon Sep 17 00:00:00 2001 From: Gandalf Date: Thu, 3 Oct 2024 00:19:53 +0530 Subject: [PATCH 438/555] Update TaxIdBusiness.tsx --- .../BusinessInfo/substeps/TaxIdBusiness.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pages/ReimbursementAccount/BusinessInfo/substeps/TaxIdBusiness.tsx b/src/pages/ReimbursementAccount/BusinessInfo/substeps/TaxIdBusiness.tsx index 9cc2e87fd95d..2c55a0b8c251 100644 --- a/src/pages/ReimbursementAccount/BusinessInfo/substeps/TaxIdBusiness.tsx +++ b/src/pages/ReimbursementAccount/BusinessInfo/substeps/TaxIdBusiness.tsx @@ -48,7 +48,7 @@ function TaxIdBusiness({reimbursementAccount, onNext, isEditing}: TaxIdBusinessP const handleSubmit = useReimbursementAccountStepFormSubmit({ fieldIds: STEP_FIELDS, onNext, - shouldSaveDraft: true, + shouldSaveDraft: isEditing, }); return ( From 71416cd4f99f137e74a11e2f2386ca1d6e45e3ed Mon Sep 17 00:00:00 2001 From: Tim Golen Date: Wed, 2 Oct 2024 13:02:39 -0600 Subject: [PATCH 439/555] Update issue template to have a proper expand/collapse for screenshots --- .github/ISSUE_TEMPLATE/Standard.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/ISSUE_TEMPLATE/Standard.md b/.github/ISSUE_TEMPLATE/Standard.md index 5c96d8736bcd..663c6004a534 100644 --- a/.github/ISSUE_TEMPLATE/Standard.md +++ b/.github/ISSUE_TEMPLATE/Standard.md @@ -43,8 +43,10 @@ Which of our officially supported platforms is this issue occurring on? ## Screenshots/Videos -Add any screenshot/video evidence +
+ Add any screenshot/video evidence +
[View all open jobs on GitHub](https://github.com/Expensify/App/issues?q=is%3Aopen+is%3Aissue+label%3A%22Help+Wanted%22) From c283f7cec769bf1485134846b83bbbd111596b71 Mon Sep 17 00:00:00 2001 From: rory Date: Wed, 2 Oct 2024 12:07:49 -0700 Subject: [PATCH 440/555] Fix artifact name in e2e download-artifact --- .github/workflows/buildAndroid.yml | 1 - .github/workflows/e2ePerformanceTests.yml | 4 ++-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/.github/workflows/buildAndroid.yml b/.github/workflows/buildAndroid.yml index 1322c86de25b..091b88a59d94 100644 --- a/.github/workflows/buildAndroid.yml +++ b/.github/workflows/buildAndroid.yml @@ -144,7 +144,6 @@ jobs: echo "APK_FILE_NAME=$(basename "$apkPath")" echo "SHOULD_UPLOAD_SOURCEMAPS=$SHOULD_UPLOAD_SOURCEMAPS" } >> "$GITHUB_OUTPUT" - env: MYAPP_UPLOAD_STORE_PASSWORD: ${{ secrets.MYAPP_UPLOAD_STORE_PASSWORD }} MYAPP_UPLOAD_KEY_PASSWORD: ${{ secrets.MYAPP_UPLOAD_KEY_PASSWORD }} diff --git a/.github/workflows/e2ePerformanceTests.yml b/.github/workflows/e2ePerformanceTests.yml index 40f6ad2f6f6a..2415eeebe6be 100644 --- a/.github/workflows/e2ePerformanceTests.yml +++ b/.github/workflows/e2ePerformanceTests.yml @@ -125,7 +125,7 @@ jobs: uses: actions/download-artifact@v4 id: downloadBaselineAPK with: - name: baseline-${{ needs.prep.outputs.BASELINE_VERSION }}-android-apk + name: baseline-${{ needs.prep.outputs.BASELINE_VERSION }}-android-artifact-apk path: zip # Set github-token only if the baseline was built in this workflow run: github-token: ${{ needs.prep.outputs.BASELINE_ARTIFACT_WORKFLOW_ID && github.token }} @@ -139,7 +139,7 @@ jobs: uses: actions/download-artifact@v4 id: downloadDeltaAPK with: - name: delta-${{ needs.prep.outputs.DELTA_REF }}-android-apk + name: delta-${{ needs.prep.outputs.DELTA_REF }}-android-artifact-apk path: zip - name: Rename delta APK From ab43c3a9f0d6d5e8b23840e2dba67051da273da1 Mon Sep 17 00:00:00 2001 From: OSBotify Date: Wed, 2 Oct 2024 19:26:52 +0000 Subject: [PATCH 441/555] Update version to 9.0.43-3 --- android/app/build.gradle | 4 ++-- ios/NewExpensify/Info.plist | 2 +- ios/NewExpensifyTests/Info.plist | 2 +- ios/NotificationServiceExtension/Info.plist | 2 +- package-lock.json | 4 ++-- package.json | 2 +- 6 files changed, 8 insertions(+), 8 deletions(-) diff --git a/android/app/build.gradle b/android/app/build.gradle index 150d243a185c..7290fd893c87 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -110,8 +110,8 @@ android { minSdkVersion rootProject.ext.minSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion multiDexEnabled rootProject.ext.multiDexEnabled - versionCode 1009004302 - versionName "9.0.43-2" + versionCode 1009004303 + versionName "9.0.43-3" // Supported language variants must be declared here to avoid from being removed during the compilation. // This also helps us to not include unnecessary language variants in the APK. resConfigs "en", "es" diff --git a/ios/NewExpensify/Info.plist b/ios/NewExpensify/Info.plist index 56189182168b..f5fd176d9f5c 100644 --- a/ios/NewExpensify/Info.plist +++ b/ios/NewExpensify/Info.plist @@ -40,7 +40,7 @@
CFBundleVersion - 9.0.43.2 + 9.0.43.3 FullStory OrgId diff --git a/ios/NewExpensifyTests/Info.plist b/ios/NewExpensifyTests/Info.plist index eb194441e455..5f54e72f6ce7 100644 --- a/ios/NewExpensifyTests/Info.plist +++ b/ios/NewExpensifyTests/Info.plist @@ -19,6 +19,6 @@ CFBundleSignature ???? CFBundleVersion - 9.0.43.2 + 9.0.43.3 diff --git a/ios/NotificationServiceExtension/Info.plist b/ios/NotificationServiceExtension/Info.plist index 1b093f940673..1b0b23f34d94 100644 --- a/ios/NotificationServiceExtension/Info.plist +++ b/ios/NotificationServiceExtension/Info.plist @@ -13,7 +13,7 @@ CFBundleShortVersionString 9.0.43 CFBundleVersion - 9.0.43.2 + 9.0.43.3 NSExtension NSExtensionPointIdentifier diff --git a/package-lock.json b/package-lock.json index bc4b22a37d48..43ffeaa46b13 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "new.expensify", - "version": "9.0.43-2", + "version": "9.0.43-3", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "new.expensify", - "version": "9.0.43-2", + "version": "9.0.43-3", "hasInstallScript": true, "license": "MIT", "dependencies": { diff --git a/package.json b/package.json index 4cd5726a4f82..4538e1492ac4 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "new.expensify", - "version": "9.0.43-2", + "version": "9.0.43-3", "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.", From 5185906e3a8ab41dc40627c21aea1928161303f9 Mon Sep 17 00:00:00 2001 From: situchan Date: Wed, 2 Oct 2024 12:45:07 -0700 Subject: [PATCH 442/555] fix wrong last message in LHN after message deletion --- src/libs/SidebarUtils.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/libs/SidebarUtils.ts b/src/libs/SidebarUtils.ts index d00446f6da1c..0496bc66fe5b 100644 --- a/src/libs/SidebarUtils.ts +++ b/src/libs/SidebarUtils.ts @@ -51,6 +51,7 @@ Onyx.connect({ const reportAction = reportActionsForDisplay.at(-1); if (!reportAction) { + delete visibleReportActionItems[reportID]; return; } visibleReportActionItems[reportID] = reportAction; From 4097a1241d55617cd2c4ff747a7063ff4116fad0 Mon Sep 17 00:00:00 2001 From: rory Date: Wed, 2 Oct 2024 12:57:23 -0700 Subject: [PATCH 443/555] Invert skip condition for building the baseline artifact --- .github/workflows/e2ePerformanceTests.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/e2ePerformanceTests.yml b/.github/workflows/e2ePerformanceTests.yml index 2415eeebe6be..f88e841617bb 100644 --- a/.github/workflows/e2ePerformanceTests.yml +++ b/.github/workflows/e2ePerformanceTests.yml @@ -87,7 +87,7 @@ jobs: name: Build apk from latest release as a baseline uses: ./.github/workflows/buildAndroid.yml needs: prep - if: ${{ fromJSON(needs.prep.outputs.BASELINE_ARTIFACT_FOUND) }} + if: ${{ !fromJSON(needs.prep.outputs.BASELINE_ARTIFACT_FOUND) }} secrets: inherit with: type: e2e From b585a9deb256453f66f9c58d8e7bdc4ebec0934e Mon Sep 17 00:00:00 2001 From: situchan Date: Wed, 2 Oct 2024 13:17:36 -0700 Subject: [PATCH 444/555] fix more --- src/libs/OptionsListUtils.ts | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/libs/OptionsListUtils.ts b/src/libs/OptionsListUtils.ts index cf0b31ef3267..90320b4a9ea1 100644 --- a/src/libs/OptionsListUtils.ts +++ b/src/libs/OptionsListUtils.ts @@ -317,11 +317,11 @@ Onyx.connect({ const firstReportAction = sortedReportActions.at(0); if (!firstReportAction) { - return; + delete lastReportActions[reportID]; + } else { + lastReportActions[reportID] = firstReportAction; } - lastReportActions[reportID] = firstReportAction; - // The report is only visible if it is the last action not deleted that // does not match a closed or created state. const reportActionsForDisplay = sortedReportActions.filter( @@ -334,6 +334,7 @@ Onyx.connect({ ); const reportActionForDisplay = reportActionsForDisplay.at(0); if (!reportActionForDisplay) { + delete lastVisibleReportActions[reportID]; return; } lastVisibleReportActions[reportID] = reportActionForDisplay; From 7992d213cae59eff0b6706b8871586e8d586df0a Mon Sep 17 00:00:00 2001 From: OSBotify Date: Wed, 2 Oct 2024 20:39:20 +0000 Subject: [PATCH 445/555] Update version to 9.0.43-4 --- android/app/build.gradle | 4 ++-- ios/NewExpensify/Info.plist | 2 +- ios/NewExpensifyTests/Info.plist | 2 +- ios/NotificationServiceExtension/Info.plist | 2 +- package-lock.json | 4 ++-- package.json | 2 +- 6 files changed, 8 insertions(+), 8 deletions(-) diff --git a/android/app/build.gradle b/android/app/build.gradle index 7290fd893c87..85a08214c6a3 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -110,8 +110,8 @@ android { minSdkVersion rootProject.ext.minSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion multiDexEnabled rootProject.ext.multiDexEnabled - versionCode 1009004303 - versionName "9.0.43-3" + versionCode 1009004304 + versionName "9.0.43-4" // Supported language variants must be declared here to avoid from being removed during the compilation. // This also helps us to not include unnecessary language variants in the APK. resConfigs "en", "es" diff --git a/ios/NewExpensify/Info.plist b/ios/NewExpensify/Info.plist index f5fd176d9f5c..0990a4cd4d10 100644 --- a/ios/NewExpensify/Info.plist +++ b/ios/NewExpensify/Info.plist @@ -40,7 +40,7 @@ CFBundleVersion - 9.0.43.3 + 9.0.43.4 FullStory OrgId diff --git a/ios/NewExpensifyTests/Info.plist b/ios/NewExpensifyTests/Info.plist index 5f54e72f6ce7..f2246d05d27b 100644 --- a/ios/NewExpensifyTests/Info.plist +++ b/ios/NewExpensifyTests/Info.plist @@ -19,6 +19,6 @@ CFBundleSignature ???? CFBundleVersion - 9.0.43.3 + 9.0.43.4 diff --git a/ios/NotificationServiceExtension/Info.plist b/ios/NotificationServiceExtension/Info.plist index 1b0b23f34d94..c662d94364de 100644 --- a/ios/NotificationServiceExtension/Info.plist +++ b/ios/NotificationServiceExtension/Info.plist @@ -13,7 +13,7 @@ CFBundleShortVersionString 9.0.43 CFBundleVersion - 9.0.43.3 + 9.0.43.4 NSExtension NSExtensionPointIdentifier diff --git a/package-lock.json b/package-lock.json index 43ffeaa46b13..609ea6e16171 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "new.expensify", - "version": "9.0.43-3", + "version": "9.0.43-4", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "new.expensify", - "version": "9.0.43-3", + "version": "9.0.43-4", "hasInstallScript": true, "license": "MIT", "dependencies": { diff --git a/package.json b/package.json index 4538e1492ac4..dae51b758a4c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "new.expensify", - "version": "9.0.43-3", + "version": "9.0.43-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.", From d053555283ed45175b964efa630959a519db7e18 Mon Sep 17 00:00:00 2001 From: Jasper Huang Date: Wed, 2 Oct 2024 15:14:10 -0700 Subject: [PATCH 446/555] ensure we only access emojiCode for indices greater than 0 --- src/libs/EmojiUtils.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libs/EmojiUtils.ts b/src/libs/EmojiUtils.ts index 493837ca023b..7c042bbefe67 100644 --- a/src/libs/EmojiUtils.ts +++ b/src/libs/EmojiUtils.ts @@ -462,7 +462,7 @@ const getPreferredSkinToneIndex = (value: OnyxEntry): number => */ const getPreferredEmojiCode = (emoji: Emoji, preferredSkinTone: OnyxEntry): string => { if (emoji.types && typeof preferredSkinTone === 'number') { - const emojiCodeWithSkinTone = emoji.types.at(preferredSkinTone); + const emojiCodeWithSkinTone = preferredSkinTone >= 0 ? emoji.types.at(preferredSkinTone) : undefined; // Note: it can happen that preferredSkinTone has a outdated format, // so it makes sense to check if we actually got a valid emoji code back From f475642a182c37e95a9d271119d4ca6290d8da11 Mon Sep 17 00:00:00 2001 From: OSBotify Date: Wed, 2 Oct 2024 22:40:18 +0000 Subject: [PATCH 447/555] Update version to 9.0.43-5 --- android/app/build.gradle | 4 ++-- ios/NewExpensify/Info.plist | 2 +- ios/NewExpensifyTests/Info.plist | 2 +- ios/NotificationServiceExtension/Info.plist | 2 +- package-lock.json | 4 ++-- package.json | 2 +- 6 files changed, 8 insertions(+), 8 deletions(-) diff --git a/android/app/build.gradle b/android/app/build.gradle index 85a08214c6a3..07b2a557d339 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -110,8 +110,8 @@ android { minSdkVersion rootProject.ext.minSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion multiDexEnabled rootProject.ext.multiDexEnabled - versionCode 1009004304 - versionName "9.0.43-4" + versionCode 1009004305 + versionName "9.0.43-5" // Supported language variants must be declared here to avoid from being removed during the compilation. // This also helps us to not include unnecessary language variants in the APK. resConfigs "en", "es" diff --git a/ios/NewExpensify/Info.plist b/ios/NewExpensify/Info.plist index 0990a4cd4d10..ac237507861a 100644 --- a/ios/NewExpensify/Info.plist +++ b/ios/NewExpensify/Info.plist @@ -40,7 +40,7 @@ CFBundleVersion - 9.0.43.4 + 9.0.43.5 FullStory OrgId diff --git a/ios/NewExpensifyTests/Info.plist b/ios/NewExpensifyTests/Info.plist index f2246d05d27b..4fcfa8000138 100644 --- a/ios/NewExpensifyTests/Info.plist +++ b/ios/NewExpensifyTests/Info.plist @@ -19,6 +19,6 @@ CFBundleSignature ???? CFBundleVersion - 9.0.43.4 + 9.0.43.5 diff --git a/ios/NotificationServiceExtension/Info.plist b/ios/NotificationServiceExtension/Info.plist index c662d94364de..aea283903ca3 100644 --- a/ios/NotificationServiceExtension/Info.plist +++ b/ios/NotificationServiceExtension/Info.plist @@ -13,7 +13,7 @@ CFBundleShortVersionString 9.0.43 CFBundleVersion - 9.0.43.4 + 9.0.43.5 NSExtension NSExtensionPointIdentifier diff --git a/package-lock.json b/package-lock.json index 609ea6e16171..d14689a59ae4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "new.expensify", - "version": "9.0.43-4", + "version": "9.0.43-5", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "new.expensify", - "version": "9.0.43-4", + "version": "9.0.43-5", "hasInstallScript": true, "license": "MIT", "dependencies": { diff --git a/package.json b/package.json index dae51b758a4c..dba6c39a5dff 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "new.expensify", - "version": "9.0.43-4", + "version": "9.0.43-5", "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.", From 660020dddab79e695bd37961d544607721abc8aa Mon Sep 17 00:00:00 2001 From: rory Date: Wed, 2 Oct 2024 16:19:21 -0700 Subject: [PATCH 448/555] Remove unnecessary if statement --- .github/workflows/deploy.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index d15e543e890c..60bb97b0c2e7 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -79,7 +79,6 @@ jobs: uploadAndroid: name: Upload Android build to Google Play Store - if: ${{ github.ref == 'refs/heads/staging' }} needs: buildAndroid runs-on: ubuntu-latest env: From 342f861b0f659a49749d78ee727f34bf7362752a Mon Sep 17 00:00:00 2001 From: rory Date: Wed, 2 Oct 2024 16:51:26 -0700 Subject: [PATCH 449/555] Consolidate S3 paths --- .github/workflows/testBuild.yml | 6 ++---- fastlane/Fastfile | 6 ++---- 2 files changed, 4 insertions(+), 8 deletions(-) diff --git a/.github/workflows/testBuild.yml b/.github/workflows/testBuild.yml index 8d23082edbbd..e844c137400a 100644 --- a/.github/workflows/testBuild.yml +++ b/.github/workflows/testBuild.yml @@ -78,7 +78,6 @@ jobs: RUBYOPT: '-rostruct' outputs: S3_APK_PATH: ${{ steps.exportS3Paths.outputs.S3_APK_PATH }} - S3_HTML_PATH: ${{ steps.exportS3Paths.outputs.S3_HTML_PATH }} steps: - name: Checkout uses: actions/checkout@v4 @@ -117,9 +116,8 @@ jobs: - name: Export S3 paths id: exportS3Paths run: | - # $s3APKPath and $s3HtmlPath are from within the Fastfile, android upload_s3 lane + # $s3APKPath is set from within the Fastfile, android upload_s3 lane echo "S3_APK_PATH=$s3APKPath" >> "$GITHUB_OUTPUT" - echo "S3_HTML_PATH=$s3HtmlPath" >> "$GITHUB_OUTPUT" iOS: name: Build and deploy iOS for testing @@ -326,7 +324,7 @@ jobs: DESKTOP: ${{ needs.desktop.result }} IOS: ${{ needs.iOS.result }} WEB: ${{ needs.web.result }} - ANDROID_LINK: ${{ needs.uploadAndroid.outputs.S3_HTML_PATH }} + ANDROID_LINK: ${{ needs.uploadAndroid.outputs.S3_APK_PATH }} DESKTOP_LINK: https://ad-hoc-expensify-cash.s3.amazonaws.com/desktop/${{ env.PULL_REQUEST_NUMBER }}/NewExpensify.dmg IOS_LINK: ${{ steps.get_ios_path.outputs.ios_path }} WEB_LINK: https://${{ env.PULL_REQUEST_NUMBER }}.pr-testing.expensify.com diff --git a/fastlane/Fastfile b/fastlane/Fastfile index 25d365198943..eed84acdc916 100644 --- a/fastlane/Fastfile +++ b/fastlane/Fastfile @@ -16,11 +16,10 @@ skip_docs opt_out_usage KEY_GRADLE_APK_PATH = "apkPath" +KEY_S3_APK_PATH = "s3APKPath" KEY_GRADLE_AAB_PATH = "aabPath" KEY_IPA_PATH = "ipaPath" KEY_DSYM_PATH = "dsymPath" -KEY_S3_APK_PATH = "s3APKPath" -KEY_S3_HTML_PATH = "s3HtmlPath" # Export environment variables to GITHUB_ENV # If there's no GITHUB_ENV file set in the env, then this is a no-op @@ -135,8 +134,7 @@ platform :android do ) puts "Saving S3 outputs in env..." exportEnvVars({ - KEY_S3_APK_PATH => lane_context[SharedValues::S3_APK_OUTPUT_PATH], - KEY_S3_HTML_PATH => lane_context[SharedValues::S3_HTML_OUTPUT_PATH], + KEY_S3_APK_PATH => lane_context[SharedValues::S3_HTML_OUTPUT_PATH], }) end From f2c9d7fa32d0045241704e4b9d5017946b244bd5 Mon Sep 17 00:00:00 2001 From: rory Date: Wed, 2 Oct 2024 17:00:06 -0700 Subject: [PATCH 450/555] exportS3Path singular --- .github/workflows/testBuild.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/testBuild.yml b/.github/workflows/testBuild.yml index e844c137400a..3847eaed6fd1 100644 --- a/.github/workflows/testBuild.yml +++ b/.github/workflows/testBuild.yml @@ -77,7 +77,7 @@ jobs: env: RUBYOPT: '-rostruct' outputs: - S3_APK_PATH: ${{ steps.exportS3Paths.outputs.S3_APK_PATH }} + S3_APK_PATH: ${{ steps.exportS3Path.outputs.S3_APK_PATH }} steps: - name: Checkout uses: actions/checkout@v4 @@ -114,7 +114,7 @@ jobs: S3_REGION: us-east-1 - name: Export S3 paths - id: exportS3Paths + id: exportS3Path run: | # $s3APKPath is set from within the Fastfile, android upload_s3 lane echo "S3_APK_PATH=$s3APKPath" >> "$GITHUB_OUTPUT" From 333dba728b7db5f5dec4c1d17db4637634fd5c94 Mon Sep 17 00:00:00 2001 From: Jasper Huang Date: Wed, 2 Oct 2024 17:28:00 -0700 Subject: [PATCH 451/555] manually revert changes --- .../NotificationService.swift | 6 --- ios/Podfile | 1 - ios/Podfile.lock | 38 ++----------------- jest/setup.ts | 3 -- package-lock.json | 13 ------- package.json | 1 - src/libs/Log.ts | 18 --------- 7 files changed, 4 insertions(+), 76 deletions(-) diff --git a/ios/NotificationServiceExtension/NotificationService.swift b/ios/NotificationServiceExtension/NotificationService.swift index b3c56a36619d..806d14d4c786 100644 --- a/ios/NotificationServiceExtension/NotificationService.swift +++ b/ios/NotificationServiceExtension/NotificationService.swift @@ -8,18 +8,12 @@ import AirshipServiceExtension import os.log import Intents -import AppLogs class NotificationService: UANotificationServiceExtension { var contentHandler: ((UNNotificationContent) -> Void)? var bestAttemptContent: UNMutableNotificationContent? let log = OSLog(subsystem: Bundle.main.bundleIdentifier ?? "com.expensify.chat.dev.NotificationServiceExtension", category: "NotificationService") - let appLogs: AppLogs = .init() - - deinit { - appLogs.forwardLogsTo(appGroup: "group.com.expensify.new") - } override func didReceive(_ request: UNNotificationRequest, withContentHandler contentHandler: @escaping (UNNotificationContent) -> Void) { os_log("[NotificationService] didReceive() - received notification", log: log) diff --git a/ios/Podfile b/ios/Podfile index 4d139711ef01..e807089c26b9 100644 --- a/ios/Podfile +++ b/ios/Podfile @@ -119,7 +119,6 @@ end target 'NotificationServiceExtension' do pod 'AirshipServiceExtension' - pod 'AppLogs', :path => '../node_modules/react-native-app-logs/AppLogsPod' end pod 'FullStory', :http => 'https://ios-releases.fullstory.com/fullstory-1.52.0-xcframework.tar.gz' \ No newline at end of file diff --git a/ios/Podfile.lock b/ios/Podfile.lock index 64f8e0365423..beac64acd083 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -26,7 +26,6 @@ PODS: - AppAuth/Core (1.7.5) - AppAuth/ExternalUserAgent (1.7.5): - AppAuth/Core - - AppLogs (0.1.0) - boost (1.84.0) - DoubleConversion (1.1.6) - EXAV (14.0.7): @@ -1565,27 +1564,6 @@ PODS: - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - Yoga - - react-native-app-logs (0.2.2): - - DoubleConversion - - glog - - hermes-engine - - RCT-Folly (= 2024.01.01.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-debug - - React-Fabric - - React-featureflags - - React-graphics - - React-ImageManager - - React-NativeModulesApple - - React-RCTFabric - - React-rendererdebug - - React-utils - - ReactCodegen - - ReactCommon/turbomodule/bridging - - ReactCommon/turbomodule/core - - Yoga - react-native-blob-util (0.19.4): - DoubleConversion - glog @@ -1968,7 +1946,7 @@ PODS: - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - Yoga - - react-native-view-shot (4.0.0-alpha.3): + - react-native-view-shot (3.8.0): - React-Core - react-native-webview (13.8.6): - DoubleConversion @@ -2711,7 +2689,6 @@ PODS: DEPENDENCIES: - AirshipServiceExtension - - AppLogs (from `../node_modules/react-native-app-logs/AppLogsPod`) - boost (from `../node_modules/react-native/third-party-podspecs/boost.podspec`) - DoubleConversion (from `../node_modules/react-native/third-party-podspecs/DoubleConversion.podspec`) - EXAV (from `../node_modules/expo-av/ios`) @@ -2761,7 +2738,6 @@ DEPENDENCIES: - React-Mapbuffer (from `../node_modules/react-native/ReactCommon`) - React-microtasksnativemodule (from `../node_modules/react-native/ReactCommon/react/nativemodule/microtasks`) - "react-native-airship (from `../node_modules/@ua/react-native-airship`)" - - react-native-app-logs (from `../node_modules/react-native-app-logs`) - react-native-blob-util (from `../node_modules/react-native-blob-util`) - "react-native-cameraroll (from `../node_modules/@react-native-camera-roll/camera-roll`)" - react-native-config (from `../node_modules/react-native-config`) @@ -2875,8 +2851,6 @@ SPEC REPOS: - Turf EXTERNAL SOURCES: - AppLogs: - :path: "../node_modules/react-native-app-logs/AppLogsPod" boost: :podspec: "../node_modules/react-native/third-party-podspecs/boost.podspec" DoubleConversion: @@ -2972,8 +2946,6 @@ EXTERNAL SOURCES: :path: "../node_modules/react-native/ReactCommon/react/nativemodule/microtasks" react-native-airship: :path: "../node_modules/@ua/react-native-airship" - react-native-app-logs: - :path: "../node_modules/react-native-app-logs" react-native-blob-util: :path: "../node_modules/react-native-blob-util" react-native-cameraroll: @@ -3124,7 +3096,6 @@ SPEC CHECKSUMS: AirshipFrameworkProxy: dbd862dc6fb21b13e8b196458d626123e2a43a50 AirshipServiceExtension: 9c73369f426396d9fb9ff222d86d842fac76ba46 AppAuth: 501c04eda8a8d11f179dbe8637b7a91bb7e5d2fa - AppLogs: 3bc4e9b141dbf265b9464409caaa40416a9ee0e0 boost: 26992d1adf73c1c7676360643e687aee6dda994b DoubleConversion: 76ab83afb40bddeeee456813d9c04f67f78771b5 EXAV: afa491e598334bbbb92a92a2f4dd33d7149ad37f @@ -3200,7 +3171,6 @@ SPEC CHECKSUMS: React-Mapbuffer: 1c08607305558666fd16678b85ef135e455d5c96 React-microtasksnativemodule: f13f03163b6a5ec66665dfe80a0df4468bb766a6 react-native-airship: e10f6823d8da49bbcb2db4bdb16ff954188afccc - react-native-app-logs: 91a04f691f2db7c1d6153bce31cab3922e6873f4 react-native-blob-util: 221c61c98ae507b758472ac4d2d489119d1a6c44 react-native-cameraroll: 478a0c1fcdd39f08f6ac272b7ed06e92b2c7c129 react-native-config: 5ce986133b07fc258828b20b9506de0e683efc1c @@ -3218,7 +3188,7 @@ SPEC CHECKSUMS: react-native-quick-sqlite: 7c793c9f5834e756b336257a8d8b8239b7ceb451 react-native-release-profiler: 131ec5e4145d900b2be2a8d6641e2ce0dd784259 react-native-safe-area-context: 38fdd9b3c5561de7cabae64bd0cd2ce05d2768a1 - react-native-view-shot: ee44129a7c470310d3c7e67085834fc8cc077655 + react-native-view-shot: 6b7ed61d77d88580fed10954d45fad0eb2d47688 react-native-webview: ad29375839c9aa0409ce8e8693291b42bdc067a4 React-nativeconfig: 57781b79e11d5af7573e6f77cbf1143b71802a6d React-NativeModulesApple: 7ff2e2cfb2e5fa5bdedcecf28ce37e696c6ef1e1 @@ -3276,8 +3246,8 @@ SPEC CHECKSUMS: SocketRocket: abac6f5de4d4d62d24e11868d7a2f427e0ef940d Turf: aa2ede4298009639d10db36aba1a7ebaad072a5e VisionCamera: c6c8aa4b028501fc87644550fbc35a537d4da3fb - Yoga: 2a45d7e59592db061217551fd3bbe2dd993817ae + Yoga: a1d7895431387402a674fd0d1c04ec85e87909b8 -PODFILE CHECKSUM: 15e2f095b9c80d658459723edf84005a6867debf +PODFILE CHECKSUM: a07e55247056ec5d84d1af31d694506efff3cfe2 COCOAPODS: 1.15.2 diff --git a/jest/setup.ts b/jest/setup.ts index 7dbe91c32fda..6901ad3c66f3 100644 --- a/jest/setup.ts +++ b/jest/setup.ts @@ -1,6 +1,5 @@ /* eslint-disable max-classes-per-file */ import '@shopify/flash-list/jestSetup'; -import type * as RNAppLogs from 'react-native-app-logs'; import 'react-native-gesture-handler/jestSetup'; import type * as RNKeyboardController from 'react-native-keyboard-controller'; import mockStorage from 'react-native-onyx/dist/storage/__mocks__'; @@ -76,8 +75,6 @@ jest.mock('react-native-reanimated', () => ({ jest.mock('react-native-keyboard-controller', () => require('react-native-keyboard-controller/jest')); -jest.mock('react-native-app-logs', () => require('react-native-app-logs/jest')); - jest.mock('@src/libs/actions/Timing', () => ({ start: jest.fn(), end: jest.fn(), diff --git a/package-lock.json b/package-lock.json index d14689a59ae4..e7cc5bbdc58e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -75,7 +75,6 @@ "react-map-gl": "^7.1.3", "react-native": "0.75.2", "react-native-android-location-enabler": "^2.0.1", - "react-native-app-logs": "git+https://github.com/margelo/react-native-app-logs#4653bc25b600497c5c64f2897f9778c796193238", "react-native-blob-util": "0.19.4", "react-native-collapsible": "^1.6.2", "react-native-config": "1.5.0", @@ -34389,18 +34388,6 @@ "prop-types": "^15.7.2" } }, - "node_modules/react-native-app-logs": { - "version": "0.2.2", - "resolved": "git+ssh://git@github.com/margelo/react-native-app-logs.git#4653bc25b600497c5c64f2897f9778c796193238", - "integrity": "sha512-nPZhRCtobnGQB9rm0q4vxNWVNtyU5vgR/9wfg8KHaZgp6Bqb7jMTljZLXNJKPewhlQhvf0u4b/cHlt/CkMyU9Q==", - "workspaces": [ - "example" - ], - "peerDependencies": { - "react": "*", - "react-native": "*" - } - }, "node_modules/react-native-blob-util": { "version": "0.19.4", "license": "MIT", diff --git a/package.json b/package.json index dba6c39a5dff..923dfdcd88ea 100644 --- a/package.json +++ b/package.json @@ -132,7 +132,6 @@ "react-map-gl": "^7.1.3", "react-native": "0.75.2", "react-native-android-location-enabler": "^2.0.1", - "react-native-app-logs": "git+https://github.com/margelo/react-native-app-logs#4653bc25b600497c5c64f2897f9778c796193238", "react-native-blob-util": "0.19.4", "react-native-collapsible": "^1.6.2", "react-native-config": "1.5.0", diff --git a/src/libs/Log.ts b/src/libs/Log.ts index b9d1b246425e..72673b8d3f79 100644 --- a/src/libs/Log.ts +++ b/src/libs/Log.ts @@ -3,7 +3,6 @@ /* eslint-disable rulesdir/no-api-in-views */ import {Logger} from 'expensify-common'; -import AppLogs from 'react-native-app-logs'; import Onyx from 'react-native-onyx'; import type {Merge} from 'type-fest'; import CONST from '@src/CONST'; @@ -83,21 +82,4 @@ const Log = new Logger({ }); timeout = setTimeout(() => Log.info('Flushing logs older than 10 minutes', true, {}, true), 10 * 60 * 1000); -AppLogs.configureAppGroupName('group.com.expensify.new'); -AppLogs.registerHandler({ - filter: '[NotificationService]', - handler: ({filter, logs}) => { - logs.forEach((log) => { - // Both native and JS logs are captured by the filter so we replace the filter before logging to avoid an infinite loop - const message = `[PushNotification] ${log.message.replace(filter, 'NotificationService -')}`; - - if (log.level === 'error') { - Log.hmmm(message); - } else { - Log.info(message); - } - }); - }, -}); - export default Log; From 1da543aa49f65a9c491e901c274a28635b3821c6 Mon Sep 17 00:00:00 2001 From: Carlos Miceli Date: Wed, 2 Oct 2024 21:28:42 -0300 Subject: [PATCH 452/555] fix double submit routing issue --- src/libs/Navigation/AppNavigator/AuthScreens.tsx | 2 +- src/libs/actions/Welcome/OnboardingFlow.ts | 16 ++++++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/src/libs/Navigation/AppNavigator/AuthScreens.tsx b/src/libs/Navigation/AppNavigator/AuthScreens.tsx index e5dea2bd61a3..5e973f9229e4 100644 --- a/src/libs/Navigation/AppNavigator/AuthScreens.tsx +++ b/src/libs/Navigation/AppNavigator/AuthScreens.tsx @@ -276,7 +276,7 @@ function AuthScreens({session, lastOpenedPublicRoomID, initialLastUpdateIDApplie let signupQualifier; if (currentUrl.includes('signupQualifier')) { - signupQualifier = currentUrl.split('signupQualifier=')[1].split('&')[0]; + signupQualifier = new URL(currentUrl).searchParams.get('signupQualifier') } if (signupQualifier) { if (signupQualifier === CONST.ONBOARDING_SIGNUP_QUALIFIERS.INDIVIDUAL) { diff --git a/src/libs/actions/Welcome/OnboardingFlow.ts b/src/libs/actions/Welcome/OnboardingFlow.ts index bc89effc9b50..6bb58dc6b76c 100644 --- a/src/libs/actions/Welcome/OnboardingFlow.ts +++ b/src/libs/actions/Welcome/OnboardingFlow.ts @@ -10,6 +10,7 @@ import NAVIGATORS from '@src/NAVIGATORS'; import ONYXKEYS from '@src/ONYXKEYS'; import ROUTES from '@src/ROUTES'; import SCREENS from '@src/SCREENS'; +import Onboarding from '@src/types/onyx/Onboarding'; let selectedPurpose: string | undefined = ''; Onyx.connect({ @@ -31,6 +32,16 @@ const onboardingLastVisitedPathConnection = Onyx.connect({ }, }); +let onboardingValues: Onboarding; +Onyx.connect({ + key: ONYXKEYS.NVP_ONBOARDING, + callback: (value) => { + if (value !== undefined) { + onboardingValues = value as Onboarding; + } + }, +}); + /** * Build the correct stack order for `onboardingModalNavigator`, * based on onboarding data (currently from the selected purpose). @@ -103,6 +114,11 @@ function startOnboardingFlow() { function getOnboardingInitialPath(): string { const state = getStateFromPath(onboardingInitialPath, linkingConfig.config); + const showBusinessModal = onboardingValues && 'signupQualifier' in onboardingValues && onboardingValues.signupQualifier === CONST.ONBOARDING_SIGNUP_QUALIFIERS.VSB; + + if (showBusinessModal) { + return `/${ROUTES.ONBOARDING_WORK.route}`; + } if (state?.routes?.at(-1)?.name !== NAVIGATORS.ONBOARDING_MODAL_NAVIGATOR) { return `/${ROUTES.ONBOARDING_ROOT.route}`; } From 783f518a30ef4e84bce3de8d604f911ea096cf40 Mon Sep 17 00:00:00 2001 From: Carlos Miceli Date: Wed, 2 Oct 2024 21:33:01 -0300 Subject: [PATCH 453/555] fix prettier --- src/libs/Navigation/AppNavigator/AuthScreens.tsx | 2 +- src/pages/OnboardingWork/BaseOnboardingWork.tsx | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/libs/Navigation/AppNavigator/AuthScreens.tsx b/src/libs/Navigation/AppNavigator/AuthScreens.tsx index 5e973f9229e4..ddbb11759eb0 100644 --- a/src/libs/Navigation/AppNavigator/AuthScreens.tsx +++ b/src/libs/Navigation/AppNavigator/AuthScreens.tsx @@ -276,7 +276,7 @@ function AuthScreens({session, lastOpenedPublicRoomID, initialLastUpdateIDApplie let signupQualifier; if (currentUrl.includes('signupQualifier')) { - signupQualifier = new URL(currentUrl).searchParams.get('signupQualifier') + signupQualifier = new URL(currentUrl).searchParams.get('signupQualifier'); } if (signupQualifier) { if (signupQualifier === CONST.ONBOARDING_SIGNUP_QUALIFIERS.INDIVIDUAL) { diff --git a/src/pages/OnboardingWork/BaseOnboardingWork.tsx b/src/pages/OnboardingWork/BaseOnboardingWork.tsx index 2847c69b8a2e..03dbada60f9c 100644 --- a/src/pages/OnboardingWork/BaseOnboardingWork.tsx +++ b/src/pages/OnboardingWork/BaseOnboardingWork.tsx @@ -25,6 +25,7 @@ import ONYXKEYS from '@src/ONYXKEYS'; import ROUTES from '@src/ROUTES'; import INPUT_IDS from '@src/types/form/WorkForm'; import type {BaseOnboardingWorkProps} from './types'; + function BaseOnboardingWork({shouldUseNativeStyles, route}: BaseOnboardingWorkProps) { const styles = useThemeStyles(); const {translate} = useLocalize(); From e00c18d20e422e196b5a6851a2fc4e349059b839 Mon Sep 17 00:00:00 2001 From: Jasper Huang Date: Wed, 2 Oct 2024 17:34:15 -0700 Subject: [PATCH 454/555] revert --- ios/NotificationServiceExtension/NotificationService.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ios/NotificationServiceExtension/NotificationService.swift b/ios/NotificationServiceExtension/NotificationService.swift index 806d14d4c786..e489cb368d17 100644 --- a/ios/NotificationServiceExtension/NotificationService.swift +++ b/ios/NotificationServiceExtension/NotificationService.swift @@ -42,7 +42,7 @@ class NotificationService: UANotificationServiceExtension { do { notificationData = try parsePayload(notificationContent: notificationContent) } catch ExpError.runtimeError(let errorMessage) { - os_log("[NotificationService] configureCommunicationNotification() - couldn't parse the payload '%{public}@'", log: log, type: .error, errorMessage) + os_log("[NotificationService] configureCommunicationNotification() - couldn't parse the payload '%@'", log: log, type: .error, errorMessage) contentHandler(notificationContent) return } catch { @@ -212,7 +212,7 @@ class NotificationService: UANotificationServiceExtension { let data = try Data(contentsOf: url) return INImage(imageData: data) } catch { - os_log("[NotificationService] fetchINImage() - failed to fetch avatar. reportActionID: %{public}@", log: self.log, type: .error, reportActionID) + os_log("[NotificationService] fetchINImage() - failed to fetch avatar. reportActionID: %@", log: self.log, type: .error, reportActionID) return nil } } From 9f6280a606ce30ed919ac8eef6528f5c2133df6e Mon Sep 17 00:00:00 2001 From: rory Date: Wed, 2 Oct 2024 17:36:27 -0700 Subject: [PATCH 455/555] Provide pull_request_number to AdHoc builds --- .github/workflows/buildAndroid.yml | 11 ++++++++++- .github/workflows/testBuild.yml | 1 + 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/.github/workflows/buildAndroid.yml b/.github/workflows/buildAndroid.yml index 091b88a59d94..582cb05256fa 100644 --- a/.github/workflows/buildAndroid.yml +++ b/.github/workflows/buildAndroid.yml @@ -16,6 +16,10 @@ on: type: string required: false default: '' + pull_request_number: + description: The pull request number associated with this build, if relevant. + type: number + required: false outputs: AAB_FILE_NAME: value: ${{ jobs.build.outputs.AAB_FILE_NAME }} @@ -38,6 +42,11 @@ on: required: true type: string + pull_request_number: + description: The pull request number associated with this build, if relevant. + type: number + required: false + jobs: build: name: Build Android app @@ -94,7 +103,7 @@ jobs: if [ '${{ inputs.type }}' == 'adhoc' ]; then cp .env.staging .env.adhoc sed -i 's/ENVIRONMENT=staging/ENVIRONMENT=adhoc/' .env.adhoc - echo "PULL_REQUEST_NUMBER=$PULL_REQUEST_NUMBER" >> .env.adhoc + echo "PULL_REQUEST_NUMBER=${{ inputs.pull_request_number }}" >> .env.adhoc else envFile='' if [ '${{ inputs.type }}' == 'e2e' ]; then diff --git a/.github/workflows/testBuild.yml b/.github/workflows/testBuild.yml index 3847eaed6fd1..0a28d155f760 100644 --- a/.github/workflows/testBuild.yml +++ b/.github/workflows/testBuild.yml @@ -69,6 +69,7 @@ jobs: with: type: adhoc ref: ${{ github.event.pull_request.head.sha || needs.getBranchRef.outputs.REF }} + pull_request_number: ${{ env.PULL_REQUEST_NUMBER }} uploadAndroid: name: Upload Android app to S3 From ca043537a2da2675a1031106345bf7d610fb2212 Mon Sep 17 00:00:00 2001 From: Carlos Miceli Date: Wed, 2 Oct 2024 21:43:01 -0300 Subject: [PATCH 456/555] eslint --- src/libs/actions/Welcome/OnboardingFlow.ts | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/libs/actions/Welcome/OnboardingFlow.ts b/src/libs/actions/Welcome/OnboardingFlow.ts index 6bb58dc6b76c..a96688d8c3ad 100644 --- a/src/libs/actions/Welcome/OnboardingFlow.ts +++ b/src/libs/actions/Welcome/OnboardingFlow.ts @@ -10,7 +10,7 @@ import NAVIGATORS from '@src/NAVIGATORS'; import ONYXKEYS from '@src/ONYXKEYS'; import ROUTES from '@src/ROUTES'; import SCREENS from '@src/SCREENS'; -import Onboarding from '@src/types/onyx/Onboarding'; +import type Onboarding from '@src/types/onyx/Onboarding'; let selectedPurpose: string | undefined = ''; Onyx.connect({ @@ -36,9 +36,10 @@ let onboardingValues: Onboarding; Onyx.connect({ key: ONYXKEYS.NVP_ONBOARDING, callback: (value) => { - if (value !== undefined) { - onboardingValues = value as Onboarding; + if (value === undefined) { + return; } + onboardingValues = value as Onboarding; }, }); From 74420b64246c723c418ba1616b6cac5d40be695e Mon Sep 17 00:00:00 2001 From: rory Date: Wed, 2 Oct 2024 17:56:28 -0700 Subject: [PATCH 457/555] Make it type: string to make lint happy --- .github/workflows/buildAndroid.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/buildAndroid.yml b/.github/workflows/buildAndroid.yml index 582cb05256fa..114c42d407e2 100644 --- a/.github/workflows/buildAndroid.yml +++ b/.github/workflows/buildAndroid.yml @@ -18,7 +18,7 @@ on: default: '' pull_request_number: description: The pull request number associated with this build, if relevant. - type: number + type: string required: false outputs: AAB_FILE_NAME: From 5a4d56d29c07a5c182be50a23b0d028a1a2f674d Mon Sep 17 00:00:00 2001 From: rory Date: Wed, 2 Oct 2024 18:16:57 -0700 Subject: [PATCH 458/555] Don't access env where it's not available --- .github/workflows/testBuild.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/testBuild.yml b/.github/workflows/testBuild.yml index 0a28d155f760..672d468ed3b1 100644 --- a/.github/workflows/testBuild.yml +++ b/.github/workflows/testBuild.yml @@ -69,7 +69,7 @@ jobs: with: type: adhoc ref: ${{ github.event.pull_request.head.sha || needs.getBranchRef.outputs.REF }} - pull_request_number: ${{ env.PULL_REQUEST_NUMBER }} + pull_request_number: ${{ github.event.number || github.event.inputs.PULL_REQUEST_NUMBER }} uploadAndroid: name: Upload Android app to S3 From 33cd21227f2cbd7e8d4e3a203921898abe64eda2 Mon Sep 17 00:00:00 2001 From: Wildan Muhlis Date: Thu, 3 Oct 2024 08:56:54 +0700 Subject: [PATCH 459/555] Refine comment, add why point --- .../Attachments/AttachmentCarousel/index.native.tsx | 5 ++++- src/components/Attachments/AttachmentCarousel/index.tsx | 5 ++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/components/Attachments/AttachmentCarousel/index.native.tsx b/src/components/Attachments/AttachmentCarousel/index.native.tsx index 754dcce6c73e..a8eb614202a7 100644 --- a/src/components/Attachments/AttachmentCarousel/index.native.tsx +++ b/src/components/Attachments/AttachmentCarousel/index.native.tsx @@ -42,11 +42,14 @@ function AttachmentCarousel({report, source, onNavigate, setDownloadButtonVisibi let newIndex = newAttachments.findIndex(compareImage); const index = attachments.findIndex(compareImage); - // If no matching attachment with the same index, dismiss the modal + // If newAttachments includes an attachment with the same index, update newIndex to that index. + // Previously, uploading an attachment offline would dismiss the modal when the image was previewed and the connection was restored. + // Now, instead of dismissing the modal, we replace it with the new attachment that has the same index. if (newIndex === -1 && index !== -1 && newAttachments.at(index)) { newIndex = index; } + // If no matching attachment with the same index, dismiss the modal if (newIndex === -1 && index !== -1 && attachments.at(index)) { Navigation.dismissModal(); } else { diff --git a/src/components/Attachments/AttachmentCarousel/index.tsx b/src/components/Attachments/AttachmentCarousel/index.tsx index 1672f5a4dfdb..a1408aaf400e 100644 --- a/src/components/Attachments/AttachmentCarousel/index.tsx +++ b/src/components/Attachments/AttachmentCarousel/index.tsx @@ -92,11 +92,14 @@ function AttachmentCarousel({report, source, onNavigate, setDownloadButtonVisibi let newIndex = newAttachments.findIndex(compareImage); const index = attachments.findIndex(compareImage); - // If no matching attachment with the same index, dismiss the modal + // If newAttachments includes an attachment with the same index, update newIndex to that index. + // Previously, uploading an attachment offline would dismiss the modal when the image was previewed and the connection was restored. + // Now, instead of dismissing the modal, we replace it with the new attachment that has the same index. if (newIndex === -1 && index !== -1 && newAttachments.at(index)) { newIndex = index; } + // If no matching attachment with the same index, dismiss the modal if (newIndex === -1 && index !== -1 && attachments.at(index)) { Navigation.dismissModal(); } else { From e02df29fc8ff05da2a242775fe972cf2bc5b817a Mon Sep 17 00:00:00 2001 From: OSBotify Date: Thu, 3 Oct 2024 02:04:23 +0000 Subject: [PATCH 460/555] Update version to 9.0.43-6 --- android/app/build.gradle | 4 ++-- ios/NewExpensify/Info.plist | 2 +- ios/NewExpensifyTests/Info.plist | 2 +- ios/NotificationServiceExtension/Info.plist | 2 +- package-lock.json | 4 ++-- package.json | 2 +- 6 files changed, 8 insertions(+), 8 deletions(-) diff --git a/android/app/build.gradle b/android/app/build.gradle index 07b2a557d339..13dbe966b4a7 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -110,8 +110,8 @@ android { minSdkVersion rootProject.ext.minSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion multiDexEnabled rootProject.ext.multiDexEnabled - versionCode 1009004305 - versionName "9.0.43-5" + versionCode 1009004306 + versionName "9.0.43-6" // Supported language variants must be declared here to avoid from being removed during the compilation. // This also helps us to not include unnecessary language variants in the APK. resConfigs "en", "es" diff --git a/ios/NewExpensify/Info.plist b/ios/NewExpensify/Info.plist index ac237507861a..153a5341b932 100644 --- a/ios/NewExpensify/Info.plist +++ b/ios/NewExpensify/Info.plist @@ -40,7 +40,7 @@ CFBundleVersion - 9.0.43.5 + 9.0.43.6 FullStory OrgId diff --git a/ios/NewExpensifyTests/Info.plist b/ios/NewExpensifyTests/Info.plist index 4fcfa8000138..c2cff756771d 100644 --- a/ios/NewExpensifyTests/Info.plist +++ b/ios/NewExpensifyTests/Info.plist @@ -19,6 +19,6 @@ CFBundleSignature ???? CFBundleVersion - 9.0.43.5 + 9.0.43.6 diff --git a/ios/NotificationServiceExtension/Info.plist b/ios/NotificationServiceExtension/Info.plist index aea283903ca3..eff1be3acd96 100644 --- a/ios/NotificationServiceExtension/Info.plist +++ b/ios/NotificationServiceExtension/Info.plist @@ -13,7 +13,7 @@ CFBundleShortVersionString 9.0.43 CFBundleVersion - 9.0.43.5 + 9.0.43.6 NSExtension NSExtensionPointIdentifier diff --git a/package-lock.json b/package-lock.json index e7cc5bbdc58e..671834c4b975 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "new.expensify", - "version": "9.0.43-5", + "version": "9.0.43-6", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "new.expensify", - "version": "9.0.43-5", + "version": "9.0.43-6", "hasInstallScript": true, "license": "MIT", "dependencies": { diff --git a/package.json b/package.json index 923dfdcd88ea..1be7cbd1cdbe 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "new.expensify", - "version": "9.0.43-5", + "version": "9.0.43-6", "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.", From f8769d8874da1f034cd65bc62e0a5dc01debdb55 Mon Sep 17 00:00:00 2001 From: cretadn22 Date: Thu, 3 Oct 2024 10:12:45 +0700 Subject: [PATCH 461/555] reset selected transaction if getting new updates --- src/components/Search/index.tsx | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/src/components/Search/index.tsx b/src/components/Search/index.tsx index e459be1815bc..97f58dc8624a 100644 --- a/src/components/Search/index.tsx +++ b/src/components/Search/index.tsx @@ -180,12 +180,31 @@ function Search({queryJSON, onSearchListScroll, contentContainerStyle}: SearchPr const shouldShowLoadingMoreItems = !shouldShowLoadingState && searchResults?.search?.isLoading && searchResults?.search?.offset > 0; const isSearchResultsEmpty = !searchResults?.data || SearchUtils.isSearchResultsEmpty(searchResults); const prevIsSearchResultEmpty = usePrevious(isSearchResultsEmpty); + const data = searchResults === undefined ? [] : SearchUtils.getSections(type, status, searchResults.data, searchResults.search); useEffect(() => { /** We only want to display the skeleton for the status filters the first time we load them for a specific data type */ setShouldShowStatusBarLoading(shouldShowLoadingState && searchResults?.search?.type !== type); }, [searchResults?.search?.type, setShouldShowStatusBarLoading, shouldShowLoadingState, type]); + useEffect(() => { + const newTransactionList: SelectedTransactions = {}; + data.forEach((report) => { + report?.transactions?.forEach((transaction) => { + if (Object.keys(selectedTransactions).includes(transaction.transactionID)) { + newTransactionList[transaction.transactionID] = { + action: transaction.action, + canHold: transaction.canHold, + canUnhold: transaction.canUnhold, + isSelected: selectedTransactions[transaction.transactionID].isSelected, + canDelete: transaction.canDelete, + } + } + }) + }) + setSelectedTransactions(newTransactionList, data); + }, [data]) + useEffect(() => { if (!isSearchResultsEmpty || prevIsSearchResultEmpty) { return; @@ -208,7 +227,6 @@ function Search({queryJSON, onSearchListScroll, contentContainerStyle}: SearchPr } const ListItem = SearchUtils.getListItem(type, status); - const data = SearchUtils.getSections(type, status, searchResults.data, searchResults.search); const sortedData = SearchUtils.getSortedSections(type, status, data, sortBy, sortOrder); const sortedSelectedData = sortedData.map((item) => { const baseKey = `${ONYXKEYS.COLLECTION.TRANSACTION}${(item as TransactionListItemType).transactionID}`; From e61ee7fbe60acc12879b9d5cc6ef92c4a0b98caa Mon Sep 17 00:00:00 2001 From: OSBotify Date: Thu, 3 Oct 2024 03:17:30 +0000 Subject: [PATCH 462/555] Update version to 9.0.44-0 --- android/app/build.gradle | 4 ++-- ios/NewExpensify/Info.plist | 4 ++-- ios/NewExpensifyTests/Info.plist | 4 ++-- ios/NotificationServiceExtension/Info.plist | 4 ++-- package-lock.json | 4 ++-- package.json | 2 +- 6 files changed, 11 insertions(+), 11 deletions(-) diff --git a/android/app/build.gradle b/android/app/build.gradle index 13dbe966b4a7..ae7625810a14 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -110,8 +110,8 @@ android { minSdkVersion rootProject.ext.minSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion multiDexEnabled rootProject.ext.multiDexEnabled - versionCode 1009004306 - versionName "9.0.43-6" + versionCode 1009004400 + versionName "9.0.44-0" // Supported language variants must be declared here to avoid from being removed during the compilation. // This also helps us to not include unnecessary language variants in the APK. resConfigs "en", "es" diff --git a/ios/NewExpensify/Info.plist b/ios/NewExpensify/Info.plist index 153a5341b932..43cae757b784 100644 --- a/ios/NewExpensify/Info.plist +++ b/ios/NewExpensify/Info.plist @@ -19,7 +19,7 @@ CFBundlePackageType APPL CFBundleShortVersionString - 9.0.43 + 9.0.44 CFBundleSignature ???? CFBundleURLTypes @@ -40,7 +40,7 @@ CFBundleVersion - 9.0.43.6 + 9.0.44.0 FullStory OrgId diff --git a/ios/NewExpensifyTests/Info.plist b/ios/NewExpensifyTests/Info.plist index c2cff756771d..b1715a829e2a 100644 --- a/ios/NewExpensifyTests/Info.plist +++ b/ios/NewExpensifyTests/Info.plist @@ -15,10 +15,10 @@ CFBundlePackageType BNDL CFBundleShortVersionString - 9.0.43 + 9.0.44 CFBundleSignature ???? CFBundleVersion - 9.0.43.6 + 9.0.44.0 diff --git a/ios/NotificationServiceExtension/Info.plist b/ios/NotificationServiceExtension/Info.plist index eff1be3acd96..7b8d7e40f1f6 100644 --- a/ios/NotificationServiceExtension/Info.plist +++ b/ios/NotificationServiceExtension/Info.plist @@ -11,9 +11,9 @@ CFBundleName $(PRODUCT_NAME) CFBundleShortVersionString - 9.0.43 + 9.0.44 CFBundleVersion - 9.0.43.6 + 9.0.44.0 NSExtension NSExtensionPointIdentifier diff --git a/package-lock.json b/package-lock.json index 671834c4b975..33baf6a35084 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "new.expensify", - "version": "9.0.43-6", + "version": "9.0.44-0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "new.expensify", - "version": "9.0.43-6", + "version": "9.0.44-0", "hasInstallScript": true, "license": "MIT", "dependencies": { diff --git a/package.json b/package.json index 1be7cbd1cdbe..527a293a6a9e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "new.expensify", - "version": "9.0.43-6", + "version": "9.0.44-0", "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.", From 2cecae194d9564aeefc2ae77ccf05e491a4fbf8e Mon Sep 17 00:00:00 2001 From: cretadn22 Date: Thu, 3 Oct 2024 10:32:26 +0700 Subject: [PATCH 463/555] adjust lint error and TS error --- src/components/Search/index.tsx | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/components/Search/index.tsx b/src/components/Search/index.tsx index 97f58dc8624a..2663d6a0f04f 100644 --- a/src/components/Search/index.tsx +++ b/src/components/Search/index.tsx @@ -190,7 +190,8 @@ function Search({queryJSON, onSearchListScroll, contentContainerStyle}: SearchPr useEffect(() => { const newTransactionList: SelectedTransactions = {}; data.forEach((report) => { - report?.transactions?.forEach((transaction) => { + const transactions: TransactionListItemType[] = Object.hasOwn(report, 'transactions') && 'transactions' in report ? report.transactions : []; + transactions.forEach((transaction) => { if (Object.keys(selectedTransactions).includes(transaction.transactionID)) { newTransactionList[transaction.transactionID] = { action: transaction.action, @@ -198,13 +199,14 @@ function Search({queryJSON, onSearchListScroll, contentContainerStyle}: SearchPr canUnhold: transaction.canUnhold, isSelected: selectedTransactions[transaction.transactionID].isSelected, canDelete: transaction.canDelete, - } + }; } - }) - }) + }); + }); setSelectedTransactions(newTransactionList, data); - }, [data]) - + // eslint-disable-next-line react-compiler/react-compiler, react-hooks/exhaustive-deps + }, [data, setSelectedTransactions]); + useEffect(() => { if (!isSearchResultsEmpty || prevIsSearchResultEmpty) { return; From 10767d0ba6811e63f918aeb9dd605b02bed21d3b Mon Sep 17 00:00:00 2001 From: cretadn22 Date: Thu, 3 Oct 2024 10:44:39 +0700 Subject: [PATCH 464/555] adjust lint --- src/components/Search/index.tsx | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/src/components/Search/index.tsx b/src/components/Search/index.tsx index 2663d6a0f04f..3556ff068b55 100644 --- a/src/components/Search/index.tsx +++ b/src/components/Search/index.tsx @@ -190,17 +190,18 @@ function Search({queryJSON, onSearchListScroll, contentContainerStyle}: SearchPr useEffect(() => { const newTransactionList: SelectedTransactions = {}; data.forEach((report) => { - const transactions: TransactionListItemType[] = Object.hasOwn(report, 'transactions') && 'transactions' in report ? report.transactions : []; - transactions.forEach((transaction) => { - if (Object.keys(selectedTransactions).includes(transaction.transactionID)) { - newTransactionList[transaction.transactionID] = { - action: transaction.action, - canHold: transaction.canHold, - canUnhold: transaction.canUnhold, - isSelected: selectedTransactions[transaction.transactionID].isSelected, - canDelete: transaction.canDelete, - }; + const transactionsData: TransactionListItemType[] = Object.hasOwn(report, 'transactions') && 'transactions' in report ? report.transactions : []; + transactionsData.forEach((transaction) => { + if (!Object.keys(selectedTransactions).includes(transaction.transactionID)) { + return; } + newTransactionList[transaction.transactionID] = { + action: transaction.action, + canHold: transaction.canHold, + canUnhold: transaction.canUnhold, + isSelected: selectedTransactions[transaction.transactionID].isSelected, + canDelete: transaction.canDelete, + }; }); }); setSelectedTransactions(newTransactionList, data); From 52c3de16dee277c3695ab70d9b2d33afcfdf2e35 Mon Sep 17 00:00:00 2001 From: nkdengineer Date: Thu, 3 Oct 2024 11:16:59 +0700 Subject: [PATCH 465/555] add fallback reportId as -1 --- src/pages/home/report/ReportActionItem.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pages/home/report/ReportActionItem.tsx b/src/pages/home/report/ReportActionItem.tsx index 428ea082b42e..3a2fb427e630 100644 --- a/src/pages/home/report/ReportActionItem.tsx +++ b/src/pages/home/report/ReportActionItem.tsx @@ -393,7 +393,7 @@ function ReportActionItem({ const attachmentContextValue = useMemo(() => ({reportID, type: CONST.ATTACHMENT_TYPE.REPORT}), [reportID]); - const mentionReportContextValue = useMemo(() => ({currentReportID: report?.reportID ?? ''}), [report?.reportID]); + const mentionReportContextValue = useMemo(() => ({currentReportID: report?.reportID ?? '-1'}), [report?.reportID]); const actionableItemButtons: ActionableItem[] = useMemo(() => { if (ReportActionsUtils.isActionableAddPaymentCard(action) && shouldRenderAddPaymentCard()) { From 2aed3554e88db7e304632ad2aa33a7cf7311d0c2 Mon Sep 17 00:00:00 2001 From: nkdengineer Date: Thu, 3 Oct 2024 11:45:14 +0700 Subject: [PATCH 466/555] fix: The intro text on private notes list stays fixed --- src/pages/PrivateNotes/PrivateNotesListPage.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pages/PrivateNotes/PrivateNotesListPage.tsx b/src/pages/PrivateNotes/PrivateNotesListPage.tsx index cc7ee9f54daa..a7827d9d10af 100644 --- a/src/pages/PrivateNotes/PrivateNotesListPage.tsx +++ b/src/pages/PrivateNotes/PrivateNotesListPage.tsx @@ -102,11 +102,11 @@ function PrivateNotesListPage({report, personalDetailsList, session}: PrivateNot onBackButtonPress={() => Navigation.goBack(ROUTES.REPORT_WITH_ID_DETAILS.getRoute(report.reportID, backTo))} onCloseButtonPress={() => Navigation.dismissModal()} /> - {translate('privateNotes.personalNoteMessage')} + {translate('privateNotes.personalNoteMessage')} {privateNotes.map((item) => getMenuItem(item))} From 2790ba4f1069d7be2fd400d98336f5dd89d8e16b Mon Sep 17 00:00:00 2001 From: Tomasz Misiukiewicz Date: Thu, 3 Oct 2024 08:43:34 +0200 Subject: [PATCH 467/555] handle null value when masking data --- src/libs/ExportOnyxState/common.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/libs/ExportOnyxState/common.ts b/src/libs/ExportOnyxState/common.ts index 46bc425f22e2..46a47528f1fe 100644 --- a/src/libs/ExportOnyxState/common.ts +++ b/src/libs/ExportOnyxState/common.ts @@ -22,7 +22,11 @@ const maskSessionDetails = (data: Record): Record | unknown[], parentKey?: string): Record | unknown[] => { +const maskFragileData = (data: Record | unknown[] | null, parentKey?: string): Record | unknown[] | null => { + if (data === null) { + return data; + } + if (Array.isArray(data)) { return data.map((item): unknown => (typeof item === 'object' ? maskFragileData(item as Record, parentKey) : item)); } From 736ecb7ef6ca740d162218c11de2adbba8dae27f Mon Sep 17 00:00:00 2001 From: nkdengineer <161821005+nkdengineer@users.noreply.github.com> Date: Thu, 3 Oct 2024 14:45:36 +0700 Subject: [PATCH 468/555] Update src/languages/en.ts Co-authored-by: Kevin Brian Bader <56457735+ikevin127@users.noreply.github.com> --- src/languages/en.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/languages/en.ts b/src/languages/en.ts index 7025fa6cd71e..170aa9c93855 100755 --- a/src/languages/en.ts +++ b/src/languages/en.ts @@ -670,7 +670,7 @@ const translations = { beginningOfChatHistoryInvoiceRoomPartTwo: `. Use the + button to send an invoice.`, beginningOfChatHistory: 'This chat is with ', beginningOfChatHistoryPolicyExpenseChatPartOne: 'This is where ', - beginningOfChatHistoryPolicyExpenseChatPartTwo: ' will submit expenses to the ', + beginningOfChatHistoryPolicyExpenseChatPartTwo: ' will submit expenses to ', beginningOfChatHistoryPolicyExpenseChatPartThree: ' workspace. Just use the + button.', beginningOfChatHistorySelfDM: 'This is your personal space. Use it for notes, tasks, drafts, and reminders.', beginningOfChatHistorySystemDM: "Welcome! Let's get you set up.", From adfd63223f911ed6dd8d7d94f197ed5d7284f35d Mon Sep 17 00:00:00 2001 From: Bernhard Owen Josephus Date: Thu, 3 Oct 2024 16:14:36 +0800 Subject: [PATCH 469/555] don't promp to open in desktop if user is coming from desktop --- src/components/DeeplinkWrapper/index.website.tsx | 5 +++++ src/libs/actions/Link.ts | 3 ++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/src/components/DeeplinkWrapper/index.website.tsx b/src/components/DeeplinkWrapper/index.website.tsx index b395eb12c5fe..6f6562f97c17 100644 --- a/src/components/DeeplinkWrapper/index.website.tsx +++ b/src/components/DeeplinkWrapper/index.website.tsx @@ -22,6 +22,11 @@ function promptToOpenInDesktopApp(initialUrl = '') { // 2. There may be non-idempotent operations (e.g. create a new workspace), which obviously should not be executed again in the desktop app. // So we need to wait until after sign-in and navigation are complete before starting the deeplink redirect. if (Str.startsWith(window.location.pathname, Str.normalizeUrl(ROUTES.TRANSITION_BETWEEN_APPS))) { + const params = new URLSearchParams(window.location.search); + // If the user is redirected from the desktop app, don't prompt the user to open in desktop. + if (params.get('referrer') === 'desktop') { + return; + } App.beginDeepLinkRedirectAfterTransition(); } else { // Match any magic link (/v//<6 digit code>) diff --git a/src/libs/actions/Link.ts b/src/libs/actions/Link.ts index 886f8b06fc6f..13fcea0df85d 100644 --- a/src/libs/actions/Link.ts +++ b/src/libs/actions/Link.ts @@ -195,7 +195,8 @@ function buildURLWithAuthToken(url: string, shortLivedAuthToken?: string) { const emailParam = `email=${encodeURIComponent(currentUserEmail)}`; const exitTo = `exitTo=${url}`; const accountID = `accountID=${currentUserAccountID}`; - const paramsArray = [accountID, emailParam, authTokenParam, exitTo]; + const referrer = 'referrer=desktop'; + const paramsArray = [accountID, emailParam, authTokenParam, exitTo, referrer]; const params = paramsArray.filter(Boolean).join('&'); return `${CONFIG.EXPENSIFY.NEW_EXPENSIFY_URL}transition?${params}`; From 87649dc38e0732367e5a6e4a912c417b2d38b15d Mon Sep 17 00:00:00 2001 From: Christina Dobrzynski <51066321+Christinadobrzyn@users.noreply.github.com> Date: Thu, 3 Oct 2024 17:11:11 +0800 Subject: [PATCH 470/555] Update and rename Connect-Personal-US-Bank-Account.md to Connect-Personal-Bank-Account.md Removed the "US" from the article title and article path. --- ...onal-US-Bank-Account.md => Connect-Personal-Bank-Account.md} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename docs/articles/expensify-classic/bank-accounts-and-payments/bank-accounts/{Connect-Personal-US-Bank-Account.md => Connect-Personal-Bank-Account.md} (97%) diff --git a/docs/articles/expensify-classic/bank-accounts-and-payments/bank-accounts/Connect-Personal-US-Bank-Account.md b/docs/articles/expensify-classic/bank-accounts-and-payments/bank-accounts/Connect-Personal-Bank-Account.md similarity index 97% rename from docs/articles/expensify-classic/bank-accounts-and-payments/bank-accounts/Connect-Personal-US-Bank-Account.md rename to docs/articles/expensify-classic/bank-accounts-and-payments/bank-accounts/Connect-Personal-Bank-Account.md index 402337140419..a7b7ed1c4f4f 100644 --- a/docs/articles/expensify-classic/bank-accounts-and-payments/bank-accounts/Connect-Personal-US-Bank-Account.md +++ b/docs/articles/expensify-classic/bank-accounts-and-payments/bank-accounts/Connect-Personal-Bank-Account.md @@ -1,5 +1,5 @@ --- -title: Connect personal U.S. bank account +title: Connect personal bank account description: Receive reimbursements for expense reports submitted to your employer ---
From 12e60e367380b087833f8b3470d621b7537853a8 Mon Sep 17 00:00:00 2001 From: Christina Dobrzynski <51066321+Christinadobrzyn@users.noreply.github.com> Date: Thu, 3 Oct 2024 17:15:17 +0800 Subject: [PATCH 471/555] Update redirects.csv --- docs/redirects.csv | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/redirects.csv b/docs/redirects.csv index b47d6f2ae25c..0a5007b4fa61 100644 --- a/docs/redirects.csv +++ b/docs/redirects.csv @@ -577,4 +577,5 @@ https://help.expensify.com/articles/new-expensify/expenses-&-payments/pay-an-inv https://community.expensify.com/discussion/4707/how-to-set-up-your-mobile-app,https://help.expensify.com/articles/expensify-classic/getting-started/Join-your-company's-workspace#download-the-mobile-app https://community.expensify.com//discussion/6927/deep-dive-how-can-i-estimate-the-savings-applied-to-my-bill,https://help.expensify.com/articles/expensify-classic/expensify-billing/Billing-Overview#savings-calculator https://community.expensify.com/discussion/5179/faq-what-does-a-policy-for-which-you-are-an-admin-has-out-of-date-billing-information-mean,https://help.expensify.com/articles/expensify-classic/expensify-billing/Out-of-date-Billing -https://community.expensify.com/discussion/6179/setting-up-a-receipt-or-travel-integration-with-expensify,https://help.expensify.com/articles/expensify-classic/connections/Additional-Travel-Integrations \ No newline at end of file +https://community.expensify.com/discussion/6179/setting-up-a-receipt-or-travel-integration-with-expensify,https://help.expensify.com/articles/expensify-classic/connections/Additional-Travel-Integrations +https://help.expensify.com/articles/expensify-classic/bank-accounts-and-payments/bank-accounts/Connect-Personal-US-Bank-Account,https://help.expensify.com/articles/expensify-classic/bank-accounts-and-payments/bank-accounts/Connect-Personal-Bank-Account From 141a8e645963d03490bc53fed52f54ee022a9a20 Mon Sep 17 00:00:00 2001 From: Eduardo Date: Thu, 3 Oct 2024 11:36:54 +0200 Subject: [PATCH 472/555] disabling Jetifier --- android/app/build.gradle | 6 +++--- android/gradle.properties | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/android/app/build.gradle b/android/app/build.gradle index 64b903fdbe24..ec17f2fab156 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -229,11 +229,11 @@ dependencies { implementation 'com.facebook.fresco:fresco:2.5.0' implementation 'com.facebook.fresco:animated-gif:2.5.0' - // Android support library - implementation 'com.android.support:support-core-utils:28.0.0' + // AndroidX support library + implementation 'androidx.legacy:legacy-support-core-utils:1.0.0' // Multi Dex Support: https://developer.android.com/studio/build/multidex#mdex-gradle - implementation 'com.android.support:multidex:1.0.3' + implementation 'androidx.multidex:multidex:2.0.1' // Plaid SDK implementation project(':react-native-plaid-link-sdk') diff --git a/android/gradle.properties b/android/gradle.properties index 46cd98554d29..4fad4632765f 100644 --- a/android/gradle.properties +++ b/android/gradle.properties @@ -22,7 +22,7 @@ org.gradle.jvmargs=-Xmx6g -XX:MaxMetaspaceSize=512m # https://developer.android.com/topic/libraries/support-library/androidx-rn android.useAndroidX=true # Automatically convert third-party libraries to use AndroidX -android.enableJetifier=true +android.enableJetifier=false # Increase storage capacity (the default is 6 MB) AsyncStorage_db_size_in_MB=10 From 8ebfd562a3c7b61bde128bec3c111620442e0262 Mon Sep 17 00:00:00 2001 From: nkdengineer Date: Thu, 3 Oct 2024 16:43:58 +0700 Subject: [PATCH 473/555] fix eslint check --- .../PrivateNotes/PrivateNotesListPage.tsx | 28 ++++++------------- 1 file changed, 8 insertions(+), 20 deletions(-) diff --git a/src/pages/PrivateNotes/PrivateNotesListPage.tsx b/src/pages/PrivateNotes/PrivateNotesListPage.tsx index a7827d9d10af..424cc3e14683 100644 --- a/src/pages/PrivateNotes/PrivateNotesListPage.tsx +++ b/src/pages/PrivateNotes/PrivateNotesListPage.tsx @@ -1,8 +1,7 @@ import type {RouteProp} from '@react-navigation/native'; import {useRoute} from '@react-navigation/native'; import React, {useCallback, useMemo} from 'react'; -import type {OnyxEntry} from 'react-native-onyx'; -import {withOnyx} from 'react-native-onyx'; +import {useOnyx} from 'react-native-onyx'; import type {ValueOf} from 'type-fest'; import {AttachmentContext} from '@components/AttachmentContext'; import HeaderWithBackButton from '@components/HeaderWithBackButton'; @@ -20,19 +19,13 @@ import CONST from '@src/CONST'; import ONYXKEYS from '@src/ONYXKEYS'; import ROUTES from '@src/ROUTES'; import type SCREENS from '@src/SCREENS'; -import type {PersonalDetailsList, Report} from '@src/types/onyx'; +import type {Report} from '@src/types/onyx'; -type PrivateNotesListPageOnyxProps = { - /** All of the personal details for everyone */ - personalDetailsList: OnyxEntry; +type PrivateNotesListPageProps = WithReportAndPrivateNotesOrNotFoundProps & { + /** The report currently being looked at */ + report: Report; }; -type PrivateNotesListPageProps = WithReportAndPrivateNotesOrNotFoundProps & - PrivateNotesListPageOnyxProps & { - /** The report currently being looked at */ - report: Report; - }; - type NoteListItem = { title: string; action: () => void; @@ -43,9 +36,10 @@ type NoteListItem = { accountID: string; }; -function PrivateNotesListPage({report, personalDetailsList, session}: PrivateNotesListPageProps) { +function PrivateNotesListPage({report, session}: PrivateNotesListPageProps) { const route = useRoute>(); const backTo = route.params.backTo; + const [personalDetailsList] = useOnyx(ONYXKEYS.PERSONAL_DETAILS_LIST); const styles = useThemeStyles(); const {translate} = useLocalize(); const getAttachmentValue = useCallback((item: NoteListItem) => ({reportID: item.reportID, accountID: Number(item.accountID), type: CONST.ATTACHMENT_TYPE.NOTE}), []); @@ -115,10 +109,4 @@ function PrivateNotesListPage({report, personalDetailsList, session}: PrivateNot PrivateNotesListPage.displayName = 'PrivateNotesListPage'; -export default withReportAndPrivateNotesOrNotFound('privateNotes.title')( - withOnyx({ - personalDetailsList: { - key: ONYXKEYS.PERSONAL_DETAILS_LIST, - }, - })(PrivateNotesListPage), -); +export default withReportAndPrivateNotesOrNotFound('privateNotes.title')(PrivateNotesListPage); From 6100a629b6712cc41e0243eaff9c71a71bea3ce9 Mon Sep 17 00:00:00 2001 From: Eduardo Date: Thu, 3 Oct 2024 12:05:15 +0200 Subject: [PATCH 474/555] updated comment --- android/gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/android/gradle.properties b/android/gradle.properties index 4fad4632765f..038fb5c392e8 100644 --- a/android/gradle.properties +++ b/android/gradle.properties @@ -21,7 +21,7 @@ org.gradle.jvmargs=-Xmx6g -XX:MaxMetaspaceSize=512m # Android operating system, and which are packaged with your app's APK # https://developer.android.com/topic/libraries/support-library/androidx-rn android.useAndroidX=true -# Automatically convert third-party libraries to use AndroidX +# Disabled Jetifier to improve build performance as we're not using libraries that require Jetifier for AndroidX compatibility. android.enableJetifier=false # Increase storage capacity (the default is 6 MB) From dfb3325cd9bbc0a21e3283262096c83cdead0249 Mon Sep 17 00:00:00 2001 From: Jakub Szymczak Date: Thu, 3 Oct 2024 12:35:29 +0200 Subject: [PATCH 475/555] fix performance of SearchRouter --- .../Search/SearchRouter/SearchRouter.tsx | 69 ++++++++----------- .../Search/SearchRouter/SearchRouterModal.tsx | 30 ++++++++ .../Navigation/AppNavigator/AuthScreens.tsx | 4 +- 3 files changed, 60 insertions(+), 43 deletions(-) create mode 100644 src/components/Search/SearchRouter/SearchRouterModal.tsx diff --git a/src/components/Search/SearchRouter/SearchRouter.tsx b/src/components/Search/SearchRouter/SearchRouter.tsx index b3f147b7ac28..8f5ad55bc0c9 100644 --- a/src/components/Search/SearchRouter/SearchRouter.tsx +++ b/src/components/Search/SearchRouter/SearchRouter.tsx @@ -3,9 +3,7 @@ import debounce from 'lodash/debounce'; import React, {useCallback, useEffect, useMemo, useRef, useState} from 'react'; import {View} from 'react-native'; import {useOnyx} from 'react-native-onyx'; -import FocusTrapForModal from '@components/FocusTrap/FocusTrapForModal'; import HeaderWithBackButton from '@components/HeaderWithBackButton'; -import Modal from '@components/Modal'; import {useOptionsList} from '@components/OptionListContextProvider'; import type {SearchQueryJSON} from '@components/Search/types'; import type {SelectionListHandle} from '@components/SelectionList/types'; @@ -160,48 +158,37 @@ function SearchRouter() { clearUserQuery(); }); - const modalType = isSmallScreenWidth ? CONST.MODAL.MODAL_TYPE.CENTERED_UNSWIPEABLE : CONST.MODAL.MODAL_TYPE.POPOVER; const modalWidth = isSmallScreenWidth ? styles.w100 : {width: variables.popoverWidth}; return ( - - - - {isSmallScreenWidth && ( - closeSearchRouter()} - /> - )} - - - - - + + {isSmallScreenWidth && ( + closeSearchRouter()} + /> + )} + + + ); } diff --git a/src/components/Search/SearchRouter/SearchRouterModal.tsx b/src/components/Search/SearchRouter/SearchRouterModal.tsx new file mode 100644 index 000000000000..1f438d254a5f --- /dev/null +++ b/src/components/Search/SearchRouter/SearchRouterModal.tsx @@ -0,0 +1,30 @@ +import React from 'react'; +import FocusTrapForModal from '@components/FocusTrap/FocusTrapForModal'; +import Modal from '@components/Modal'; +import useResponsiveLayout from '@hooks/useResponsiveLayout'; +import CONST from '@src/CONST'; +import SearchRouter from './SearchRouter'; +import {useSearchRouterContext} from './SearchRouterContext'; + +function SearchRouterModal() { + const {isSmallScreenWidth} = useResponsiveLayout(); + const {isSearchRouterDisplayed, closeSearchRouter} = useSearchRouterContext(); + + const modalType = isSmallScreenWidth ? CONST.MODAL.MODAL_TYPE.CENTERED_UNSWIPEABLE : CONST.MODAL.MODAL_TYPE.POPOVER; + + return ( + + {isSearchRouterDisplayed && } + + ); +} + +SearchRouterModal.displayName = 'SearchRouterModal'; + +export default SearchRouterModal; diff --git a/src/libs/Navigation/AppNavigator/AuthScreens.tsx b/src/libs/Navigation/AppNavigator/AuthScreens.tsx index 0bdd87aa4358..0453e496cecf 100644 --- a/src/libs/Navigation/AppNavigator/AuthScreens.tsx +++ b/src/libs/Navigation/AppNavigator/AuthScreens.tsx @@ -7,7 +7,7 @@ import ActiveGuidesEventListener from '@components/ActiveGuidesEventListener'; import ComposeProviders from '@components/ComposeProviders'; import OptionsListContextProvider from '@components/OptionListContextProvider'; import {SearchContextProvider} from '@components/Search/SearchContext'; -import SearchRouter from '@components/Search/SearchRouter/SearchRouter'; +import SearchRouterModal from '@components/Search/SearchRouter/SearchRouterModal'; import useActiveWorkspace from '@hooks/useActiveWorkspace'; import useOnboardingFlowRouter from '@hooks/useOnboardingFlow'; import usePermissions from '@hooks/usePermissions'; @@ -578,7 +578,7 @@ function AuthScreens({session, lastOpenedPublicRoomID, initialLastUpdateIDApplie ); })} - + {didPusherInit && } From dc6dbd762d4337fec7787b42832feee3834f0fe7 Mon Sep 17 00:00:00 2001 From: Mateusz Rajski Date: Thu, 3 Oct 2024 12:56:02 +0200 Subject: [PATCH 476/555] Remove HybridAppMiddleware --- src/CONST.ts | 1 - .../HybridAppMiddleware/index.ios.tsx | 41 ------------------- src/components/HybridAppMiddleware/index.tsx | 13 ------ src/libs/Navigation/NavigationRoot.tsx | 6 +-- 4 files changed, 1 insertion(+), 60 deletions(-) delete mode 100644 src/components/HybridAppMiddleware/index.ios.tsx delete mode 100644 src/components/HybridAppMiddleware/index.tsx diff --git a/src/CONST.ts b/src/CONST.ts index 4ca9b45f13df..31b54b4816a9 100755 --- a/src/CONST.ts +++ b/src/CONST.ts @@ -4215,7 +4215,6 @@ const CONST = { }, EVENTS: { SCROLLING: 'scrolling', - ON_RETURN_TO_OLD_DOT: 'onReturnToOldDot', }, CHAT_HEADER_LOADER_HEIGHT: 36, diff --git a/src/components/HybridAppMiddleware/index.ios.tsx b/src/components/HybridAppMiddleware/index.ios.tsx deleted file mode 100644 index 6982487983c4..000000000000 --- a/src/components/HybridAppMiddleware/index.ios.tsx +++ /dev/null @@ -1,41 +0,0 @@ -import type React from 'react'; -import {useEffect} from 'react'; -import {NativeEventEmitter, NativeModules} from 'react-native'; -import type {NativeModule} from 'react-native'; -import Log from '@libs/Log'; -import CONST from '@src/CONST'; -import {useSplashScreenStateContext} from '@src/SplashScreenStateContext'; - -type HybridAppMiddlewareProps = { - authenticated: boolean; - children: React.ReactNode; -}; - -function HybridAppMiddleware({children}: HybridAppMiddlewareProps) { - const {setSplashScreenState} = useSplashScreenStateContext(); - - // In iOS, the HybridApp defines the `onReturnToOldDot` event. - // If we frequently transition from OldDot to NewDot during a single app lifecycle, - // we need to artificially display the bootsplash since the app is booted only once. - // Therefore, splashScreenState needs to be updated at the appropriate time. - useEffect(() => { - if (!NativeModules.HybridAppModule) { - return; - } - const HybridAppEvents = new NativeEventEmitter(NativeModules.HybridAppModule as unknown as NativeModule); - const listener = HybridAppEvents.addListener(CONST.EVENTS.ON_RETURN_TO_OLD_DOT, () => { - Log.info('[HybridApp] `onReturnToOldDot` event received. Resetting state of HybridAppMiddleware', true); - setSplashScreenState(CONST.BOOT_SPLASH_STATE.VISIBLE); - }); - - return () => { - listener.remove(); - }; - }, [setSplashScreenState]); - - return children; -} - -HybridAppMiddleware.displayName = 'HybridAppMiddleware'; - -export default HybridAppMiddleware; diff --git a/src/components/HybridAppMiddleware/index.tsx b/src/components/HybridAppMiddleware/index.tsx deleted file mode 100644 index 74e018bcfa5a..000000000000 --- a/src/components/HybridAppMiddleware/index.tsx +++ /dev/null @@ -1,13 +0,0 @@ -import type React from 'react'; - -type HybridAppMiddlewareProps = { - children: React.ReactNode; -}; - -function HybridAppMiddleware({children}: HybridAppMiddlewareProps) { - return children; -} - -HybridAppMiddleware.displayName = 'HybridAppMiddleware'; - -export default HybridAppMiddleware; diff --git a/src/libs/Navigation/NavigationRoot.tsx b/src/libs/Navigation/NavigationRoot.tsx index a1aa53bc0b7e..1003fe99583e 100644 --- a/src/libs/Navigation/NavigationRoot.tsx +++ b/src/libs/Navigation/NavigationRoot.tsx @@ -3,7 +3,6 @@ import {DefaultTheme, findFocusedRoute, NavigationContainer} from '@react-naviga import React, {useContext, useEffect, useMemo, useRef} from 'react'; import {NativeModules} from 'react-native'; import {useOnyx} from 'react-native-onyx'; -import HybridAppMiddleware from '@components/HybridAppMiddleware'; import {ScrollOffsetContext} from '@components/ScrollOffsetContextProvider'; import useActiveWorkspace from '@hooks/useActiveWorkspace'; import useCurrentReportID from '@hooks/useCurrentReportID'; @@ -186,10 +185,7 @@ function NavigationRoot({authenticated, lastVisitedPath, initialUrl, onReady, sh enabled: false, }} > - {/* HybridAppMiddleware needs to have access to navigation ref and SplashScreenHidden context */} - - - + ); } From 8f22bff9bad8cf6af159c44678a64f867cd62a9d Mon Sep 17 00:00:00 2001 From: Mykhailo Kravchenko Date: Thu, 3 Oct 2024 12:57:47 +0200 Subject: [PATCH 477/555] improve hasMissingInvoiceBankAccount --- src/libs/ReportUtils.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libs/ReportUtils.ts b/src/libs/ReportUtils.ts index 687ef177609e..c70e201b8dcc 100644 --- a/src/libs/ReportUtils.ts +++ b/src/libs/ReportUtils.ts @@ -8023,7 +8023,7 @@ function hasMissingInvoiceBankAccount(iouReportID: string): boolean { return false; } - return invoiceReport?.ownerAccountID === currentUserAccountID && isEmptyObject(getPolicy(invoiceReport?.policyID)?.invoice?.bankAccount ?? {}) && isSettled(iouReportID); + return invoiceReport?.ownerAccountID === currentUserAccountID && !getPolicy(invoiceReport?.policyID)?.invoice?.bankAccount?.transferBankAccountID && isSettled(iouReportID); } function isExpenseReportWithoutParentAccess(report: OnyxEntry) { From a848bc88773af6bf8088e401cbc454bbc8a529e4 Mon Sep 17 00:00:00 2001 From: Abdelrahman Khattab Date: Thu, 3 Oct 2024 13:17:47 +0200 Subject: [PATCH 478/555] Decrease gap to 8px in skeleton rows --- src/components/OptionsListSkeletonView.tsx | 2 +- src/components/Skeletons/SearchRowSkeleton.tsx | 2 +- src/components/Skeletons/TableRowSkeleton.tsx | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/components/OptionsListSkeletonView.tsx b/src/components/OptionsListSkeletonView.tsx index 6dede512f405..b6333c16e23c 100644 --- a/src/components/OptionsListSkeletonView.tsx +++ b/src/components/OptionsListSkeletonView.tsx @@ -28,7 +28,7 @@ function OptionsListSkeletonView({shouldAnimate = true, shouldStyleAsTable = fal return ( { const lineWidth = getLinedWidth(itemIndex); diff --git a/src/components/Skeletons/SearchRowSkeleton.tsx b/src/components/Skeletons/SearchRowSkeleton.tsx index afd18fe51871..3535ba329a90 100644 --- a/src/components/Skeletons/SearchRowSkeleton.tsx +++ b/src/components/Skeletons/SearchRowSkeleton.tsx @@ -126,7 +126,7 @@ function SearchRowSkeleton({shouldAnimate = true, fixedNumItems, gradientOpacity shouldAnimate={shouldAnimate} fixedNumItems={fixedNumItems} gradientOpacityEnabled={gradientOpacityEnabled} - itemViewStyle={[styles.highlightBG, styles.mb3, styles.br3, styles.mh5]} + itemViewStyle={[styles.highlightBG, styles.mb2, styles.br3, styles.mh5]} renderSkeletonItem={() => ( <> ( <> Date: Thu, 3 Oct 2024 16:02:22 +0200 Subject: [PATCH 479/555] changing workspace list gap to 8px --- src/pages/workspace/WorkspacesListPage.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pages/workspace/WorkspacesListPage.tsx b/src/pages/workspace/WorkspacesListPage.tsx index 5e887f904e5a..b444551dc455 100755 --- a/src/pages/workspace/WorkspacesListPage.tsx +++ b/src/pages/workspace/WorkspacesListPage.tsx @@ -191,7 +191,7 @@ function WorkspacesListPage() { errorRowStyles={styles.ph5} onClose={item.dismissError} errors={item.errors} - style={styles.mb3} + style={styles.mb2} > Date: Thu, 3 Oct 2024 16:06:37 +0200 Subject: [PATCH 480/555] minor fix --- src/pages/workspace/WorkspacesListPage.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pages/workspace/WorkspacesListPage.tsx b/src/pages/workspace/WorkspacesListPage.tsx index b444551dc455..ea17d945aed5 100755 --- a/src/pages/workspace/WorkspacesListPage.tsx +++ b/src/pages/workspace/WorkspacesListPage.tsx @@ -220,7 +220,7 @@ function WorkspacesListPage() { ); }, - [isLessThanMediumScreen, styles.mb3, styles.mh5, styles.ph5, styles.hoveredComponentBG, translate, styles.offlineFeedback.deleted, session?.accountID, session?.email], + [isLessThanMediumScreen, styles.mb2, styles.mh5, styles.ph5, styles.hoveredComponentBG, translate, styles.offlineFeedback.deleted, session?.accountID, session?.email], ); const listHeaderComponent = useCallback(() => { From ea856bd3fc8c087a82dc81657700c3786bf40f5d Mon Sep 17 00:00:00 2001 From: Jakub Szymczak Date: Thu, 3 Oct 2024 16:44:54 +0200 Subject: [PATCH 481/555] fix scroll indicator showing --- src/components/Search/SearchRouter/SearchRouterList.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/src/components/Search/SearchRouter/SearchRouterList.tsx b/src/components/Search/SearchRouter/SearchRouterList.tsx index 96c11b2fa353..7d86ce1150d5 100644 --- a/src/components/Search/SearchRouter/SearchRouterList.tsx +++ b/src/components/Search/SearchRouter/SearchRouterList.tsx @@ -175,6 +175,7 @@ function SearchRouterList( containerStyle={[styles.mh100]} sectionListStyle={[isSmallScreenWidth ? styles.ph5 : styles.ph2, styles.pb2]} ref={ref} + showScrollIndicator={!isSmallScreenWidth} /> ); } From f0c2b2accdec068a7d210d2b4501fb6b8215a246 Mon Sep 17 00:00:00 2001 From: Carlos Miceli Date: Thu, 3 Oct 2024 12:16:34 -0300 Subject: [PATCH 482/555] Update src/pages/OnboardingPurpose/BaseOnboardingPurpose.tsx Co-authored-by: Gandalf --- src/pages/OnboardingPurpose/BaseOnboardingPurpose.tsx | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/pages/OnboardingPurpose/BaseOnboardingPurpose.tsx b/src/pages/OnboardingPurpose/BaseOnboardingPurpose.tsx index 98b556c8d906..ca6b768136de 100644 --- a/src/pages/OnboardingPurpose/BaseOnboardingPurpose.tsx +++ b/src/pages/OnboardingPurpose/BaseOnboardingPurpose.tsx @@ -50,12 +50,6 @@ function BaseOnboardingPurpose({shouldUseNativeStyles, shouldEnableMaxHeight, ro const paddingHorizontal = onboardingIsMediumOrLargerScreenWidth ? styles.ph8 : styles.ph5; const [customChoices = []] = useOnyx(ONYXKEYS.ONBOARDING_CUSTOM_CHOICES); - const [onboardingValues] = useOnyx(ONYXKEYS.NVP_ONBOARDING); - const showBusinessModal = onboardingValues && 'signupQualifier' in onboardingValues && onboardingValues.signupQualifier === CONST.ONBOARDING_SIGNUP_QUALIFIERS.VSB; - - if (showBusinessModal) { - Navigation.navigate(ROUTES.ONBOARDING_WORK.getRoute(route.params?.backTo)); - } const onboardingChoices = customChoices.length > 0 ? Object.values(CONST.SELECTABLE_ONBOARDING_CHOICES).filter((choice) => customChoices.includes(choice)) : Object.values(CONST.SELECTABLE_ONBOARDING_CHOICES); From f7fbf25dc2867e37a1000c5a0043bf0a163ed334 Mon Sep 17 00:00:00 2001 From: maddylewis <38016013+maddylewis@users.noreply.github.com> Date: Thu, 3 Oct 2024 11:19:09 -0400 Subject: [PATCH 483/555] Update redirects.csv https://github.com/Expensify/Expensify/issues/428150 --- docs/redirects.csv | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/docs/redirects.csv b/docs/redirects.csv index 0a5007b4fa61..1bd677148a30 100644 --- a/docs/redirects.csv +++ b/docs/redirects.csv @@ -412,7 +412,7 @@ https://community.expensify.com/discussion/5732/deep-dive-all-about-policy-categ https://community.expensify.com/discussion/5469/deep-dive-auto-categorize-card-expenses-with-default-categories,https://help.expensify.com/articles/expensify-classic/workspaces/Set-up-category-automation https://community.expensify.com/discussion/4708/how-to-set-up-and-add-single-tags,https://help.expensify.com/articles/expensify-classic/workspaces/Create-tags https://community.expensify.com/discussion/5756/how-to-set-up-and-manage-multi-level-tagging/,https://help.expensify.com/articles/expensify-classic/workspaces/Create-tags#multi-level-tags -https://community.expensify.com/discussion/5044/how-to-set-up-multiple-taxes-on-indirect-connections,https://help.expensify.com/articles/expensify-classic/workspaces/Tax-Tracking +https://community.expensify.com/discussion/5044/how-to-set-up-multiple-taxes-on-indirect-connections,https://help.expensify.com/articles/expensify-classic/connections/Indirect-Accounting-Integrations https://community.expensify.com/discussion/4643/how-to-invite-people-to-your-policy-using-a-join-link/,https://help.expensify.com/articles/expensify-classic/workspaces/Invite-members-and-assign-roles#invite-with-a-link https://community.expensify.com/discussion/5700/deep-dive-approval-workflow-overview,https://help.expensify.com/articles/expensify-classic/reports/Create-a-report-approval-workflow https://community.expensify.com/discussion/4804/how-to-set-up-concierge-report-approval,https://help.expensify.com/articles/expensify-classic/reports/Require-review-for-over-limit-expenses @@ -498,7 +498,7 @@ https://community.expensify.com/discussion/6827/what-s-happening-to-my-expensify https://community.expensify.com/discussion/6898/deep-dive-guide-to-billing,https://help.expensify.com/articles/expensify-classic/expensify-billing/Billing-Overview https://community.expensify.com/discussion/7231/how-to-export-invoices-to-netsuite,https://help.expensify.com/articles/new-expensify/connections/netsuite/Connect-to-NetSuite#export-invoices-to https://community.expensify.com/discussion/7335/faq-what-is-the-expensify-card-auto-reconciliation-process,https://help.expensify.com/articles/new-expensify/expenses-&-payments/Send-an-invoice -https://community.expensify.com/discussion/7524/how-to-set-up-disable-2fa-for-your-domain,https://help.expensify.com/articles/expensify-classic/domains/Add-Domain-Members-and-Admins +https://community.expensify.com/discussion/7524/how-to-set-up-disable-2fa-for-your-domain,https://help.expensify.com/articles/expensify-classic/settings/Enable-two-factor-authentication https://community.expensify.com/discussion/7736/faq-troubleshooting-two-factor-authentication-issues,https://help.expensify.com/articles/expensify-classic/settings/Enable-two-factor-authentication https://community.expensify.com/discussion/7862/introducing-expensify-cash-open-source-financial-group-chat-built-with-react-native,https://help.expensify.com/articles/expensify-classic/bank-accounts-and-payments/payments/Reimburse-Reports-Invoices-and-Bills https://community.expensify.com/discussion/7931/how-to-become-an-expensify-org-donor,https://www.expensify.org/donate @@ -579,3 +579,8 @@ https://community.expensify.com//discussion/6927/deep-dive-how-can-i-estimate-th https://community.expensify.com/discussion/5179/faq-what-does-a-policy-for-which-you-are-an-admin-has-out-of-date-billing-information-mean,https://help.expensify.com/articles/expensify-classic/expensify-billing/Out-of-date-Billing https://community.expensify.com/discussion/6179/setting-up-a-receipt-or-travel-integration-with-expensify,https://help.expensify.com/articles/expensify-classic/connections/Additional-Travel-Integrations https://help.expensify.com/articles/expensify-classic/bank-accounts-and-payments/bank-accounts/Connect-Personal-US-Bank-Account,https://help.expensify.com/articles/expensify-classic/bank-accounts-and-payments/bank-accounts/Connect-Personal-Bank-Account +https://community.expensify.com//discussion/6927/deep-dive-how-can-i-estimate-the-savings-applied-to-my-bill,https://help.expensify.com/articles/expensify-classic/expensify-billing/Billing-Overview#savings-calculator +https://community.expensify.com/discussion/47/auto-sync-best-practices,https://help.expensify.com/expensify-classic/hubs/connections +https://community.expensify.com/discussion/6699/faq-troubleshooting-known-bank-specific-issues,https://help.expensify.com/expensify-classic/hubs/bank-accounts-and-payments/bank-accounts +https://community.expensify.com/discussion/4730/faq-expenses-are-exporting-to-the-wrong-accounts-whys-that,https://help.expensify.com/articles/expensify-classic/connect-credit-cards/company-cards/Company-Card-Settings +https://community.expensify.com/discussion/9000/how-to-integrate-with-deel,https://help.expensify.com/articles/expensify-classic/connections/Deel From 941aac69ec6b04ee7fc13b37508d68b512442dc2 Mon Sep 17 00:00:00 2001 From: maddylewis <38016013+maddylewis@users.noreply.github.com> Date: Thu, 3 Oct 2024 11:27:31 -0400 Subject: [PATCH 484/555] Update redirects.csv removed duplicate --- docs/redirects.csv | 1 - 1 file changed, 1 deletion(-) diff --git a/docs/redirects.csv b/docs/redirects.csv index 1bd677148a30..783e13f8de07 100644 --- a/docs/redirects.csv +++ b/docs/redirects.csv @@ -575,7 +575,6 @@ https://help.expensify.com/articles/new-expensify/getting-started/Upgrade-to-a-C https://help.expensify.com/articles/expensify-classic/bank-accounts-and-payments/payments/Reimburse-Reports-Invoices-and-Bills,https://help.expensify.com/articles/expensify-classic/bank-accounts-and-payments/payments/Reimburse-Reports https://help.expensify.com/articles/new-expensify/expenses-&-payments/pay-an-invoice.html,https://help.expensify.com/articles/new-expensify/expenses-&-payments/Pay-an-invoice https://community.expensify.com/discussion/4707/how-to-set-up-your-mobile-app,https://help.expensify.com/articles/expensify-classic/getting-started/Join-your-company's-workspace#download-the-mobile-app -https://community.expensify.com//discussion/6927/deep-dive-how-can-i-estimate-the-savings-applied-to-my-bill,https://help.expensify.com/articles/expensify-classic/expensify-billing/Billing-Overview#savings-calculator https://community.expensify.com/discussion/5179/faq-what-does-a-policy-for-which-you-are-an-admin-has-out-of-date-billing-information-mean,https://help.expensify.com/articles/expensify-classic/expensify-billing/Out-of-date-Billing https://community.expensify.com/discussion/6179/setting-up-a-receipt-or-travel-integration-with-expensify,https://help.expensify.com/articles/expensify-classic/connections/Additional-Travel-Integrations https://help.expensify.com/articles/expensify-classic/bank-accounts-and-payments/bank-accounts/Connect-Personal-US-Bank-Account,https://help.expensify.com/articles/expensify-classic/bank-accounts-and-payments/bank-accounts/Connect-Personal-Bank-Account From 85e35b58e8cb8abc7f0d49de15a7ee584abf9959 Mon Sep 17 00:00:00 2001 From: Bernhard Owen Josephus Date: Thu, 3 Oct 2024 23:40:53 +0800 Subject: [PATCH 485/555] fix green dot is not aligned with the arrow --- src/components/ReportActionItem/TaskPreview.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/ReportActionItem/TaskPreview.tsx b/src/components/ReportActionItem/TaskPreview.tsx index 95528286d1e1..8d036fc6167b 100644 --- a/src/components/ReportActionItem/TaskPreview.tsx +++ b/src/components/ReportActionItem/TaskPreview.tsx @@ -128,7 +128,7 @@ function TaskPreview({taskReportID, action, contextMenuAnchor, chatReportID, che {taskTitle} {shouldShowGreenDotIndicator && ( - + Date: Thu, 3 Oct 2024 15:45:36 +0000 Subject: [PATCH 486/555] Update version to 9.0.44-1 --- android/app/build.gradle | 4 ++-- ios/NewExpensify/Info.plist | 2 +- ios/NewExpensifyTests/Info.plist | 2 +- ios/NotificationServiceExtension/Info.plist | 2 +- package-lock.json | 4 ++-- package.json | 2 +- 6 files changed, 8 insertions(+), 8 deletions(-) diff --git a/android/app/build.gradle b/android/app/build.gradle index ae7625810a14..df35af765f3e 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -110,8 +110,8 @@ android { minSdkVersion rootProject.ext.minSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion multiDexEnabled rootProject.ext.multiDexEnabled - versionCode 1009004400 - versionName "9.0.44-0" + versionCode 1009004401 + versionName "9.0.44-1" // Supported language variants must be declared here to avoid from being removed during the compilation. // This also helps us to not include unnecessary language variants in the APK. resConfigs "en", "es" diff --git a/ios/NewExpensify/Info.plist b/ios/NewExpensify/Info.plist index 43cae757b784..9c159126e69a 100644 --- a/ios/NewExpensify/Info.plist +++ b/ios/NewExpensify/Info.plist @@ -40,7 +40,7 @@ CFBundleVersion - 9.0.44.0 + 9.0.44.1 FullStory OrgId diff --git a/ios/NewExpensifyTests/Info.plist b/ios/NewExpensifyTests/Info.plist index b1715a829e2a..f23f83fa5970 100644 --- a/ios/NewExpensifyTests/Info.plist +++ b/ios/NewExpensifyTests/Info.plist @@ -19,6 +19,6 @@ CFBundleSignature ???? CFBundleVersion - 9.0.44.0 + 9.0.44.1 diff --git a/ios/NotificationServiceExtension/Info.plist b/ios/NotificationServiceExtension/Info.plist index 7b8d7e40f1f6..f51f4f7b1c85 100644 --- a/ios/NotificationServiceExtension/Info.plist +++ b/ios/NotificationServiceExtension/Info.plist @@ -13,7 +13,7 @@ CFBundleShortVersionString 9.0.44 CFBundleVersion - 9.0.44.0 + 9.0.44.1 NSExtension NSExtensionPointIdentifier diff --git a/package-lock.json b/package-lock.json index 33baf6a35084..cf161ddfb4b4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "new.expensify", - "version": "9.0.44-0", + "version": "9.0.44-1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "new.expensify", - "version": "9.0.44-0", + "version": "9.0.44-1", "hasInstallScript": true, "license": "MIT", "dependencies": { diff --git a/package.json b/package.json index 527a293a6a9e..5555965e67db 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "new.expensify", - "version": "9.0.44-0", + "version": "9.0.44-1", "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.", From 72750b612f55f6d62587974a573df774e095eed7 Mon Sep 17 00:00:00 2001 From: krishna2323 Date: Thu, 3 Oct 2024 21:33:54 +0530 Subject: [PATCH 487/555] minor fix. Signed-off-by: krishna2323 --- .../workspace/categories/WorkspaceCategoriesSettingsPage.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/src/pages/workspace/categories/WorkspaceCategoriesSettingsPage.tsx b/src/pages/workspace/categories/WorkspaceCategoriesSettingsPage.tsx index f33bcbf56657..0a492252f9d4 100644 --- a/src/pages/workspace/categories/WorkspaceCategoriesSettingsPage.tsx +++ b/src/pages/workspace/categories/WorkspaceCategoriesSettingsPage.tsx @@ -74,7 +74,6 @@ function WorkspaceCategoriesSettingsPage({policy, route}: WorkspaceCategoriesSet } if (categoryID !== selectedCategory.keyForList) { Policy.setWorkspaceDefaultSpendCategory(policyID, groupID, selectedCategory.keyForList); - return; } setIsSelectorModalVisible(false); }; From 420e780c359d861f7a43fda3441104c42ac39225 Mon Sep 17 00:00:00 2001 From: cretadn22 Date: Thu, 3 Oct 2024 23:23:22 +0700 Subject: [PATCH 488/555] require-verify-when-paying-dollar-via-expensify --- src/components/SettlementButton/index.tsx | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/components/SettlementButton/index.tsx b/src/components/SettlementButton/index.tsx index 8d3add9b6fd0..f371545ab7b0 100644 --- a/src/components/SettlementButton/index.tsx +++ b/src/components/SettlementButton/index.tsx @@ -64,6 +64,7 @@ function SettlementButton({ const {isOffline} = useNetwork(); // The app would crash due to subscribing to the entire report collection if chatReportID is an empty string. So we should have a fallback ID here. const [chatReport] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT}${chatReportID || -1}`); + const [isUserValidated] = useOnyx(ONYXKEYS.USER, {selector: (user) => !!user?.validated}); const [lastPaymentMethod = '-1', lastPaymentMethodResult] = useOnyx(ONYXKEYS.NVP_LAST_PAYMENT_METHOD, {selector: (paymentMethod) => paymentMethod?.[policyID]}); const isLoadingLastPaymentMethod = isLoadingOnyxValue(lastPaymentMethodResult); const [policy] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY}${policyID}`); @@ -188,6 +189,10 @@ function SettlementButton({ } if (iouPaymentType === CONST.IOU.PAYMENT_TYPE.EXPENSIFY || iouPaymentType === CONST.IOU.PAYMENT_TYPE.VBBA) { + if (!isUserValidated) { + Navigation.navigate(ROUTES.SETTINGS_WALLET_VERIFY_ACCOUNT.getRoute()); + return; + } triggerKYCFlow(event, iouPaymentType); BankAccounts.setPersonalBankAccountContinueKYCOnSuccess(ROUTES.ENABLE_PAYMENTS); return; From dcfcb08143ce49e092d027d297b70be852a9f039 Mon Sep 17 00:00:00 2001 From: OSBotify Date: Thu, 3 Oct 2024 16:25:29 +0000 Subject: [PATCH 489/555] Update version to 9.0.44-2 --- android/app/build.gradle | 4 ++-- ios/NewExpensify/Info.plist | 2 +- ios/NewExpensifyTests/Info.plist | 2 +- ios/NotificationServiceExtension/Info.plist | 2 +- package-lock.json | 4 ++-- package.json | 2 +- 6 files changed, 8 insertions(+), 8 deletions(-) diff --git a/android/app/build.gradle b/android/app/build.gradle index df35af765f3e..cb1dbcccd4b4 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -110,8 +110,8 @@ android { minSdkVersion rootProject.ext.minSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion multiDexEnabled rootProject.ext.multiDexEnabled - versionCode 1009004401 - versionName "9.0.44-1" + versionCode 1009004402 + versionName "9.0.44-2" // Supported language variants must be declared here to avoid from being removed during the compilation. // This also helps us to not include unnecessary language variants in the APK. resConfigs "en", "es" diff --git a/ios/NewExpensify/Info.plist b/ios/NewExpensify/Info.plist index 9c159126e69a..4ed65e0e1b1e 100644 --- a/ios/NewExpensify/Info.plist +++ b/ios/NewExpensify/Info.plist @@ -40,7 +40,7 @@ CFBundleVersion - 9.0.44.1 + 9.0.44.2 FullStory OrgId diff --git a/ios/NewExpensifyTests/Info.plist b/ios/NewExpensifyTests/Info.plist index f23f83fa5970..0d1836b1a322 100644 --- a/ios/NewExpensifyTests/Info.plist +++ b/ios/NewExpensifyTests/Info.plist @@ -19,6 +19,6 @@ CFBundleSignature ???? CFBundleVersion - 9.0.44.1 + 9.0.44.2 diff --git a/ios/NotificationServiceExtension/Info.plist b/ios/NotificationServiceExtension/Info.plist index f51f4f7b1c85..ba2173c99c10 100644 --- a/ios/NotificationServiceExtension/Info.plist +++ b/ios/NotificationServiceExtension/Info.plist @@ -13,7 +13,7 @@ CFBundleShortVersionString 9.0.44 CFBundleVersion - 9.0.44.1 + 9.0.44.2 NSExtension NSExtensionPointIdentifier diff --git a/package-lock.json b/package-lock.json index cf161ddfb4b4..67b7c0aa3fa4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "new.expensify", - "version": "9.0.44-1", + "version": "9.0.44-2", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "new.expensify", - "version": "9.0.44-1", + "version": "9.0.44-2", "hasInstallScript": true, "license": "MIT", "dependencies": { diff --git a/package.json b/package.json index 5555965e67db..70451ec15420 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "new.expensify", - "version": "9.0.44-1", + "version": "9.0.44-2", "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.", From 7268bdd531c373c5872d66c533c2e2f76929f0e9 Mon Sep 17 00:00:00 2001 From: HezekielT Date: Thu, 3 Oct 2024 19:25:38 +0300 Subject: [PATCH 490/555] fix ts errors --- src/components/Form/FormWrapper.tsx | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/components/Form/FormWrapper.tsx b/src/components/Form/FormWrapper.tsx index c4ed8ac8a185..41e451da354e 100644 --- a/src/components/Form/FormWrapper.tsx +++ b/src/components/Form/FormWrapper.tsx @@ -12,6 +12,8 @@ import ScrollView from '@components/ScrollView'; import ScrollViewWithContext from '@components/ScrollViewWithContext'; import useThemeStyles from '@hooks/useThemeStyles'; import * as ErrorUtils from '@libs/ErrorUtils'; +import {OnyxFormKey} from '@src/ONYXKEYS'; +import {Form} from '@src/types/form'; import type ChildrenProps from '@src/types/utils/ChildrenProps'; import {isEmptyObject} from '@src/types/utils/EmptyObject'; import type {FormInputErrors, FormProps, InputRefs} from './types'; @@ -61,7 +63,7 @@ function FormWrapper({ const formRef = useRef(null); const formContentRef = useRef(null); - const [formState] = useOnyx(`${formID}`); + const [formState] = useOnyx(`${formID}`); const errorMessage = useMemo(() => (formState ? ErrorUtils.getLatestErrorMessage(formState) : undefined), [formState]); From 7622e111a0ffe20029d7d5040ece29d206d545e8 Mon Sep 17 00:00:00 2001 From: Carlos Miceli Date: Thu, 3 Oct 2024 13:28:18 -0300 Subject: [PATCH 491/555] minor refactoring per suggestions --- src/CONST.ts | 3 ++- src/libs/Navigation/AppNavigator/AuthScreens.tsx | 7 +++---- src/libs/actions/Welcome/OnboardingFlow.ts | 2 +- src/pages/OnboardingWork/BaseOnboardingWork.tsx | 4 ++-- src/types/onyx/Onboarding.ts | 5 ++++- 5 files changed, 12 insertions(+), 9 deletions(-) diff --git a/src/CONST.ts b/src/CONST.ts index 4a735e934ee9..e6539b72d5a1 100755 --- a/src/CONST.ts +++ b/src/CONST.ts @@ -88,7 +88,7 @@ const signupQualifiers = { INDIVIDUAL: 'individual', VSB: 'vsb', SMB: 'smb', -}; +} as const; const onboardingEmployerOrSubmitMessage: OnboardingMessageType = { message: 'Getting paid back is as easy as sending a message. Let’s go over the basics.', @@ -4469,6 +4469,7 @@ const CONST = { WELCOME_VIDEO_URL: `${CLOUDFRONT_URL}/videos/intro-1280.mp4`, + QUALIFIER_PARAM: 'signupQualifier', ONBOARDING_INTRODUCTION: 'Let’s get you set up 🔧', ONBOARDING_CHOICES: {...onboardingChoices}, SELECTABLE_ONBOARDING_CHOICES: {...selectableOnboardingChoices}, diff --git a/src/libs/Navigation/AppNavigator/AuthScreens.tsx b/src/libs/Navigation/AppNavigator/AuthScreens.tsx index ddbb11759eb0..f2f82176a54c 100644 --- a/src/libs/Navigation/AppNavigator/AuthScreens.tsx +++ b/src/libs/Navigation/AppNavigator/AuthScreens.tsx @@ -275,10 +275,9 @@ function AuthScreens({session, lastOpenedPublicRoomID, initialLastUpdateIDApplie } let signupQualifier; - if (currentUrl.includes('signupQualifier')) { - signupQualifier = new URL(currentUrl).searchParams.get('signupQualifier'); - } - if (signupQualifier) { + if (currentUrl.includes(CONST.QUALIFIER_PARAM)) { + signupQualifier = new URL(currentUrl).searchParams.get(CONST.QUALIFIER_PARAM); + if (signupQualifier === CONST.ONBOARDING_SIGNUP_QUALIFIERS.INDIVIDUAL) { Welcome.setOnboardingCustomChoices([CONST.ONBOARDING_CHOICES.PERSONAL_SPEND, CONST.ONBOARDING_CHOICES.EMPLOYER, CONST.ONBOARDING_CHOICES.CHAT_SPLIT]); } diff --git a/src/libs/actions/Welcome/OnboardingFlow.ts b/src/libs/actions/Welcome/OnboardingFlow.ts index a96688d8c3ad..4ab3cda27c64 100644 --- a/src/libs/actions/Welcome/OnboardingFlow.ts +++ b/src/libs/actions/Welcome/OnboardingFlow.ts @@ -115,7 +115,7 @@ function startOnboardingFlow() { function getOnboardingInitialPath(): string { const state = getStateFromPath(onboardingInitialPath, linkingConfig.config); - const showBusinessModal = onboardingValues && 'signupQualifier' in onboardingValues && onboardingValues.signupQualifier === CONST.ONBOARDING_SIGNUP_QUALIFIERS.VSB; + const showBusinessModal = onboardingValues && CONST.QUALIFIER_PARAM in onboardingValues && onboardingValues.signupQualifier === CONST.ONBOARDING_SIGNUP_QUALIFIERS.VSB; if (showBusinessModal) { return `/${ROUTES.ONBOARDING_WORK.route}`; diff --git a/src/pages/OnboardingWork/BaseOnboardingWork.tsx b/src/pages/OnboardingWork/BaseOnboardingWork.tsx index 03dbada60f9c..9e8e2e3bbfa8 100644 --- a/src/pages/OnboardingWork/BaseOnboardingWork.tsx +++ b/src/pages/OnboardingWork/BaseOnboardingWork.tsx @@ -36,7 +36,7 @@ function BaseOnboardingWork({shouldUseNativeStyles, route}: BaseOnboardingWorkPr const {inputCallbackRef} = useAutoFocusInput(); const {isOffline} = useNetwork(); - const vsbOnboarding = onboardingValues && 'signupQualifier' in onboardingValues && onboardingValues.signupQualifier === CONST.ONBOARDING_SIGNUP_QUALIFIERS.VSB; + const isVsbOnboarding = onboardingValues && CONST.QUALIFIER_PARAM in onboardingValues && onboardingValues.signupQualifier === CONST.ONBOARDING_SIGNUP_QUALIFIERS.VSB; const completeEngagement = useCallback( (values: FormOnyxValues<'onboardingWorkForm'>) => { @@ -82,7 +82,7 @@ function BaseOnboardingWork({shouldUseNativeStyles, route}: BaseOnboardingWorkPr style={[styles.defaultModalContainer, shouldUseNativeStyles && styles.pt8]} > diff --git a/src/types/onyx/Onboarding.ts b/src/types/onyx/Onboarding.ts index 5bb022b6fd17..4b6a52f25cb4 100644 --- a/src/types/onyx/Onboarding.ts +++ b/src/types/onyx/Onboarding.ts @@ -1,3 +1,6 @@ +import type {ValueOf} from 'type-fest'; +import type CONST from '@src/CONST'; + /** Model of onboarding */ type Onboarding = { /** ID of the report used to display the onboarding checklist message */ @@ -7,7 +10,7 @@ type Onboarding = { hasCompletedGuidedSetupFlow: boolean; /** A string that informs which qualifier the user selected during sign up */ - signupQualifier: string; + signupQualifier: ValueOf; }; export default Onboarding; From 5fa13d59b69fc0398fb1931896ce414edde21923 Mon Sep 17 00:00:00 2001 From: HezekielT Date: Thu, 3 Oct 2024 19:29:50 +0300 Subject: [PATCH 492/555] include type in import --- src/components/Form/FormWrapper.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/Form/FormWrapper.tsx b/src/components/Form/FormWrapper.tsx index 41e451da354e..d26276d0418b 100644 --- a/src/components/Form/FormWrapper.tsx +++ b/src/components/Form/FormWrapper.tsx @@ -12,8 +12,8 @@ import ScrollView from '@components/ScrollView'; import ScrollViewWithContext from '@components/ScrollViewWithContext'; import useThemeStyles from '@hooks/useThemeStyles'; import * as ErrorUtils from '@libs/ErrorUtils'; -import {OnyxFormKey} from '@src/ONYXKEYS'; -import {Form} from '@src/types/form'; +import type {OnyxFormKey} from '@src/ONYXKEYS'; +import type {Form} from '@src/types/form'; import type ChildrenProps from '@src/types/utils/ChildrenProps'; import {isEmptyObject} from '@src/types/utils/EmptyObject'; import type {FormInputErrors, FormProps, InputRefs} from './types'; From 4d02e0b3804e8f50d46e299d5b7c12851a491a12 Mon Sep 17 00:00:00 2001 From: daledah Date: Thu, 3 Oct 2024 23:49:53 +0700 Subject: [PATCH 493/555] fix: error not shown, redirect incorrectly on add bank account --- .../ValidateCodeForm/BaseValidateCodeForm.tsx | 5 +---- src/pages/AddPersonalBankAccountPage.tsx | 2 +- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/src/components/ValidateCodeActionModal/ValidateCodeForm/BaseValidateCodeForm.tsx b/src/components/ValidateCodeActionModal/ValidateCodeForm/BaseValidateCodeForm.tsx index 1716249c597d..104b865bac4b 100644 --- a/src/components/ValidateCodeActionModal/ValidateCodeForm/BaseValidateCodeForm.tsx +++ b/src/components/ValidateCodeActionModal/ValidateCodeForm/BaseValidateCodeForm.tsx @@ -126,12 +126,9 @@ function BaseValidateCodeForm({ ); useEffect(() => { - if (!validateError) { - return; - } clearError(); // eslint-disable-next-line react-compiler/react-compiler, react-hooks/exhaustive-deps - }, [clearError, validateError]); + }, []); useEffect(() => { if (!hasMagicCodeBeenSent) { diff --git a/src/pages/AddPersonalBankAccountPage.tsx b/src/pages/AddPersonalBankAccountPage.tsx index 24faf40b63fd..fdc200f45ad9 100644 --- a/src/pages/AddPersonalBankAccountPage.tsx +++ b/src/pages/AddPersonalBankAccountPage.tsx @@ -45,7 +45,7 @@ function AddPersonalBankAccountPage() { } else if (shouldContinue && onSuccessFallbackRoute) { PaymentMethods.continueSetup(onSuccessFallbackRoute); } else { - Navigation.goBack(); + Navigation.navigate(ROUTES.SETTINGS_WALLET); } }, [personalBankAccount], From ba9af8f082e76fc7da666e7f128574761fa97012 Mon Sep 17 00:00:00 2001 From: OSBotify Date: Thu, 3 Oct 2024 17:08:51 +0000 Subject: [PATCH 494/555] Update version to 9.0.44-3 --- android/app/build.gradle | 4 ++-- ios/NewExpensify/Info.plist | 2 +- ios/NewExpensifyTests/Info.plist | 2 +- ios/NotificationServiceExtension/Info.plist | 2 +- package-lock.json | 4 ++-- package.json | 2 +- 6 files changed, 8 insertions(+), 8 deletions(-) diff --git a/android/app/build.gradle b/android/app/build.gradle index cb1dbcccd4b4..a5554e797f74 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -110,8 +110,8 @@ android { minSdkVersion rootProject.ext.minSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion multiDexEnabled rootProject.ext.multiDexEnabled - versionCode 1009004402 - versionName "9.0.44-2" + versionCode 1009004403 + versionName "9.0.44-3" // Supported language variants must be declared here to avoid from being removed during the compilation. // This also helps us to not include unnecessary language variants in the APK. resConfigs "en", "es" diff --git a/ios/NewExpensify/Info.plist b/ios/NewExpensify/Info.plist index 4ed65e0e1b1e..77bcaa4018dc 100644 --- a/ios/NewExpensify/Info.plist +++ b/ios/NewExpensify/Info.plist @@ -40,7 +40,7 @@ CFBundleVersion - 9.0.44.2 + 9.0.44.3 FullStory OrgId diff --git a/ios/NewExpensifyTests/Info.plist b/ios/NewExpensifyTests/Info.plist index 0d1836b1a322..7429cd7be53c 100644 --- a/ios/NewExpensifyTests/Info.plist +++ b/ios/NewExpensifyTests/Info.plist @@ -19,6 +19,6 @@ CFBundleSignature ???? CFBundleVersion - 9.0.44.2 + 9.0.44.3 diff --git a/ios/NotificationServiceExtension/Info.plist b/ios/NotificationServiceExtension/Info.plist index ba2173c99c10..9d2276c949c5 100644 --- a/ios/NotificationServiceExtension/Info.plist +++ b/ios/NotificationServiceExtension/Info.plist @@ -13,7 +13,7 @@ CFBundleShortVersionString 9.0.44 CFBundleVersion - 9.0.44.2 + 9.0.44.3 NSExtension NSExtensionPointIdentifier diff --git a/package-lock.json b/package-lock.json index 67b7c0aa3fa4..13d176d9db09 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "new.expensify", - "version": "9.0.44-2", + "version": "9.0.44-3", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "new.expensify", - "version": "9.0.44-2", + "version": "9.0.44-3", "hasInstallScript": true, "license": "MIT", "dependencies": { diff --git a/package.json b/package.json index 70451ec15420..a5a0ae7c7cb1 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "new.expensify", - "version": "9.0.44-2", + "version": "9.0.44-3", "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.", From 392d5d7da1efe4568c345f7d7feed83e0e7efdd9 Mon Sep 17 00:00:00 2001 From: daledah Date: Fri, 4 Oct 2024 00:41:48 +0700 Subject: [PATCH 495/555] fix: remove eslint disable line --- .../ValidateCodeForm/BaseValidateCodeForm.tsx | 3 +-- src/pages/settings/Wallet/VerifyAccountPage.tsx | 6 +++++- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/components/ValidateCodeActionModal/ValidateCodeForm/BaseValidateCodeForm.tsx b/src/components/ValidateCodeActionModal/ValidateCodeForm/BaseValidateCodeForm.tsx index 104b865bac4b..f71b957387a8 100644 --- a/src/components/ValidateCodeActionModal/ValidateCodeForm/BaseValidateCodeForm.tsx +++ b/src/components/ValidateCodeActionModal/ValidateCodeForm/BaseValidateCodeForm.tsx @@ -127,8 +127,7 @@ function BaseValidateCodeForm({ useEffect(() => { clearError(); - // eslint-disable-next-line react-compiler/react-compiler, react-hooks/exhaustive-deps - }, []); + }, [clearError]); useEffect(() => { if (!hasMagicCodeBeenSent) { diff --git a/src/pages/settings/Wallet/VerifyAccountPage.tsx b/src/pages/settings/Wallet/VerifyAccountPage.tsx index 1fb39304ec41..e375f03ba58c 100644 --- a/src/pages/settings/Wallet/VerifyAccountPage.tsx +++ b/src/pages/settings/Wallet/VerifyAccountPage.tsx @@ -49,6 +49,10 @@ function VerifyAccountPage({route}: VerifyAccountPageProps) { [loginList, contactMethod], ); + const clearError = useCallback(() => { + User.clearContactMethodErrors(contactMethod, 'validateLogin'); + }, [contactMethod]); + useEffect(() => { if (!isUserValidated) { return; @@ -73,7 +77,7 @@ function VerifyAccountPage({route}: VerifyAccountPageProps) { validateCodeAction={validateCodeAction} validateError={validateLoginError} handleSubmitForm={handleSubmitForm} - clearError={() => User.clearContactMethodErrors(contactMethod, 'validateLogin')} + clearError={clearError} buttonStyles={[styles.justifyContentEnd, styles.flex1, safePaddingBottomStyle]} /> From 4e452c82bc870b70c1305507c810b856a457f807 Mon Sep 17 00:00:00 2001 From: rory Date: Thu, 3 Oct 2024 12:02:16 -0700 Subject: [PATCH 496/555] Improve comment --- .github/workflows/buildAndroid.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/buildAndroid.yml b/.github/workflows/buildAndroid.yml index 114c42d407e2..a8023aebd359 100644 --- a/.github/workflows/buildAndroid.yml +++ b/.github/workflows/buildAndroid.yml @@ -136,7 +136,7 @@ jobs: esac bundle exec fastlane android "$lane" - # Reload environment variables from GITHUB_ENV + # Refresh environment variables from GITHUB_ENV that are updated when running fastlane # shellcheck disable=SC1090 source "$GITHUB_ENV" From 61d917200db2c91e9f35128973f1494623e6f248 Mon Sep 17 00:00:00 2001 From: OSBotify Date: Thu, 3 Oct 2024 20:09:26 +0000 Subject: [PATCH 497/555] Update version to 9.0.44-4 --- android/app/build.gradle | 4 ++-- ios/NewExpensify/Info.plist | 2 +- ios/NewExpensifyTests/Info.plist | 2 +- ios/NotificationServiceExtension/Info.plist | 2 +- package-lock.json | 4 ++-- package.json | 2 +- 6 files changed, 8 insertions(+), 8 deletions(-) diff --git a/android/app/build.gradle b/android/app/build.gradle index a5554e797f74..69851ec13ab1 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -110,8 +110,8 @@ android { minSdkVersion rootProject.ext.minSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion multiDexEnabled rootProject.ext.multiDexEnabled - versionCode 1009004403 - versionName "9.0.44-3" + versionCode 1009004404 + versionName "9.0.44-4" // Supported language variants must be declared here to avoid from being removed during the compilation. // This also helps us to not include unnecessary language variants in the APK. resConfigs "en", "es" diff --git a/ios/NewExpensify/Info.plist b/ios/NewExpensify/Info.plist index 77bcaa4018dc..e302120978d0 100644 --- a/ios/NewExpensify/Info.plist +++ b/ios/NewExpensify/Info.plist @@ -40,7 +40,7 @@ CFBundleVersion - 9.0.44.3 + 9.0.44.4 FullStory OrgId diff --git a/ios/NewExpensifyTests/Info.plist b/ios/NewExpensifyTests/Info.plist index 7429cd7be53c..b6ac34731514 100644 --- a/ios/NewExpensifyTests/Info.plist +++ b/ios/NewExpensifyTests/Info.plist @@ -19,6 +19,6 @@ CFBundleSignature ???? CFBundleVersion - 9.0.44.3 + 9.0.44.4 diff --git a/ios/NotificationServiceExtension/Info.plist b/ios/NotificationServiceExtension/Info.plist index 9d2276c949c5..36c32f81ad83 100644 --- a/ios/NotificationServiceExtension/Info.plist +++ b/ios/NotificationServiceExtension/Info.plist @@ -13,7 +13,7 @@ CFBundleShortVersionString 9.0.44 CFBundleVersion - 9.0.44.3 + 9.0.44.4 NSExtension NSExtensionPointIdentifier diff --git a/package-lock.json b/package-lock.json index 13d176d9db09..4fed0c0e8d09 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "new.expensify", - "version": "9.0.44-3", + "version": "9.0.44-4", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "new.expensify", - "version": "9.0.44-3", + "version": "9.0.44-4", "hasInstallScript": true, "license": "MIT", "dependencies": { diff --git a/package.json b/package.json index 647271ad1424..66e869417068 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "new.expensify", - "version": "9.0.44-3", + "version": "9.0.44-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.", From 9dd522b7cddf8bf2582e1e280c9b95205e278557 Mon Sep 17 00:00:00 2001 From: nkdengineer Date: Fri, 4 Oct 2024 03:09:46 +0700 Subject: [PATCH 498/555] prevent removing waypoint if it is unnecessary --- src/libs/actions/Transaction.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/libs/actions/Transaction.ts b/src/libs/actions/Transaction.ts index 3c1e02751727..19692af41f72 100644 --- a/src/libs/actions/Transaction.ts +++ b/src/libs/actions/Transaction.ts @@ -134,6 +134,9 @@ function saveWaypoint(transactionID: string, index: string, waypoint: RecentWayp function removeWaypoint(transaction: OnyxEntry, currentIndex: string, isDraft?: boolean): Promise { // Index comes from the route params and is a string const index = Number(currentIndex); + if (index === -1) { + return Promise.resolve(); + } const existingWaypoints = transaction?.comment?.waypoints ?? {}; const totalWaypoints = Object.keys(existingWaypoints).length; @@ -143,7 +146,7 @@ function removeWaypoint(transaction: OnyxEntry, currentIndex: strin return Promise.resolve(); } - const isRemovedWaypointEmpty = removed.length > 0 && !TransactionUtils.waypointHasValidAddress(removed.at(0) ?? {}); + const isRemovedWaypointEmpty = removed.length > 0 && !TransactionUtils.waypointHasValidAddress(removed[0] ?? {}); // When there are only two waypoints we are adding empty waypoint back if (totalWaypoints === 2 && (index === 0 || index === totalWaypoints - 1)) { From d90500916a5abde9db8f1f923323a74e4cf12006 Mon Sep 17 00:00:00 2001 From: rory Date: Wed, 2 Oct 2024 13:34:50 -0700 Subject: [PATCH 499/555] Save draft state --- .github/workflows/buildIOS.yml | 99 ++++++++++++++++++++++++++++++++++ 1 file changed, 99 insertions(+) create mode 100644 .github/workflows/buildIOS.yml diff --git a/.github/workflows/buildIOS.yml b/.github/workflows/buildIOS.yml new file mode 100644 index 000000000000..6cd5eebc2264 --- /dev/null +++ b/.github/workflows/buildIOS.yml @@ -0,0 +1,99 @@ +name: Build iOS app + +on: + workflow_call: + inputs: + type: + description: 'What type of build to run. Must be one of ["release", "adhoc"]' + type: string + required: true + ref: + description: Git ref to checkout and build + type: string + required: true + outputs: + IPA_FILE_NAME: + value: ${{ jobs.build.outputs.IPA_FILE_NAME }} + DSYM_FILE_NAME: + value: ${{ jobs.build.outputs.DSYM_FILE_NAME }} + + workflow_dispatch: + inputs: + type: + description: What type of build do you want to run? + required: true + type: choice + options: + - release + - adhoc + ref: + description: Git ref to checkout and build + required: true + type: string + +jobs: + build: + name: Build iOS app + runs-on: macos-13-xlarge + env: + DEVELOPER_DIR: /Applications/Xcode_15.2.0.app/Contents/Developer + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + ref: ${{ inputs.ref }} + + - name: Configure MapBox SDK + run: ./scripts/setup-mapbox-sdk.sh ${{ secrets.MAPBOX_SDK_DOWNLOAD_TOKEN }} + + - name: Setup Node + id: setup-node + uses: ./.github/actions/composite/setupNode + + - name: Setup Ruby + uses: ruby/setup-ruby@v1.190.0 + with: + bundler-cache: true + + - name: Cache Pod dependencies + uses: actions/cache@v4 + id: pods-cache + with: + path: ios/Pods + key: ${{ runner.os }}-pods-cache-${{ hashFiles('ios/Podfile.lock', 'firebase.json') }} + + - name: Compare Podfile.lock and Manifest.lock + id: compare-podfile-and-manifest + run: echo "IS_PODFILE_SAME_AS_MANIFEST=${{ hashFiles('ios/Podfile.lock') == hashFiles('ios/Pods/Manifest.lock') }}" >> "$GITHUB_OUTPUT" + + - name: Install cocoapods + uses: nick-fields/retry@3f757583fb1b1f940bc8ef4bf4734c8dc02a5847 + if: steps.pods-cache.outputs.cache-hit != 'true' || steps.compare-podfile-and-manifest.outputs.IS_PODFILE_SAME_AS_MANIFEST != 'true' || steps.setup-node.outputs.cache-hit != 'true' + with: + timeout_minutes: 10 + max_attempts: 5 + command: scripts/pod-install.sh + + - name: Decrypt AppStore profile + run: cd ios && gpg --quiet --batch --yes --decrypt --passphrase="$LARGE_SECRET_PASSPHRASE" --output NewApp_AppStore.mobileprovision NewApp_AppStore.mobileprovision.gpg + env: + LARGE_SECRET_PASSPHRASE: ${{ secrets.LARGE_SECRET_PASSPHRASE }} + + - name: Decrypt AppStore Notification Service profile + run: cd ios && gpg --quiet --batch --yes --decrypt --passphrase="$LARGE_SECRET_PASSPHRASE" --output NewApp_AppStore_Notification_Service.mobileprovision NewApp_AppStore_Notification_Service.mobileprovision.gpg + env: + LARGE_SECRET_PASSPHRASE: ${{ secrets.LARGE_SECRET_PASSPHRASE }} + + - name: Decrypt certificate + run: cd ios && gpg --quiet --batch --yes --decrypt --passphrase="$LARGE_SECRET_PASSPHRASE" --output Certificates.p12 Certificates.p12.gpg + env: + LARGE_SECRET_PASSPHRASE: ${{ secrets.LARGE_SECRET_PASSPHRASE }} + + - name: Decrypt App Store Connect API key + run: cd ios && gpg --quiet --batch --yes --decrypt --passphrase="$LARGE_SECRET_PASSPHRASE" --output ios-fastlane-json-key.json ios-fastlane-json-key.json.gpg + env: + LARGE_SECRET_PASSPHRASE: ${{ secrets.LARGE_SECRET_PASSPHRASE }} + + - name: Get iOS native version + id: getIOSVersion + run: echo "IOS_VERSION=$(echo '${{ needs.prep.outputs.APP_VERSION }}' | tr '-' '.')" >> "$GITHUB_OUTPUT" From 15a61d7b569c1aa784225d4360018f462ea37938 Mon Sep 17 00:00:00 2001 From: rory Date: Wed, 2 Oct 2024 16:06:21 -0700 Subject: [PATCH 500/555] Finish buildIOS workflow --- .github/workflows/buildIOS.yml | 42 ++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/.github/workflows/buildIOS.yml b/.github/workflows/buildIOS.yml index 6cd5eebc2264..c211362bd7cd 100644 --- a/.github/workflows/buildIOS.yml +++ b/.github/workflows/buildIOS.yml @@ -97,3 +97,45 @@ jobs: - name: Get iOS native version id: getIOSVersion run: echo "IOS_VERSION=$(echo '${{ needs.prep.outputs.APP_VERSION }}' | tr '-' '.')" >> "$GITHUB_OUTPUT" + + - name: Build iOS release app + id: build + run: | + lane='' + if [ '${{ inputs.type }}' == 'release' ]; then + lane='build' + else + lane='build_adhoc' + fi + + bundle exec fastlane ios "$lane" + + # Reload environment variables from GITHUB_ENV + # shellcheck disable=SC1090 + source "$GITHUB_ENV" + + { + # ipaPath and dsymPath are environment variables set within the Fastfile + echo "IPA_PATH=$ipaPath" + echo "IPA_FILE_NAME=$(basename "$ipaPath")" + echo "DYSM_PATH=$dysmPath" + echo "DSYM_FILE_NAME=$(basename "$dysmPath")" + } >> "$GITHUB_OUTPUT" + + - name: Upload iOS build artifact + uses: actions/upload-artifact@v4 + with: + name: ios-artifact-ipa + path: ${{ steps.build.outputs.IPA_PATH }} + + - name: Upload iOS debug symbols artifact + uses: actions/upload-artifact@v4 + with: + name: ios-artifact-dsym + path: ${{ steps.build.outputs.DYSM_PATH }} + + - name: Announce failure in slack + if: failure() + uses: ./.github/actions/composite/announceFailedWorkflowInSlack + with: + SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK }} From 562be331b1a76c1dd6e80974fa6b166be28d24ab Mon Sep 17 00:00:00 2001 From: rory Date: Wed, 2 Oct 2024 16:39:14 -0700 Subject: [PATCH 501/555] Use callable workflow in deploy.yml --- .github/workflows/buildIOS.yml | 9 --- .github/workflows/deploy.yml | 124 ++++++++++++++------------------- fastlane/Fastfile | 1 + 3 files changed, 52 insertions(+), 82 deletions(-) diff --git a/.github/workflows/buildIOS.yml b/.github/workflows/buildIOS.yml index c211362bd7cd..db9359bf9068 100644 --- a/.github/workflows/buildIOS.yml +++ b/.github/workflows/buildIOS.yml @@ -89,15 +89,6 @@ jobs: env: LARGE_SECRET_PASSPHRASE: ${{ secrets.LARGE_SECRET_PASSPHRASE }} - - name: Decrypt App Store Connect API key - run: cd ios && gpg --quiet --batch --yes --decrypt --passphrase="$LARGE_SECRET_PASSPHRASE" --output ios-fastlane-json-key.json ios-fastlane-json-key.json.gpg - env: - LARGE_SECRET_PASSPHRASE: ${{ secrets.LARGE_SECRET_PASSPHRASE }} - - - name: Get iOS native version - id: getIOSVersion - run: echo "IOS_VERSION=$(echo '${{ needs.prep.outputs.APP_VERSION }}' | tr '-' '.')" >> "$GITHUB_OUTPUT" - - name: Build iOS release app id: build run: | diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 60bb97b0c2e7..3f0c654c8032 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -199,112 +199,90 @@ jobs: name: ${{ fromJSON(env.SHOULD_DEPLOY_PRODUCTION) && 'desktop-build-artifact' || 'desktop-staging-build-artifact' }} path: ./desktop-build/NewExpensify.dmg - iOS: - name: Build and deploy iOS + buildIOS: + name: Build iOS app + uses: ./.github/workflows/buildIOS.yml + if: ${{ github.ref == 'refs/heads/staging' }} needs: prep - env: - DEVELOPER_DIR: /Applications/Xcode_15.2.0.app/Contents/Developer - runs-on: macos-13-xlarge + secrets: inherit + with: + type: release + ref: staging + + uploadIOS: + name: Upload iOS App to TestFlight + needs: buildIOS + runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v4 - - name: Configure MapBox SDK - run: ./scripts/setup-mapbox-sdk.sh ${{ secrets.MAPBOX_SDK_DOWNLOAD_TOKEN }} - - - name: Setup Node - id: setup-node - uses: ./.github/actions/composite/setupNode - - name: Setup Ruby uses: ruby/setup-ruby@v1.190.0 with: bundler-cache: true - - name: Cache Pod dependencies - uses: actions/cache@v4 - id: pods-cache - with: - path: ios/Pods - key: ${{ runner.os }}-pods-cache-${{ hashFiles('ios/Podfile.lock', 'firebase.json') }} - - - name: Compare Podfile.lock and Manifest.lock - id: compare-podfile-and-manifest - run: echo "IS_PODFILE_SAME_AS_MANIFEST=${{ hashFiles('ios/Podfile.lock') == hashFiles('ios/Pods/Manifest.lock') }}" >> "$GITHUB_OUTPUT" - - - name: Install cocoapods - uses: nick-fields/retry@3f757583fb1b1f940bc8ef4bf4734c8dc02a5847 - if: steps.pods-cache.outputs.cache-hit != 'true' || steps.compare-podfile-and-manifest.outputs.IS_PODFILE_SAME_AS_MANIFEST != 'true' || steps.setup-node.outputs.cache-hit != 'true' - with: - timeout_minutes: 10 - max_attempts: 5 - command: scripts/pod-install.sh - - - name: Decrypt AppStore profile - run: cd ios && gpg --quiet --batch --yes --decrypt --passphrase="$LARGE_SECRET_PASSPHRASE" --output NewApp_AppStore.mobileprovision NewApp_AppStore.mobileprovision.gpg - env: - LARGE_SECRET_PASSPHRASE: ${{ secrets.LARGE_SECRET_PASSPHRASE }} - - - name: Decrypt AppStore Notification Service profile - run: cd ios && gpg --quiet --batch --yes --decrypt --passphrase="$LARGE_SECRET_PASSPHRASE" --output NewApp_AppStore_Notification_Service.mobileprovision NewApp_AppStore_Notification_Service.mobileprovision.gpg - env: - LARGE_SECRET_PASSPHRASE: ${{ secrets.LARGE_SECRET_PASSPHRASE }} - - - name: Decrypt certificate - run: cd ios && gpg --quiet --batch --yes --decrypt --passphrase="$LARGE_SECRET_PASSPHRASE" --output Certificates.p12 Certificates.p12.gpg - env: - LARGE_SECRET_PASSPHRASE: ${{ secrets.LARGE_SECRET_PASSPHRASE }} - - name: Decrypt App Store Connect API key run: cd ios && gpg --quiet --batch --yes --decrypt --passphrase="$LARGE_SECRET_PASSPHRASE" --output ios-fastlane-json-key.json ios-fastlane-json-key.json.gpg env: LARGE_SECRET_PASSPHRASE: ${{ secrets.LARGE_SECRET_PASSPHRASE }} - - name: Get iOS native version - id: getIOSVersion - run: echo "IOS_VERSION=$(echo '${{ needs.prep.outputs.APP_VERSION }}' | tr '-' '.')" >> "$GITHUB_OUTPUT" + - name: Download iOS build artifacts + uses: actions/download-artifact@v4 + with: + path: /tmp/artifacts + pattern: ios-artifact-* + merge-multiple: true - - name: Build iOS release app - if: ${{ !fromJSON(env.SHOULD_DEPLOY_PRODUCTION) }} - run: bundle exec fastlane ios build + - name: Log downloaded artifact paths + run: ls -R /tmp/artifacts - - name: Upload release build to TestFlight - if: ${{ !fromJSON(env.SHOULD_DEPLOY_PRODUCTION) }} + - name: Upload iOS app to TestFlight run: bundle exec fastlane ios upload_testflight env: APPLE_CONTACT_EMAIL: ${{ secrets.APPLE_CONTACT_EMAIL }} APPLE_CONTACT_PHONE: ${{ secrets.APPLE_CONTACT_PHONE }} APPLE_DEMO_EMAIL: ${{ secrets.APPLE_DEMO_EMAIL }} APPLE_DEMO_PASSWORD: ${{ secrets.APPLE_DEMO_PASSWORD }} - - - name: Submit build for App Store review - if: ${{ fromJSON(env.SHOULD_DEPLOY_PRODUCTION) }} - run: bundle exec fastlane ios submit_for_review - env: - VERSION: ${{ steps.getIOSVersion.outputs.IOS_VERSION }} + ipaPath: /tmp/artifacts/${{ needs.buildIOS.outputs.IPA_FILE_NAME }} + dsymPath: /tmp/artifacts/${{ needs.buildIOS.outputs.DSYM_FILE_NAME }} - name: Upload iOS build to Browser Stack if: ${{ !fromJSON(env.SHOULD_DEPLOY_PRODUCTION) }} - run: curl -u "$BROWSERSTACK" -X POST "https://api-cloud.browserstack.com/app-live/upload" -F "file=@/Users/runner/work/App/App/New Expensify.ipa" + run: curl -u "$BROWSERSTACK" -X POST "https://api-cloud.browserstack.com/app-live/upload" -F "file=@/tmp/artifacts/${{ needs.buildIOS.outputs.IPA_PATH }}" env: BROWSERSTACK: ${{ secrets.BROWSERSTACK }} - - name: Upload iOS sourcemaps artifact - if: ${{ !fromJSON(env.SHOULD_DEPLOY_PRODUCTION) }} - uses: actions/upload-artifact@v4 - with: - name: ios-sourcemaps-artifact - path: ./main.jsbundle.map + submitIOS: + name: Submit iOS app for Apple review + needs: prep + if: ${{ github.ref == 'refs/heads/production' }} + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 - - name: Upload iOS build artifact - if: ${{ !fromJSON(env.SHOULD_DEPLOY_PRODUCTION) }} - uses: actions/upload-artifact@v4 + - name: Setup Ruby + uses: ruby/setup-ruby@v1.190.0 with: - name: ios-build-artifact - path: /Users/runner/work/App/App/New\ Expensify.ipa + bundler-cache: true + + - name: Decrypt App Store Connect API key + run: cd ios && gpg --quiet --batch --yes --decrypt --passphrase="$LARGE_SECRET_PASSPHRASE" --output ios-fastlane-json-key.json ios-fastlane-json-key.json.gpg + env: + LARGE_SECRET_PASSPHRASE: ${{ secrets.LARGE_SECRET_PASSPHRASE }} + + - name: Get iOS native version + id: getIOSVersion + run: echo "IOS_VERSION=$(echo '${{ needs.prep.outputs.APP_VERSION }}' | tr '-' '.')" >> "$GITHUB_OUTPUT" + + - name: Submit build for App Store review + run: bundle exec fastlane ios submit_for_review + env: + VERSION: ${{ steps.getIOSVersion.outputs.IOS_VERSION }} - name: Warn deployers if iOS production deploy failed - if: ${{ failure() && fromJSON(env.SHOULD_DEPLOY_PRODUCTION) }} + if: ${{ failure() }} uses: 8398a7/action-slack@v3 with: status: custom diff --git a/fastlane/Fastfile b/fastlane/Fastfile index eed84acdc916..7584a0a16cde 100644 --- a/fastlane/Fastfile +++ b/fastlane/Fastfile @@ -286,6 +286,7 @@ platform :ios do desc "Upload app to TestFlight" lane :upload_testflight do upload_to_testflight( + ipa: ENV[KEY_IPA_PATH], api_key_path: "./ios/ios-fastlane-json-key.json", distribute_external: true, notify_external_testers: true, From 00a17ef96650c4465e8df9d530a4ad9d7cc92bb5 Mon Sep 17 00:00:00 2001 From: rory Date: Wed, 2 Oct 2024 16:57:13 -0700 Subject: [PATCH 502/555] Use callable ios workflow in testBuild --- .github/workflows/testBuild.yml | 113 +++++++++----------------------- fastlane/Fastfile | 6 +- 2 files changed, 37 insertions(+), 82 deletions(-) diff --git a/.github/workflows/testBuild.yml b/.github/workflows/testBuild.yml index 672d468ed3b1..7587bbfb8677 100644 --- a/.github/workflows/testBuild.yml +++ b/.github/workflows/testBuild.yml @@ -120,73 +120,40 @@ jobs: # $s3APKPath is set from within the Fastfile, android upload_s3 lane echo "S3_APK_PATH=$s3APKPath" >> "$GITHUB_OUTPUT" - iOS: - name: Build and deploy iOS for testing - needs: [validateActor, getBranchRef] + buildIOS: + name: Build iOS app for testing + uses: ./.github/workflows/buildIOS.yml if: ${{ fromJSON(needs.validateActor.outputs.READY_TO_BUILD) }} - env: - DEVELOPER_DIR: /Applications/Xcode_15.2.0.app/Contents/Developer - runs-on: macos-13-xlarge + needs: [validateActor, getBranchRef] + secrets: inherit + with: + type: adhoc + ref: ${{ github.event.pull_request.head.sha || needs.getBranchRef.outputs.REF }} + + uploadIOS: + name: Upload IOS app to S3 + needs: buildIOS + runs-on: ubuntu-latest + outputs: + S3_IPA_PATH: ${{ steps.exportS3Paths.outputs.S3_IPA_PATH }} steps: - name: Checkout uses: actions/checkout@v4 - with: - ref: ${{ github.event.pull_request.head.sha || needs.getBranchRef.outputs.REF }} - - - name: Configure MapBox SDK - run: ./scripts/setup-mapbox-sdk.sh ${{ secrets.MAPBOX_SDK_DOWNLOAD_TOKEN }} - - - name: Create .env.adhoc file based on staging and add PULL_REQUEST_NUMBER env to it - run: | - cp .env.staging .env.adhoc - sed -i '' 's/ENVIRONMENT=staging/ENVIRONMENT=adhoc/' .env.adhoc - echo "PULL_REQUEST_NUMBER=$PULL_REQUEST_NUMBER" >> .env.adhoc - - - name: Setup Node - id: setup-node - uses: ./.github/actions/composite/setupNode - - - name: Setup XCode - run: sudo xcode-select -switch /Applications/Xcode_15.2.0.app - name: Setup Ruby uses: ruby/setup-ruby@v1.190.0 with: bundler-cache: true - - name: Cache Pod dependencies - uses: actions/cache@v4 - id: pods-cache - with: - path: ios/Pods - key: ${{ runner.os }}-pods-cache-${{ hashFiles('ios/Podfile.lock', 'firebase.json') }} - - - name: Compare Podfile.lock and Manifest.lock - id: compare-podfile-and-manifest - run: echo "IS_PODFILE_SAME_AS_MANIFEST=${{ hashFiles('ios/Podfile.lock') == hashFiles('ios/Pods/Manifest.lock') }}" >> "$GITHUB_OUTPUT" - - - name: Install cocoapods - uses: nick-fields/retry@3f757583fb1b1f940bc8ef4bf4734c8dc02a5847 - if: steps.pods-cache.outputs.cache-hit != 'true' || steps.compare-podfile-and-manifest.outputs.IS_PODFILE_SAME_AS_MANIFEST != 'true' || steps.setup-node.outputs.cache-hit != 'true' + - name: Download IOS build artifacts + uses: actions/download-artifact@v4 with: - timeout_minutes: 10 - max_attempts: 5 - command: scripts/pod-install.sh - - - name: Decrypt AdHoc profile - run: cd ios && gpg --quiet --batch --yes --decrypt --passphrase="$LARGE_SECRET_PASSPHRASE" --output NewApp_AdHoc.mobileprovision NewApp_AdHoc.mobileprovision.gpg - env: - LARGE_SECRET_PASSPHRASE: ${{ secrets.LARGE_SECRET_PASSPHRASE }} - - - name: Decrypt AdHoc Notification Service profile - run: cd ios && gpg --quiet --batch --yes --decrypt --passphrase="$LARGE_SECRET_PASSPHRASE" --output NewApp_AdHoc_Notification_Service.mobileprovision NewApp_AdHoc_Notification_Service.mobileprovision.gpg - env: - LARGE_SECRET_PASSPHRASE: ${{ secrets.LARGE_SECRET_PASSPHRASE }} + path: /tmp/artifacts + pattern: ios-artifact-* + merge-multiple: true - - name: Decrypt certificate - run: cd ios && gpg --quiet --batch --yes --decrypt --passphrase="$LARGE_SECRET_PASSPHRASE" --output Certificates.p12 Certificates.p12.gpg - env: - LARGE_SECRET_PASSPHRASE: ${{ secrets.LARGE_SECRET_PASSPHRASE }} + - name: Log downloaded artifact paths + run: ls -R /tmp/artifacts - name: Configure AWS Credentials uses: aws-actions/configure-aws-credentials@v4 @@ -195,22 +162,20 @@ jobs: aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} aws-region: us-east-1 - - name: Build AdHoc app - run: bundle exec fastlane ios build_adhoc - - name: Upload AdHoc build to S3 - run: bundle exec fastlane ios upload_s3 + run: bundle exec fastlane android upload_s3 env: + apkPath: /tmp/artifacts/${{ needs.buildAndroid.outputs.APK_FILE_NAME }} S3_ACCESS_KEY: ${{ secrets.AWS_ACCESS_KEY_ID }} S3_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} S3_BUCKET: ad-hoc-expensify-cash S3_REGION: us-east-1 - - name: Upload Artifact - uses: actions/upload-artifact@v4 - with: - name: ios - path: ./ios_paths.json + - name: Export S3 paths + id: exportS3Paths + run: | + # $s3IpaPath is set from within the Fastfile, ios upload_s3 lane + echo "S3_IPA_PATH=$s3IpaPath" >> "$GITHUB_OUTPUT" desktop: name: Build and deploy Desktop for testing @@ -291,32 +256,18 @@ jobs: postGithubComment: runs-on: ubuntu-latest name: Post a GitHub comment with app download links for testing - needs: [validateActor, getBranchRef, uploadAndroid, iOS, desktop, web] - if: ${{ always() }} + needs: [validateActor, getBranchRef, uploadAndroid, uploadIOS, desktop, web] + if: ${{ always() && fromJSON(needs.validateActor.outputs.READY_TO_BUILD) }} steps: - name: Checkout uses: actions/checkout@v4 - if: ${{ fromJSON(needs.validateActor.outputs.READY_TO_BUILD) }} with: ref: ${{ github.event.pull_request.head.sha || needs.getBranchRef.outputs.REF }} - name: Download Artifact uses: actions/download-artifact@v4 - if: ${{ fromJSON(needs.validateActor.outputs.READY_TO_BUILD) }} - - - name: Read JSONs with iOS paths - id: get_ios_path - if: ${{ needs.iOS.result == 'success' }} - run: | - content_ios="$(cat ./ios/ios_paths.json)" - content_ios="${content_ios//'%'/'%25'}" - content_ios="${content_ios//$'\n'/'%0A'}" - content_ios="${content_ios//$'\r'/'%0D'}" - ios_path=$(echo "$content_ios" | jq -r '.html_path') - echo "ios_path=$ios_path" >> "$GITHUB_OUTPUT" - name: Publish links to apps for download - if: ${{ fromJSON(needs.validateActor.outputs.READY_TO_BUILD) }} uses: ./.github/actions/javascript/postTestBuildComment with: PR_NUMBER: ${{ env.PULL_REQUEST_NUMBER }} @@ -327,5 +278,5 @@ jobs: WEB: ${{ needs.web.result }} ANDROID_LINK: ${{ needs.uploadAndroid.outputs.S3_APK_PATH }} DESKTOP_LINK: https://ad-hoc-expensify-cash.s3.amazonaws.com/desktop/${{ env.PULL_REQUEST_NUMBER }}/NewExpensify.dmg - IOS_LINK: ${{ steps.get_ios_path.outputs.ios_path }} + IOS_LINK: ${{ needs.uploadIOS.outputs.S3_IPA_PATH }} WEB_LINK: https://${{ env.PULL_REQUEST_NUMBER }}.pr-testing.expensify.com diff --git a/fastlane/Fastfile b/fastlane/Fastfile index 7584a0a16cde..fb5ddf468765 100644 --- a/fastlane/Fastfile +++ b/fastlane/Fastfile @@ -19,6 +19,7 @@ KEY_GRADLE_APK_PATH = "apkPath" KEY_S3_APK_PATH = "s3APKPath" KEY_GRADLE_AAB_PATH = "aabPath" KEY_IPA_PATH = "ipaPath" +KEY_S3_IPA_PATH = "s3IpaPath" KEY_DSYM_PATH = "dsymPath" # Export environment variables to GITHUB_ENV @@ -280,7 +281,10 @@ platform :ios do ipa: ENV[KEY_IPA_PATH], app_directory: "ios/#{ENV['PULL_REQUEST_NUMBER']}", ) - sh("echo '{\"ipa_path\": \"#{lane_context[SharedValues::S3_IPA_OUTPUT_PATH]}\",\"html_path\": \"#{lane_context[SharedValues::S3_HTML_OUTPUT_PATH]}\"}' > ../ios_paths.json") + puts "Saving S3 outputs in env..." + exportEnvVars({ + KEY_S3_IPA_PATH => lane_context[SharedValues::S3_HTML_OUTPUT_PATH]. + }) end desc "Upload app to TestFlight" From c43831ebb0aafafb2141b451a3230f8c2f8935c9 Mon Sep 17 00:00:00 2001 From: rory Date: Wed, 2 Oct 2024 16:57:54 -0700 Subject: [PATCH 503/555] exportS3Path singular --- .github/workflows/testBuild.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/testBuild.yml b/.github/workflows/testBuild.yml index 7587bbfb8677..76a491768d84 100644 --- a/.github/workflows/testBuild.yml +++ b/.github/workflows/testBuild.yml @@ -135,7 +135,7 @@ jobs: needs: buildIOS runs-on: ubuntu-latest outputs: - S3_IPA_PATH: ${{ steps.exportS3Paths.outputs.S3_IPA_PATH }} + S3_IPA_PATH: ${{ steps.exportS3Path.outputs.S3_IPA_PATH }} steps: - name: Checkout uses: actions/checkout@v4 @@ -172,7 +172,7 @@ jobs: S3_REGION: us-east-1 - name: Export S3 paths - id: exportS3Paths + id: exportS3Path run: | # $s3IpaPath is set from within the Fastfile, ios upload_s3 lane echo "S3_IPA_PATH=$s3IpaPath" >> "$GITHUB_OUTPUT" From 3bf805d97fd35b44e22d5f32fe64fd800aae5cd5 Mon Sep 17 00:00:00 2001 From: rory Date: Wed, 2 Oct 2024 16:59:30 -0700 Subject: [PATCH 504/555] Fix upload step --- .github/workflows/testBuild.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/testBuild.yml b/.github/workflows/testBuild.yml index 76a491768d84..8677c27f15ef 100644 --- a/.github/workflows/testBuild.yml +++ b/.github/workflows/testBuild.yml @@ -163,9 +163,9 @@ jobs: aws-region: us-east-1 - name: Upload AdHoc build to S3 - run: bundle exec fastlane android upload_s3 + run: bundle exec fastlane ios upload_s3 env: - apkPath: /tmp/artifacts/${{ needs.buildAndroid.outputs.APK_FILE_NAME }} + ipaPath: /tmp/artifacts/${{ needs.buildIOS.outputs.IPA_FILE_NAME }} S3_ACCESS_KEY: ${{ secrets.AWS_ACCESS_KEY_ID }} S3_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} S3_BUCKET: ad-hoc-expensify-cash From ae65b87dd5d211d3a0f0e1eedc851dff5776a7c4 Mon Sep 17 00:00:00 2001 From: rory Date: Wed, 2 Oct 2024 17:28:42 -0700 Subject: [PATCH 505/555] Fix typo in Fastfile --- fastlane/Fastfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fastlane/Fastfile b/fastlane/Fastfile index fb5ddf468765..c5c9de8cc9a7 100644 --- a/fastlane/Fastfile +++ b/fastlane/Fastfile @@ -283,7 +283,7 @@ platform :ios do ) puts "Saving S3 outputs in env..." exportEnvVars({ - KEY_S3_IPA_PATH => lane_context[SharedValues::S3_HTML_OUTPUT_PATH]. + KEY_S3_IPA_PATH => lane_context[SharedValues::S3_HTML_OUTPUT_PATH], }) end From 2db0222dd25e62dd53da729196b3d57379e6114d Mon Sep 17 00:00:00 2001 From: rory Date: Wed, 2 Oct 2024 17:52:11 -0700 Subject: [PATCH 506/555] Update buildIOS with AdHoc-specific steps --- .github/workflows/buildAndroid.yml | 1 - .github/workflows/buildIOS.yml | 36 +++++++++++++++++++++++------- .github/workflows/testBuild.yml | 1 + 3 files changed, 29 insertions(+), 9 deletions(-) diff --git a/.github/workflows/buildAndroid.yml b/.github/workflows/buildAndroid.yml index a8023aebd359..32a8d2c2812d 100644 --- a/.github/workflows/buildAndroid.yml +++ b/.github/workflows/buildAndroid.yml @@ -41,7 +41,6 @@ on: description: Git ref to checkout and build required: true type: string - pull_request_number: description: The pull request number associated with this build, if relevant. type: number diff --git a/.github/workflows/buildIOS.yml b/.github/workflows/buildIOS.yml index db9359bf9068..6c6c8ca5296f 100644 --- a/.github/workflows/buildIOS.yml +++ b/.github/workflows/buildIOS.yml @@ -11,6 +11,10 @@ on: description: Git ref to checkout and build type: string required: true + pull_request_number: + description: The pull request number associated with this build, if relevant. + type: number + required: false outputs: IPA_FILE_NAME: value: ${{ jobs.build.outputs.IPA_FILE_NAME }} @@ -30,6 +34,10 @@ on: description: Git ref to checkout and build required: true type: string + pull_request_number: + description: The pull request number associated with this build, if relevant. + type: number + required: false jobs: build: @@ -43,6 +51,13 @@ jobs: with: ref: ${{ inputs.ref }} + - name: Create .env.adhoc file based on staging and add PULL_REQUEST_NUMBER env to it + if: ${{ inputs.type == 'adhoc' }} + run: | + cp .env.staging .env.adhoc + sed -i '' 's/ENVIRONMENT=staging/ENVIRONMENT=adhoc/' .env.adhoc + echo "PULL_REQUEST_NUMBER=${{ inputs.pull_request_number }}" >> .env.adhoc + - name: Configure MapBox SDK run: ./scripts/setup-mapbox-sdk.sh ${{ secrets.MAPBOX_SDK_DOWNLOAD_TOKEN }} @@ -74,17 +89,22 @@ jobs: max_attempts: 5 command: scripts/pod-install.sh - - name: Decrypt AppStore profile - run: cd ios && gpg --quiet --batch --yes --decrypt --passphrase="$LARGE_SECRET_PASSPHRASE" --output NewApp_AppStore.mobileprovision NewApp_AppStore.mobileprovision.gpg - env: - LARGE_SECRET_PASSPHRASE: ${{ secrets.LARGE_SECRET_PASSPHRASE }} - - - name: Decrypt AppStore Notification Service profile - run: cd ios && gpg --quiet --batch --yes --decrypt --passphrase="$LARGE_SECRET_PASSPHRASE" --output NewApp_AppStore_Notification_Service.mobileprovision NewApp_AppStore_Notification_Service.mobileprovision.gpg + - name: Decrypt provisioning profiles + run: | + cd ios + provisioningProfile='' + if [ '${{ inputs.type }}' == 'release' ]; then + provisioningProfile='NewApp_AppStore' + else + provisioningProfile='NewApp_AdHoc' + fi + echo "Using provisioning profile: $provisioningProfile" + gpg --quiet --batch --yes --decrypt --passphrase="$LARGE_SECRET_PASSPHRASE" --output "$provisioningProfile.mobileprovision" "$provisioningProfile.mobileprovision.gpg" + gpg --quiet --batch --yes --decrypt --passphrase="$LARGE_SECRET_PASSPHRASE" --output "$provisioningProfile_Notification_Service.mobileprovision" "$provisioningProfile_Notification_Service.mobileprovision.gpg" env: LARGE_SECRET_PASSPHRASE: ${{ secrets.LARGE_SECRET_PASSPHRASE }} - - name: Decrypt certificate + - name: Decrypt code signing certificate run: cd ios && gpg --quiet --batch --yes --decrypt --passphrase="$LARGE_SECRET_PASSPHRASE" --output Certificates.p12 Certificates.p12.gpg env: LARGE_SECRET_PASSPHRASE: ${{ secrets.LARGE_SECRET_PASSPHRASE }} diff --git a/.github/workflows/testBuild.yml b/.github/workflows/testBuild.yml index 8677c27f15ef..52f73f60663b 100644 --- a/.github/workflows/testBuild.yml +++ b/.github/workflows/testBuild.yml @@ -129,6 +129,7 @@ jobs: with: type: adhoc ref: ${{ github.event.pull_request.head.sha || needs.getBranchRef.outputs.REF }} + pull_request_number: ${{ env.PULL_REQUEST_NUMBER }} uploadIOS: name: Upload IOS app to S3 From 2de022b0f419b404d41fbe55bdd25d6e17ea770c Mon Sep 17 00:00:00 2001 From: rory Date: Wed, 2 Oct 2024 17:57:59 -0700 Subject: [PATCH 507/555] Make pull_request_number type: string to make lint happy --- .github/workflows/buildIOS.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/buildIOS.yml b/.github/workflows/buildIOS.yml index 6c6c8ca5296f..9d01a2923114 100644 --- a/.github/workflows/buildIOS.yml +++ b/.github/workflows/buildIOS.yml @@ -13,7 +13,7 @@ on: required: true pull_request_number: description: The pull request number associated with this build, if relevant. - type: number + type: string required: false outputs: IPA_FILE_NAME: From d3c38d94a94d0332a8bd1d1ee3a0bdd38c1ea264 Mon Sep 17 00:00:00 2001 From: rory Date: Wed, 2 Oct 2024 18:01:32 -0700 Subject: [PATCH 508/555] Add missing workflow-level outputs --- .github/workflows/buildIOS.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/buildIOS.yml b/.github/workflows/buildIOS.yml index 9d01a2923114..53347eac8f67 100644 --- a/.github/workflows/buildIOS.yml +++ b/.github/workflows/buildIOS.yml @@ -45,6 +45,9 @@ jobs: runs-on: macos-13-xlarge env: DEVELOPER_DIR: /Applications/Xcode_15.2.0.app/Contents/Developer + outputs: + IPA_FILE_NAME: ${{ steps.build.outputs.IPA_FILE_NAME }} + DSYM_FILE_NAME: ${{ steps.build.outputs.DSYM_FILE_NAME }} steps: - name: Checkout uses: actions/checkout@v4 From cf033caadd6f6df976ef675e6bdb1bac55b1e0f2 Mon Sep 17 00:00:00 2001 From: rory Date: Wed, 2 Oct 2024 18:14:17 -0700 Subject: [PATCH 509/555] Fix needs --- .github/workflows/deploy.yml | 38 +++++++++++++++++---------------- .github/workflows/testBuild.yml | 2 +- 2 files changed, 21 insertions(+), 19 deletions(-) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 3f0c654c8032..df98d7332c77 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -249,7 +249,7 @@ jobs: - name: Upload iOS build to Browser Stack if: ${{ !fromJSON(env.SHOULD_DEPLOY_PRODUCTION) }} - run: curl -u "$BROWSERSTACK" -X POST "https://api-cloud.browserstack.com/app-live/upload" -F "file=@/tmp/artifacts/${{ needs.buildIOS.outputs.IPA_PATH }}" + run: curl -u "$BROWSERSTACK" -X POST "https://api-cloud.browserstack.com/app-live/upload" -F "file=@/tmp/artifacts/${{ needs.buildIOS.outputs.IPA_FILE_NAME }}" env: BROWSERSTACK: ${{ secrets.BROWSERSTACK }} @@ -385,7 +385,7 @@ jobs: name: Post a Slack message when any platform fails to build or deploy runs-on: ubuntu-latest if: ${{ failure() }} - needs: [buildAndroid, uploadAndroid, submitAndroid, desktop, iOS, web] + needs: [buildAndroid, uploadAndroid, submitAndroid, desktop, buildIOS, uploadIOS, submitIOS, web] steps: - name: Checkout uses: actions/checkout@v4 @@ -411,7 +411,7 @@ jobs: outputs: IS_AT_LEAST_ONE_PLATFORM_DEPLOYED: ${{ steps.checkDeploymentSuccessOnAtLeastOnePlatform.outputs.IS_AT_LEAST_ONE_PLATFORM_DEPLOYED }} IS_ALL_PLATFORMS_DEPLOYED: ${{ steps.checkDeploymentSuccessOnAllPlatforms.outputs.IS_ALL_PLATFORMS_DEPLOYED }} - needs: [buildAndroid, uploadAndroid, submitAndroid, desktop, iOS, web] + needs: [buildAndroid, uploadAndroid, submitAndroid, desktop, buildIOS, uploadIOS, submitIOS, web] if: ${{ always() }} steps: - name: Check deployment success on at least one platform @@ -419,18 +419,19 @@ jobs: run: | isAtLeastOnePlatformDeployed="false" if [ ${{ github.ref }} == 'refs/heads/production' ]; then - if [ "${{ needs.submitAndroid.result }}" == "success" ]; then + if [ '${{ needs.submitAndroid.result }}' == 'success' ] || \ + [ '${{ needs.submitIOS.result }}' == 'success' ]; then isAtLeastOnePlatformDeployed="true" fi else - if [ "${{ needs.uploadAndroid.result }}" == "success" ]; then + if [ '${{ needs.uploadAndroid.result }}' == 'success' ] || \ + [ '${{ needs.uploadIOS.result }}' == 'success' ]; then isAtLeastOnePlatformDeployed="true" fi fi - - if [ "${{ needs.iOS.result }}" == "success" ] || \ - [ "${{ needs.desktop.result }}" == "success" ] || \ - [ "${{ needs.web.result }}" == "success" ]; then + + if [ '${{ needs.desktop.result }}' == 'success' ] || \ + [ '${{ needs.web.result }}' == 'success' ]; then isAtLeastOnePlatformDeployed="true" fi echo "IS_AT_LEAST_ONE_PLATFORM_DEPLOYED=$isAtLeastOnePlatformDeployed" >> "$GITHUB_OUTPUT" @@ -439,19 +440,20 @@ jobs: - name: Check deployment success on all platforms id: checkDeploymentSuccessOnAllPlatforms run: | - isAllPlatformsDeployed="false" - if [ "${{ needs.iOS.result }}" == "success" ] && \ - [ "${{ needs.desktop.result }}" == "success" ] && \ - [ "${{ needs.web.result }}" == "success" ]; then + isAllPlatformsDeployed='false' + if [ '${{ needs.desktop.result }}' == 'success' ] && \ + [ '${{ needs.web.result }}' == 'success' ]; then isAllPlatformsDeployed="true" fi if [ ${{ github.ref }} == 'refs/heads/production' ]; then - if [ "${{ needs.submitAndroid.result }}" != "success" ]; then + if [ '${{ needs.submitAndroid.result }}' != 'success' ] || \ + [ '${{ needs.submitIOS.result }}' != 'success' ]; then isAllPlatformsDeployed="false" fi else - if [ "${{ needs.uploadAndroid.result }}" != "success" ]; then + if [ '${{ needs.uploadAndroid.result }}' != 'success' ] || \ + [ '${{ needs.uploadIOS.result }}' != 'success' ]; then isAllPlatformsDeployed="false" fi fi @@ -575,7 +577,7 @@ jobs: name: Post a Slack message when all platforms deploy successfully runs-on: ubuntu-latest if: ${{ always() && fromJSON(needs.checkDeploymentSuccess.outputs.IS_ALL_PLATFORMS_DEPLOYED) }} - needs: [prep, buildAndroid, uploadAndroid, submitAndroid, desktop, iOS, web, checkDeploymentSuccess, createPrerelease, finalizeRelease] + needs: [prep, buildAndroid, uploadAndroid, submitAndroid, desktop, buildIOS, uploadIOS, submitIOS, web, checkDeploymentSuccess, createPrerelease, finalizeRelease] steps: - name: 'Announces the deploy in the #announce Slack room' uses: 8398a7/action-slack@v3 @@ -629,11 +631,11 @@ jobs: postGithubComments: uses: ./.github/workflows/postDeployComments.yml if: ${{ always() && fromJSON(needs.checkDeploymentSuccess.outputs.IS_AT_LEAST_ONE_PLATFORM_DEPLOYED) }} - needs: [prep, buildAndroid, uploadAndroid, submitAndroid, desktop, iOS, web, checkDeploymentSuccess, createPrerelease, finalizeRelease] + needs: [prep, buildAndroid, uploadAndroid, submitAndroid, buildIOS, uploadIOS, submitIOS, desktop, web, checkDeploymentSuccess, createPrerelease, finalizeRelease] with: version: ${{ needs.prep.outputs.APP_VERSION }} env: ${{ github.ref == 'refs/heads/production' && 'production' || 'staging' }} android: ${{ github.ref == 'refs/heads/production' && needs.submitAndroid.result || needs.uploadAndroid.result }} - ios: ${{ needs.iOS.result }} + ios: ${{ github.ref == 'refs/heads/production' && needs.submitIOS.result || needs.uploadIOS.result }} web: ${{ needs.web.result }} desktop: ${{ needs.desktop.result }} diff --git a/.github/workflows/testBuild.yml b/.github/workflows/testBuild.yml index 52f73f60663b..ba29fa970383 100644 --- a/.github/workflows/testBuild.yml +++ b/.github/workflows/testBuild.yml @@ -275,7 +275,7 @@ jobs: GITHUB_TOKEN: ${{ github.token }} ANDROID: ${{ needs.uploadAndroid.result }} DESKTOP: ${{ needs.desktop.result }} - IOS: ${{ needs.iOS.result }} + IOS: ${{ needs.uploadIOS.result }} WEB: ${{ needs.web.result }} ANDROID_LINK: ${{ needs.uploadAndroid.outputs.S3_APK_PATH }} DESKTOP_LINK: https://ad-hoc-expensify-cash.s3.amazonaws.com/desktop/${{ env.PULL_REQUEST_NUMBER }}/NewExpensify.dmg From 6bdeb2c1c7a74b740fbe4a08b7f770a48de947ab Mon Sep 17 00:00:00 2001 From: rory Date: Wed, 2 Oct 2024 18:15:53 -0700 Subject: [PATCH 510/555] Don't access env where it's not available --- .github/workflows/testBuild.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/testBuild.yml b/.github/workflows/testBuild.yml index ba29fa970383..ac20a8d09141 100644 --- a/.github/workflows/testBuild.yml +++ b/.github/workflows/testBuild.yml @@ -129,7 +129,7 @@ jobs: with: type: adhoc ref: ${{ github.event.pull_request.head.sha || needs.getBranchRef.outputs.REF }} - pull_request_number: ${{ env.PULL_REQUEST_NUMBER }} + pull_request_number: ${{ github.event.number || github.event.inputs.PULL_REQUEST_NUMBER }} uploadIOS: name: Upload IOS app to S3 From 82b2520cbbbfea4c6e162744cf4ff0dbfe2d9033 Mon Sep 17 00:00:00 2001 From: nkdengineer Date: Fri, 4 Oct 2024 03:18:06 +0700 Subject: [PATCH 511/555] revert unused change --- src/libs/actions/Transaction.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libs/actions/Transaction.ts b/src/libs/actions/Transaction.ts index 19692af41f72..62ecf7397465 100644 --- a/src/libs/actions/Transaction.ts +++ b/src/libs/actions/Transaction.ts @@ -146,7 +146,7 @@ function removeWaypoint(transaction: OnyxEntry, currentIndex: strin return Promise.resolve(); } - const isRemovedWaypointEmpty = removed.length > 0 && !TransactionUtils.waypointHasValidAddress(removed[0] ?? {}); + const isRemovedWaypointEmpty = removed.length > 0 && !TransactionUtils.waypointHasValidAddress(removed.at(0) ?? {}); // When there are only two waypoints we are adding empty waypoint back if (totalWaypoints === 2 && (index === 0 || index === totalWaypoints - 1)) { From 8deb907d78e7df2ceae56f9fb0a2c6d214cfaca5 Mon Sep 17 00:00:00 2001 From: rory Date: Thu, 3 Oct 2024 13:27:11 -0700 Subject: [PATCH 512/555] Debug provisioning profile stuff --- .github/workflows/buildIOS.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/buildIOS.yml b/.github/workflows/buildIOS.yml index 53347eac8f67..7531be2da07e 100644 --- a/.github/workflows/buildIOS.yml +++ b/.github/workflows/buildIOS.yml @@ -102,6 +102,8 @@ jobs: provisioningProfile='NewApp_AdHoc' fi echo "Using provisioning profile: $provisioningProfile" + ls + ls | grep "$provisioningProfile.mobileprovision.gpg" gpg --quiet --batch --yes --decrypt --passphrase="$LARGE_SECRET_PASSPHRASE" --output "$provisioningProfile.mobileprovision" "$provisioningProfile.mobileprovision.gpg" gpg --quiet --batch --yes --decrypt --passphrase="$LARGE_SECRET_PASSPHRASE" --output "$provisioningProfile_Notification_Service.mobileprovision" "$provisioningProfile_Notification_Service.mobileprovision.gpg" env: From 79dda7a7213e047fc03b0a0522932c1f6ae965c2 Mon Sep 17 00:00:00 2001 From: nkdengineer Date: Fri, 4 Oct 2024 03:39:11 +0700 Subject: [PATCH 513/555] update translation for user created room --- src/languages/en.ts | 2 +- src/languages/es.ts | 2 +- src/libs/SidebarUtils.ts | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/languages/en.ts b/src/languages/en.ts index 4cc75d671dc3..0863b0f8db9e 100755 --- a/src/languages/en.ts +++ b/src/languages/en.ts @@ -665,7 +665,7 @@ const translations = { beginningOfChatHistoryAnnounceRoomPartOne: ({workspaceName}: BeginningOfChatHistoryAnnounceRoomPartOneParams) => `This chat is with everyone in ${workspaceName} workspace.`, beginningOfChatHistoryAnnounceRoomPartTwo: ` Use it for the most important announcements.`, beginningOfChatHistoryUserRoomPartOne: 'This chat room is for anything ', - beginningOfChatHistoryUserRoomPartTwo: ({displayName}: {displayName: string}) => ` related. It was created by ${displayName}.`, + beginningOfChatHistoryUserRoomPartTwo: ' related.', beginningOfChatHistoryInvoiceRoomPartOne: `This chat is for invoices between `, beginningOfChatHistoryInvoiceRoomPartTwo: `. Use the + button to send an invoice.`, beginningOfChatHistory: 'This chat is with ', diff --git a/src/languages/es.ts b/src/languages/es.ts index 981f684f7896..a9a904cdcc27 100644 --- a/src/languages/es.ts +++ b/src/languages/es.ts @@ -659,7 +659,7 @@ const translations = { beginningOfChatHistoryAnnounceRoomPartOne: ({workspaceName}: BeginningOfChatHistoryAnnounceRoomPartOneParams) => `Este chat es con todos en el espacio de trabajo ${workspaceName}.`, beginningOfChatHistoryAnnounceRoomPartTwo: ` Úsalo para hablar sobre la configuración del espacio de trabajo y más.`, beginningOfChatHistoryUserRoomPartOne: 'ste chat es para todo lo relacionado con ', - beginningOfChatHistoryUserRoomPartTwo: ({displayName}: {displayName: string}) => ` Fue creado por ${displayName}.`, + beginningOfChatHistoryUserRoomPartTwo: ' Fue creado por.', beginningOfChatHistoryInvoiceRoomPartOne: `Este chat es para facturas entre `, beginningOfChatHistoryInvoiceRoomPartTwo: `. Usa el botón + para enviar una factura.`, beginningOfChatHistory: 'Este chat es con', diff --git a/src/libs/SidebarUtils.ts b/src/libs/SidebarUtils.ts index 1ad23b64255a..46af583aad87 100644 --- a/src/libs/SidebarUtils.ts +++ b/src/libs/SidebarUtils.ts @@ -613,7 +613,7 @@ function getRoomWelcomeMessage(report: OnyxEntry): WelcomeMessage { } else { // Message for user created rooms or other room types. welcomeMessage.phrase1 = Localize.translateLocal('reportActionsView.beginningOfChatHistoryUserRoomPartOne'); - welcomeMessage.phrase2 = Localize.translateLocal('reportActionsView.beginningOfChatHistoryUserRoomPartTwo', {displayName: ReportUtils.getPolicyName(report)}); + welcomeMessage.phrase2 = Localize.translateLocal('reportActionsView.beginningOfChatHistoryUserRoomPartTwo'); } welcomeMessage.messageText = `${welcomeMessage.phrase1} ${welcomeMessage.showReportName ? ReportUtils.getReportName(report) : ''} ${welcomeMessage.phrase2 ?? ''}`; From 346359ec2ee6304b39f0146ebc3bb87a59b3efbb Mon Sep 17 00:00:00 2001 From: rory Date: Thu, 3 Oct 2024 13:41:05 -0700 Subject: [PATCH 514/555] Correctly expand provisioningProfile variable --- .github/workflows/buildIOS.yml | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/.github/workflows/buildIOS.yml b/.github/workflows/buildIOS.yml index 7531be2da07e..224ea5c13b43 100644 --- a/.github/workflows/buildIOS.yml +++ b/.github/workflows/buildIOS.yml @@ -102,10 +102,8 @@ jobs: provisioningProfile='NewApp_AdHoc' fi echo "Using provisioning profile: $provisioningProfile" - ls - ls | grep "$provisioningProfile.mobileprovision.gpg" gpg --quiet --batch --yes --decrypt --passphrase="$LARGE_SECRET_PASSPHRASE" --output "$provisioningProfile.mobileprovision" "$provisioningProfile.mobileprovision.gpg" - gpg --quiet --batch --yes --decrypt --passphrase="$LARGE_SECRET_PASSPHRASE" --output "$provisioningProfile_Notification_Service.mobileprovision" "$provisioningProfile_Notification_Service.mobileprovision.gpg" + gpg --quiet --batch --yes --decrypt --passphrase="$LARGE_SECRET_PASSPHRASE" --output "${provisioningProfile}_Notification_Service.mobileprovision" "${provisioningProfile}_Notification_Service.mobileprovision.gpg" env: LARGE_SECRET_PASSPHRASE: ${{ secrets.LARGE_SECRET_PASSPHRASE }} From bee898ecab7cd38f448814ce367850c7fe4fcfa0 Mon Sep 17 00:00:00 2001 From: OSBotify Date: Thu, 3 Oct 2024 20:45:01 +0000 Subject: [PATCH 515/555] Update version to 9.0.44-5 --- android/app/build.gradle | 4 ++-- ios/NewExpensify/Info.plist | 2 +- ios/NewExpensifyTests/Info.plist | 2 +- ios/NotificationServiceExtension/Info.plist | 2 +- package-lock.json | 4 ++-- package.json | 2 +- 6 files changed, 8 insertions(+), 8 deletions(-) diff --git a/android/app/build.gradle b/android/app/build.gradle index 69851ec13ab1..6c841deb6134 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -110,8 +110,8 @@ android { minSdkVersion rootProject.ext.minSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion multiDexEnabled rootProject.ext.multiDexEnabled - versionCode 1009004404 - versionName "9.0.44-4" + versionCode 1009004405 + versionName "9.0.44-5" // Supported language variants must be declared here to avoid from being removed during the compilation. // This also helps us to not include unnecessary language variants in the APK. resConfigs "en", "es" diff --git a/ios/NewExpensify/Info.plist b/ios/NewExpensify/Info.plist index e302120978d0..d5a1c6c89eb2 100644 --- a/ios/NewExpensify/Info.plist +++ b/ios/NewExpensify/Info.plist @@ -40,7 +40,7 @@ CFBundleVersion - 9.0.44.4 + 9.0.44.5 FullStory OrgId diff --git a/ios/NewExpensifyTests/Info.plist b/ios/NewExpensifyTests/Info.plist index b6ac34731514..efd56d4158ad 100644 --- a/ios/NewExpensifyTests/Info.plist +++ b/ios/NewExpensifyTests/Info.plist @@ -19,6 +19,6 @@ CFBundleSignature ???? CFBundleVersion - 9.0.44.4 + 9.0.44.5 diff --git a/ios/NotificationServiceExtension/Info.plist b/ios/NotificationServiceExtension/Info.plist index 36c32f81ad83..ca722180a852 100644 --- a/ios/NotificationServiceExtension/Info.plist +++ b/ios/NotificationServiceExtension/Info.plist @@ -13,7 +13,7 @@ CFBundleShortVersionString 9.0.44 CFBundleVersion - 9.0.44.4 + 9.0.44.5 NSExtension NSExtensionPointIdentifier diff --git a/package-lock.json b/package-lock.json index 4fed0c0e8d09..1a7ab1222066 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "new.expensify", - "version": "9.0.44-4", + "version": "9.0.44-5", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "new.expensify", - "version": "9.0.44-4", + "version": "9.0.44-5", "hasInstallScript": true, "license": "MIT", "dependencies": { diff --git a/package.json b/package.json index 66e869417068..df9f9a185770 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "new.expensify", - "version": "9.0.44-4", + "version": "9.0.44-5", "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.", From c375e41a119dff8bcee55b7f6e4cc314ae90b97b Mon Sep 17 00:00:00 2001 From: rory Date: Thu, 3 Oct 2024 13:54:35 -0700 Subject: [PATCH 516/555] Use keystore in build job, json key in upload job --- .github/workflows/buildAndroid.yml | 8 +++----- .github/workflows/deploy.yml | 4 ++++ 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/.github/workflows/buildAndroid.yml b/.github/workflows/buildAndroid.yml index a8023aebd359..c91a9fbc91b8 100644 --- a/.github/workflows/buildAndroid.yml +++ b/.github/workflows/buildAndroid.yml @@ -83,11 +83,9 @@ jobs: with: bundler-cache: true - - name: Decrypt keystore and json key - run: | - cd android/app - gpg --batch --yes --decrypt --passphrase="${{ secrets.LARGE_SECRET_PASSPHRASE }}" --output my-upload-key.keystore my-upload-key.keystore.gpg - gpg --batch --yes --decrypt --passphrase="${{ secrets.LARGE_SECRET_PASSPHRASE }}" --output android-fastlane-json-key.json android-fastlane-json-key.json.gpg + - name: Decrypt keystore to sign the APK/AAB + run: gpg --batch --yes --decrypt --passphrase="${{ secrets.LARGE_SECRET_PASSPHRASE }}" --output my-upload-key.keystore my-upload-key.keystore.gpg + working-directory: android/app - name: Get package version id: getPackageVersion diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 60bb97b0c2e7..555e7650193c 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -102,6 +102,10 @@ jobs: - name: Log downloaded artifact paths run: ls -R /tmp/artifacts + - name: Decrypt json w/ Google Play credentials + run: gpg --batch --yes --decrypt --passphrase="${{ secrets.LARGE_SECRET_PASSPHRASE }}" --output android-fastlane-json-key.json android-fastlane-json-key.json.gpg + working-directory: android/app + - name: Upload Android app to Google Play run: bundle exec fastlane android upload_google_play_internal env: From 188789aee3b346de32987c5a9e3553e5328b97f6 Mon Sep 17 00:00:00 2001 From: OSBotify Date: Thu, 3 Oct 2024 21:13:05 +0000 Subject: [PATCH 517/555] Update version to 9.0.44-6 --- android/app/build.gradle | 4 ++-- ios/NewExpensify/Info.plist | 2 +- ios/NewExpensifyTests/Info.plist | 2 +- ios/NotificationServiceExtension/Info.plist | 2 +- package-lock.json | 4 ++-- package.json | 2 +- 6 files changed, 8 insertions(+), 8 deletions(-) diff --git a/android/app/build.gradle b/android/app/build.gradle index 6c841deb6134..ec2f96342f00 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -110,8 +110,8 @@ android { minSdkVersion rootProject.ext.minSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion multiDexEnabled rootProject.ext.multiDexEnabled - versionCode 1009004405 - versionName "9.0.44-5" + versionCode 1009004406 + versionName "9.0.44-6" // Supported language variants must be declared here to avoid from being removed during the compilation. // This also helps us to not include unnecessary language variants in the APK. resConfigs "en", "es" diff --git a/ios/NewExpensify/Info.plist b/ios/NewExpensify/Info.plist index d5a1c6c89eb2..67b9450aaaf0 100644 --- a/ios/NewExpensify/Info.plist +++ b/ios/NewExpensify/Info.plist @@ -40,7 +40,7 @@ CFBundleVersion - 9.0.44.5 + 9.0.44.6 FullStory OrgId diff --git a/ios/NewExpensifyTests/Info.plist b/ios/NewExpensifyTests/Info.plist index efd56d4158ad..3c589e6aaf89 100644 --- a/ios/NewExpensifyTests/Info.plist +++ b/ios/NewExpensifyTests/Info.plist @@ -19,6 +19,6 @@ CFBundleSignature ???? CFBundleVersion - 9.0.44.5 + 9.0.44.6 diff --git a/ios/NotificationServiceExtension/Info.plist b/ios/NotificationServiceExtension/Info.plist index ca722180a852..7dfcb4ad23f9 100644 --- a/ios/NotificationServiceExtension/Info.plist +++ b/ios/NotificationServiceExtension/Info.plist @@ -13,7 +13,7 @@ CFBundleShortVersionString 9.0.44 CFBundleVersion - 9.0.44.5 + 9.0.44.6 NSExtension NSExtensionPointIdentifier diff --git a/package-lock.json b/package-lock.json index 1a7ab1222066..4f26472d761a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "new.expensify", - "version": "9.0.44-5", + "version": "9.0.44-6", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "new.expensify", - "version": "9.0.44-5", + "version": "9.0.44-6", "hasInstallScript": true, "license": "MIT", "dependencies": { diff --git a/package.json b/package.json index df9f9a185770..a74d9e234b66 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "new.expensify", - "version": "9.0.44-5", + "version": "9.0.44-6", "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.", From d4bf58a1cb9f77211fc101b5cf2b80e131aa9880 Mon Sep 17 00:00:00 2001 From: rory Date: Thu, 3 Oct 2024 15:18:29 -0700 Subject: [PATCH 518/555] Remove spaces from .ipa file names --- fastlane/Fastfile | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/fastlane/Fastfile b/fastlane/Fastfile index c5c9de8cc9a7..3da12a244c29 100644 --- a/fastlane/Fastfile +++ b/fastlane/Fastfile @@ -216,7 +216,7 @@ platform :ios do build_app( workspace: "./ios/NewExpensify.xcworkspace", scheme: "New Expensify", - output_name: "New Expensify.ipa", + output_name: "NewExpensify.ipa", export_options: { provisioningProfiles: { "com.chat.expensify.chat" => "(NewApp) AppStore", @@ -257,6 +257,7 @@ platform :ios do workspace: "./ios/NewExpensify.xcworkspace", skip_profile_detection: true, scheme: "New Expensify AdHoc", + output_name: "NewExpensify_AdHoc.ipa" export_method: "ad-hoc", export_options: { method: "ad-hoc", From d0126f47e63f3818c2732e05d4c53d16aa4e9094 Mon Sep 17 00:00:00 2001 From: rory Date: Thu, 3 Oct 2024 15:32:59 -0700 Subject: [PATCH 519/555] Fix typo in Fastfile --- fastlane/Fastfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fastlane/Fastfile b/fastlane/Fastfile index 3da12a244c29..1a7499a2a2c3 100644 --- a/fastlane/Fastfile +++ b/fastlane/Fastfile @@ -257,7 +257,7 @@ platform :ios do workspace: "./ios/NewExpensify.xcworkspace", skip_profile_detection: true, scheme: "New Expensify AdHoc", - output_name: "NewExpensify_AdHoc.ipa" + output_name: "NewExpensify_AdHoc.ipa", export_method: "ad-hoc", export_options: { method: "ad-hoc", From 66e9d0a585a5e4d6613ca6bbd34ae3a60ca9b931 Mon Sep 17 00:00:00 2001 From: OSBotify Date: Thu, 3 Oct 2024 22:43:17 +0000 Subject: [PATCH 520/555] Update version to 9.0.44-7 --- android/app/build.gradle | 4 ++-- ios/NewExpensify/Info.plist | 2 +- ios/NewExpensifyTests/Info.plist | 2 +- ios/NotificationServiceExtension/Info.plist | 2 +- package-lock.json | 4 ++-- package.json | 2 +- 6 files changed, 8 insertions(+), 8 deletions(-) diff --git a/android/app/build.gradle b/android/app/build.gradle index ec2f96342f00..ffb5d947ad5d 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -110,8 +110,8 @@ android { minSdkVersion rootProject.ext.minSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion multiDexEnabled rootProject.ext.multiDexEnabled - versionCode 1009004406 - versionName "9.0.44-6" + versionCode 1009004407 + versionName "9.0.44-7" // Supported language variants must be declared here to avoid from being removed during the compilation. // This also helps us to not include unnecessary language variants in the APK. resConfigs "en", "es" diff --git a/ios/NewExpensify/Info.plist b/ios/NewExpensify/Info.plist index 67b9450aaaf0..4c4dbfec0357 100644 --- a/ios/NewExpensify/Info.plist +++ b/ios/NewExpensify/Info.plist @@ -40,7 +40,7 @@ CFBundleVersion - 9.0.44.6 + 9.0.44.7 FullStory OrgId diff --git a/ios/NewExpensifyTests/Info.plist b/ios/NewExpensifyTests/Info.plist index 3c589e6aaf89..1c3122b15d77 100644 --- a/ios/NewExpensifyTests/Info.plist +++ b/ios/NewExpensifyTests/Info.plist @@ -19,6 +19,6 @@ CFBundleSignature ???? CFBundleVersion - 9.0.44.6 + 9.0.44.7 diff --git a/ios/NotificationServiceExtension/Info.plist b/ios/NotificationServiceExtension/Info.plist index 7dfcb4ad23f9..f538738c96d4 100644 --- a/ios/NotificationServiceExtension/Info.plist +++ b/ios/NotificationServiceExtension/Info.plist @@ -13,7 +13,7 @@ CFBundleShortVersionString 9.0.44 CFBundleVersion - 9.0.44.6 + 9.0.44.7 NSExtension NSExtensionPointIdentifier diff --git a/package-lock.json b/package-lock.json index 4f26472d761a..91525c2ba5f1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "new.expensify", - "version": "9.0.44-6", + "version": "9.0.44-7", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "new.expensify", - "version": "9.0.44-6", + "version": "9.0.44-7", "hasInstallScript": true, "license": "MIT", "dependencies": { diff --git a/package.json b/package.json index a74d9e234b66..52eefdc8e666 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "new.expensify", - "version": "9.0.44-6", + "version": "9.0.44-7", "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.", From 1a100d18d30bce629afe2a7be6756b098588761f Mon Sep 17 00:00:00 2001 From: rory Date: Thu, 3 Oct 2024 15:59:05 -0700 Subject: [PATCH 521/555] dsym not dysm --- .github/workflows/buildIOS.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/buildIOS.yml b/.github/workflows/buildIOS.yml index 224ea5c13b43..644770fa198d 100644 --- a/.github/workflows/buildIOS.yml +++ b/.github/workflows/buildIOS.yml @@ -112,7 +112,7 @@ jobs: env: LARGE_SECRET_PASSPHRASE: ${{ secrets.LARGE_SECRET_PASSPHRASE }} - - name: Build iOS release app + - name: Build iOS ${{ inputs.type }} app id: build run: | lane='' @@ -132,8 +132,8 @@ jobs: # ipaPath and dsymPath are environment variables set within the Fastfile echo "IPA_PATH=$ipaPath" echo "IPA_FILE_NAME=$(basename "$ipaPath")" - echo "DYSM_PATH=$dysmPath" - echo "DSYM_FILE_NAME=$(basename "$dysmPath")" + echo "DSYM_PATH=$dsymPath" + echo "DSYM_FILE_NAME=$(basename "$dsymPath")" } >> "$GITHUB_OUTPUT" - name: Upload iOS build artifact @@ -146,7 +146,7 @@ jobs: uses: actions/upload-artifact@v4 with: name: ios-artifact-dsym - path: ${{ steps.build.outputs.DYSM_PATH }} + path: ${{ steps.build.outputs.DSYM_PATH }} - name: Announce failure in slack if: failure() From 1fe800af1c2fd4904ff2a5037aacc2830688ec12 Mon Sep 17 00:00:00 2001 From: rory Date: Thu, 3 Oct 2024 16:17:33 -0700 Subject: [PATCH 522/555] Don't announce AdHoc build failures in slack --- .github/workflows/buildAndroid.yml | 6 ------ 1 file changed, 6 deletions(-) diff --git a/.github/workflows/buildAndroid.yml b/.github/workflows/buildAndroid.yml index c91a9fbc91b8..403a40214b40 100644 --- a/.github/workflows/buildAndroid.yml +++ b/.github/workflows/buildAndroid.yml @@ -178,9 +178,3 @@ jobs: with: name: ${{ inputs.artifact-prefix }}android-artifact-sourcemaps path: ./android/app/build/generated/sourcemaps/react/productionRelease/index.android.bundle.map - - - name: Announce failure in slack - if: failure() - uses: ./.github/actions/composite/announceFailedWorkflowInSlack - with: - SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK }} From c0bd14599ec6395cd5c082e3f01b653017ae933b Mon Sep 17 00:00:00 2001 From: rory Date: Thu, 3 Oct 2024 16:31:37 -0700 Subject: [PATCH 523/555] Don't announce failed ios build --- .github/workflows/buildIOS.yml | 6 ------ 1 file changed, 6 deletions(-) diff --git a/.github/workflows/buildIOS.yml b/.github/workflows/buildIOS.yml index 644770fa198d..044982fb8a87 100644 --- a/.github/workflows/buildIOS.yml +++ b/.github/workflows/buildIOS.yml @@ -147,9 +147,3 @@ jobs: with: name: ios-artifact-dsym path: ${{ steps.build.outputs.DSYM_PATH }} - - - name: Announce failure in slack - if: failure() - uses: ./.github/actions/composite/announceFailedWorkflowInSlack - with: - SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK }} From adbc4b2c43b981db63b8860198922a3ffe5f3f1e Mon Sep 17 00:00:00 2001 From: rory Date: Thu, 3 Oct 2024 16:32:52 -0700 Subject: [PATCH 524/555] Upload jsbundle sourcemaps --- .github/workflows/buildIOS.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.github/workflows/buildIOS.yml b/.github/workflows/buildIOS.yml index 044982fb8a87..7ebafd59af2e 100644 --- a/.github/workflows/buildIOS.yml +++ b/.github/workflows/buildIOS.yml @@ -147,3 +147,9 @@ jobs: with: name: ios-artifact-dsym path: ${{ steps.build.outputs.DSYM_PATH }} + + - name: Upload iOS sourcemaps + uses: actions/upload-artifact@v4 + with: + name: ios-sourcemaps-artifact + path: ./main.jsbundle.map From bcb43d5b010a3845ab097b461d1aa0fe3b9fdeb5 Mon Sep 17 00:00:00 2001 From: rory Date: Thu, 3 Oct 2024 16:49:20 -0700 Subject: [PATCH 525/555] Fix ipa path --- .github/workflows/deploy.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index df98d7332c77..c9aadf169c14 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -496,7 +496,7 @@ jobs: ./desktop-staging-sourcemaps-artifact/desktop-staging-merged-source-map.js.map#desktop-staging-sourcemap-${{ needs.prep.outputs.APP_VERSION }} \ ./desktop-staging-build-artifact/NewExpensify.dmg#NewExpensifyStaging.dmg \ ./ios-sourcemaps-artifact/main.jsbundle.map#ios-sourcemap-${{ needs.prep.outputs.APP_VERSION }} \ - ./ios-build-artifact/New\ Expensify.ipa \ + ./ios-build-artifact/NewExpensify.ipa \ ./web-staging-sourcemaps-artifact/web-staging-merged-source-map.js.map#web-staging-sourcemap-${{ needs.prep.outputs.APP_VERSION }} \ ./web-staging-build-tar-gz-artifact/webBuild.tar.gz#stagingWebBuild.tar.gz \ ./web-staging-build-zip-artifact/webBuild.zip#stagingWebBuild.zip From 0e59102cd4e161de676aa661664d82df446e63cd Mon Sep 17 00:00:00 2001 From: rory Date: Thu, 3 Oct 2024 16:55:45 -0700 Subject: [PATCH 526/555] Standardize and fix workflow artifacts, correctly upload to release --- .github/workflows/buildIOS.yml | 2 +- .github/workflows/deploy.yml | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/buildIOS.yml b/.github/workflows/buildIOS.yml index 7ebafd59af2e..2386d01da793 100644 --- a/.github/workflows/buildIOS.yml +++ b/.github/workflows/buildIOS.yml @@ -151,5 +151,5 @@ jobs: - name: Upload iOS sourcemaps uses: actions/upload-artifact@v4 with: - name: ios-sourcemaps-artifact + name: ios-artifact-sourcemaps path: ./main.jsbundle.map diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index c9aadf169c14..057fdbfd6256 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -464,7 +464,7 @@ jobs: createPrerelease: runs-on: ubuntu-latest if: ${{ always() && github.ref == 'refs/heads/staging' && fromJSON(needs.checkDeploymentSuccess.outputs.IS_AT_LEAST_ONE_PLATFORM_DEPLOYED) }} - needs: [prep, checkDeploymentSuccess] + needs: [prep, checkDeploymentSuccess, buildAndroid, buildIOS] steps: - name: Download all workflow run artifacts uses: actions/download-artifact@v4 @@ -491,12 +491,12 @@ jobs: continue-on-error: true run: | gh release upload ${{ needs.prep.outputs.APP_VERSION }} --repo ${{ github.repository }} --clobber \ - ./android-sourcemaps-artifact/index.android.bundle.map#android-sourcemap-${{ needs.prep.outputs.APP_VERSION }} \ - ./android-build-artifact/app-production-release.aab \ + ./android-artifact-sourcemaps/index.android.bundle.map#android-sourcemap-${{ needs.prep.outputs.APP_VERSION }} \ + ./android-artifact-aab/${{ needs.buildAndroid.outputs.AAB_FILE_NAME }} \ ./desktop-staging-sourcemaps-artifact/desktop-staging-merged-source-map.js.map#desktop-staging-sourcemap-${{ needs.prep.outputs.APP_VERSION }} \ ./desktop-staging-build-artifact/NewExpensify.dmg#NewExpensifyStaging.dmg \ - ./ios-sourcemaps-artifact/main.jsbundle.map#ios-sourcemap-${{ needs.prep.outputs.APP_VERSION }} \ - ./ios-build-artifact/NewExpensify.ipa \ + ./ios-artifact-sourcemaps/main.jsbundle.map#ios-sourcemap-${{ needs.prep.outputs.APP_VERSION }} \ + ./ios-artifact-ipa/${{ needs.buildIOS.outputs.IPA_FILE_NAME }} \ ./web-staging-sourcemaps-artifact/web-staging-merged-source-map.js.map#web-staging-sourcemap-${{ needs.prep.outputs.APP_VERSION }} \ ./web-staging-build-tar-gz-artifact/webBuild.tar.gz#stagingWebBuild.tar.gz \ ./web-staging-build-zip-artifact/webBuild.zip#stagingWebBuild.zip From 821edc51788b616e323cae0dc00f4b0aa7246766 Mon Sep 17 00:00:00 2001 From: OSBotify Date: Fri, 4 Oct 2024 00:12:34 +0000 Subject: [PATCH 527/555] Update version to 9.0.44-8 --- android/app/build.gradle | 4 ++-- ios/NewExpensify/Info.plist | 2 +- ios/NewExpensifyTests/Info.plist | 2 +- ios/NotificationServiceExtension/Info.plist | 2 +- package-lock.json | 4 ++-- package.json | 2 +- 6 files changed, 8 insertions(+), 8 deletions(-) diff --git a/android/app/build.gradle b/android/app/build.gradle index ffb5d947ad5d..870f9d81e108 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -110,8 +110,8 @@ android { minSdkVersion rootProject.ext.minSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion multiDexEnabled rootProject.ext.multiDexEnabled - versionCode 1009004407 - versionName "9.0.44-7" + versionCode 1009004408 + versionName "9.0.44-8" // Supported language variants must be declared here to avoid from being removed during the compilation. // This also helps us to not include unnecessary language variants in the APK. resConfigs "en", "es" diff --git a/ios/NewExpensify/Info.plist b/ios/NewExpensify/Info.plist index 4c4dbfec0357..51caecb7c81a 100644 --- a/ios/NewExpensify/Info.plist +++ b/ios/NewExpensify/Info.plist @@ -40,7 +40,7 @@ CFBundleVersion - 9.0.44.7 + 9.0.44.8 FullStory OrgId diff --git a/ios/NewExpensifyTests/Info.plist b/ios/NewExpensifyTests/Info.plist index 1c3122b15d77..c2ee6978f322 100644 --- a/ios/NewExpensifyTests/Info.plist +++ b/ios/NewExpensifyTests/Info.plist @@ -19,6 +19,6 @@ CFBundleSignature ???? CFBundleVersion - 9.0.44.7 + 9.0.44.8 diff --git a/ios/NotificationServiceExtension/Info.plist b/ios/NotificationServiceExtension/Info.plist index f538738c96d4..1f812f0eff46 100644 --- a/ios/NotificationServiceExtension/Info.plist +++ b/ios/NotificationServiceExtension/Info.plist @@ -13,7 +13,7 @@ CFBundleShortVersionString 9.0.44 CFBundleVersion - 9.0.44.7 + 9.0.44.8 NSExtension NSExtensionPointIdentifier diff --git a/package-lock.json b/package-lock.json index 91525c2ba5f1..cf9978bae510 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "new.expensify", - "version": "9.0.44-7", + "version": "9.0.44-8", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "new.expensify", - "version": "9.0.44-7", + "version": "9.0.44-8", "hasInstallScript": true, "license": "MIT", "dependencies": { diff --git a/package.json b/package.json index 52eefdc8e666..baf05e92111b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "new.expensify", - "version": "9.0.44-7", + "version": "9.0.44-8", "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.", From 9c02026b4f31953f36d02a8304e60fae9b18fe3f Mon Sep 17 00:00:00 2001 From: I Nyoman Jyotisa Date: Fri, 4 Oct 2024 09:09:52 +0800 Subject: [PATCH 528/555] Add clear button to saved search name field --- src/pages/Search/SavedSearchRenamePage.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/src/pages/Search/SavedSearchRenamePage.tsx b/src/pages/Search/SavedSearchRenamePage.tsx index d2643591ebbf..00180cd5de7f 100644 --- a/src/pages/Search/SavedSearchRenamePage.tsx +++ b/src/pages/Search/SavedSearchRenamePage.tsx @@ -68,6 +68,7 @@ function SavedSearchRenamePage({route}: {route: {params: {q: string; name: strin onChangeText={(renamedName) => setNewName(renamedName)} ref={inputCallbackRef} defaultValue={name} + shouldShowClearButton /> From 771611147a3d2df5f3ed3a41df43dee5d927ef80 Mon Sep 17 00:00:00 2001 From: Sasha Kluger Date: Thu, 3 Oct 2024 22:26:27 -0700 Subject: [PATCH 529/555] Fixed formatting and corrected plan availability info There were some formatting inconsistencies - I fixed them according to the style guide here: https://stackoverflowteams.com/c/expensify/questions/17353 Also, tax tracking is available on Collect and Control plans, so I updated the doc accordingly. --- .../articles/new-expensify/workspaces/Track-taxes.md | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/docs/articles/new-expensify/workspaces/Track-taxes.md b/docs/articles/new-expensify/workspaces/Track-taxes.md index fb4077679350..a8ea82873b9e 100644 --- a/docs/articles/new-expensify/workspaces/Track-taxes.md +++ b/docs/articles/new-expensify/workspaces/Track-taxes.md @@ -4,15 +4,13 @@ description: Set up tax rates in your Expensify workspace ---
-# Track taxes - Each Expensify workspace can be configured with one or more tax rates. Once tax rates are enabled on your workspace, all expenses will have a default tax rate applied based on the currency, and employees will be able to select the correct tax rate for each expense. -Tax rates are only available on the Control plan. Collect plan users will need to upgrade to Control for access to tag tax codes. +Tax rates are available on Collect and Control plans. -## Enable taxes on a workspace +# Enable taxes on a workspace -Tax codes are only available on the Control plan. Taxes can be enabled on any workspace where the default currency is not USD. Please note that if you have a direct accounting integration, tax rates will be managed through the integration and cannot be manually enabled or disabled using the instructions below. +Taxes can be enabled on any workspace where the default currency is not USD. Please note that if you have a direct accounting integration, tax rates will be managed through the integration and cannot be manually enabled or disabled using the instructions below. **To enable taxes on your workspace:** @@ -24,7 +22,7 @@ Tax codes are only available on the Control plan. Taxes can be enabled on any wo After toggling on taxes, you will see a new **Taxes** option in the left menu. -## Manually add, delete, or edit tax rates +# Manually add, delete, or edit tax rates **To manually add a tax rate:** @@ -53,7 +51,7 @@ Please note: The workspace currency default rate cannot be deleted or disabled. Please note: The workspace currency default rate cannot be deleted or disabled. -## Change the default tax rates +# Change the default tax rates After enabling taxes in your workspace, you can set two default rates: From 0de93f4129fc6a5a9def2f028fe81402a53c8f38 Mon Sep 17 00:00:00 2001 From: Sasha Kluger Date: Thu, 3 Oct 2024 22:57:33 -0700 Subject: [PATCH 530/555] Fix formatting in Configure-Sage-Intacct.md --- .../sage-intacct/Configure-Sage-Intacct.md | 39 +++++++++---------- 1 file changed, 19 insertions(+), 20 deletions(-) diff --git a/docs/articles/new-expensify/connections/sage-intacct/Configure-Sage-Intacct.md b/docs/articles/new-expensify/connections/sage-intacct/Configure-Sage-Intacct.md index 28cdc71ed80f..d5bc3ee20000 100644 --- a/docs/articles/new-expensify/connections/sage-intacct/Configure-Sage-Intacct.md +++ b/docs/articles/new-expensify/connections/sage-intacct/Configure-Sage-Intacct.md @@ -4,17 +4,16 @@ description: Configure the Import, Export, and Advanced settings for Expensify's order: 3 --- -# Configure Sage Intacct integration -## Step 1: Select entity (multi-entity setups only) +# Step 1: Select entity (multi-entity setups only) If you have a multi-entity setup in Sage Intacct, you will be able to select in Expensify which Sage Intacct entity to connect each workspace to. Each Expensify workspace can either be connected to a single entity or connected at the Top Level. To select or change the Sage Intacct entity that your Expensify workspace is connected to, navigate to the Accounting settings for your workspace and click **Entity** under the Sage Intacct connection. -## Step 2: Configure import settings +# Step 2: Configure import settings The following section will help you determine how data will be imported from Sage Intacct into Expensify. To change your import settings, navigate to the Accounting settings for your workspace, then click **Import** under the Sage Intacct connection. -### Expense Types / Chart of Accounts +## Expense Types / Chart of Accounts The categories in Expensify depend on how you choose to export out-of-pocket expenses: - If you choose to export out-of-pocket expenses as Expense Reports, your categories in Expensify will be imported from your Sage Intacct Expense Types @@ -22,13 +21,13 @@ The categories in Expensify depend on how you choose to export out-of-pocket exp You can disable unnecessary categories in Expensify by going to **Settings > Workspaces > [Workspace Name] > Categories**. Note that every expense must be coded with a Category, or it will fail to export. -### Billable Expenses +## Billable Expenses Enabling billable expenses allows you to map your expense types or accounts to items in Sage Intacct. To do this, you’ll need to enable the correct permissions on your Sage Intacct user or role. This may vary based on the modules you use in Sage Intacct, so you should enable read-only permissions for relevant modules such as Projects, Purchasing, Inventory Control, and Order Entry. Once permissions are set, you can map categories to specific items, which will then export to Sage Intacct. When an expense is marked as Billable in Expensify, users must select the correct billable Category (Item), or there will be an error during export. -### Standard dimensions: Departments, Classes, and Locations +## Standard dimensions: Departments, Classes, and Locations The Sage Intacct integration allows you to import standard dimensions into Expensify as tags, report fields, or using the Sage Intacct employee default. - **Sage Intacct Employee default:** This option is only available when exporting as expense reports. When this option is selected, nothing will be imported into Expensify - instead, the employee default will be applied to each expense upon export. @@ -39,7 +38,7 @@ New departments, classes, and locations must be added in Sage Intacct. Once impo Please note that when importing departments as tags, expense reports may show the tag name as "Tag" instead of "Department." -### Customers and Projects +## Customers and Projects The Sage Intacct integration allows you to import customers and projects into Expensify as Tags or Report Fields. - **Tags:** Employees can select the customer or project on each individual expense. @@ -48,12 +47,12 @@ The Sage Intacct integration allows you to import customers and projects into Ex New customers and projects must be added in Sage Intacct. Once imported, you can turn specific tags on or off under **Settings > Workspaces > [Workspace Name] > Tags**. You can turn specific report fields on or off under **Settings > Workspaces > [Workspace Name] > Report Fields**. -### Tax +## Tax The Sage Intacct integration supports native VAT and GST tax. To enable this feature, go to **Settings > Workspaces > [Workspace Name] > Accounting**, click **Import** under Sage Intacct, and enable Tax. Enabling this option will import your native tax rates from Sage Intacct into Expensify. From there, you can select default rates for each category under **Settings > Workspaces > [Workspace Name] > Categories**. For older Sage Intacct connections that don't show the Tax option, simply resync the connection by going to **Settings > Workspaces > [Workspace Name] > Accounting** and clicking the three dots next to Sage Intacct, and the tax toggle will appear. -### User-Defined Dimensions +## User-Defined Dimensions You can add User-Defined Dimensions (UDDs) to your workspace by locating the “Integration Name” in Sage Intacct. Please note that you must be logged in as an administrator in Sage Intacct to find the required fields. To find the Integration Name in Sage Intacct: @@ -68,23 +67,23 @@ To find the Integration Name in Sage Intacct: Once imported, you can turn specific tags on or off under **Settings > Workspaces > [Workspace Name] > Tags**. You can turn specific report fields on or off under **Settings > Workspaces > [Workspace Name] > Report Fields**. -## Step 5: Configure export settings +# Step 3: Configure export settings To access export settings, head to **Settings > Workspaces > [Workspace name] > Accounting** and click **Export** under Sage Intacct. -### Preferred exporter +## Preferred exporter Any workspace admin can export reports to Sage Intacct. For auto-export, Concierge will export on behalf of the preferred exporter. The preferred exporter will also be notified of any expense reports that fail to export to Sage Intacct due to an error. -### Export date +## Export date You can choose which date to use for the records created in Sage Intacct. There are three date options: 1. **Date of last expense:** This will use the date of the previous expense on the report 1. **Export date:** The date you export the report to Sage Intacct 1. **Submitted date:** The date the employee submitted the report -### Export out-of-pocket expenses as +## Export out-of-pocket expenses as Out-of-pocket expenses can be exported to Sage Intacct as **expense reports** or as **vendor bills**. If you choose to export as expense reports, you can optionally select a **default vendor**, which will apply to reimbursable expenses that don't have a matching vendor in Sage Intacct. -### Export company card expenses as +## Export company card expenses as Company Card expenses are exported separately from out-of-pocket expenses, and can be exported to Sage Intacct as credit card charges** or as **vendor bills**. - **Credit card charges:** When exporting as credit card charges, you must select a credit card account. You can optionally select a default vendor, which will apply to company card expenses that don't have a matching vendor in Sage Intacct. @@ -93,13 +92,13 @@ Company Card expenses are exported separately from out-of-pocket expenses, and c If you centrally manage your company cards through Domains in Expensify Classic, you can export expenses from each individual card to a specific account in Sage Intacct in the Expensify Company Card settings. -### 6. Configure advanced settings +# Step 4: Configure advanced settings To access the advanced settings of the Sage Intacct integration, head to **Settings > Workspaces > [Workspace name] > Accounting** and click **Advanced** under Sage Intacct. Let’s review the different advanced settings and how they interact with the integration. -### Auto-sync +## Auto-sync We strongly recommend enabling auto-sync to ensure that the information in Sage Intacct and Expensify is always in sync. The following will occur when auto-sync is enabled: **Daily sync from Sage Intacct to Expensify:** Once a day, Expensify will sync any changes from Sage Intacct into Expensify. This includes any changes or additions to your Sage Intacct dimensions. @@ -108,7 +107,7 @@ We strongly recommend enabling auto-sync to ensure that the information in Sage **Reimbursement-sync:** If Sync Reimbursed Reports (more details below) is enabled, then we will sync the reimbursement status of reports between Expensify and Sage Intacct. -### Invite employees +## Invite employees Enabling this feature will invite all employees from the connected Sage Intacct entity to your Expensify workspace. Once imported, each employee who has not already been invited to that Expensify workspace will receive an email letting them know they’ve been added to the workspace. In addition to inviting employees, this feature enables a custom set of approval workflow options, which you can manage in Expensify Classic: @@ -118,7 +117,7 @@ In addition to inviting employees, this feature enables a custom set of approval - **Configure Manually:** Employees will be imported, but all levels of approval must be manually configured in Expensify. If you enable this setting, you can configure approvals by going to **Settings > Workspaces > [Workspace Name] > People**. -### Sync reimbursed reports +## Sync reimbursed reports When Sync reimbursed reports is enabled, the reimbursement status will be synced between Expensify and Sage Intacct. **If you reimburse employees through Expensify:** Reimbursing an expense report will trigger auto-export to Sage Intacct. When the expense report is exported to Sage Intacct, a corresponding bill payment will also be created in Sage Intacct in the selected Cash and Cash Equivalents account. If you don't see the account you'd like to select in the dropdown list, please confirm that the account type is Cash and Cash Equivalents. @@ -127,7 +126,7 @@ When Sync reimbursed reports is enabled, the reimbursement status will be synced To ensure this feature works properly for expense reports, make sure that the account you choose within the settings matches the default account for Bill Payments in NetSuite. When exporting invoices, once marked as Paid, the payment is marked against the account selected after enabling the Collection Account setting. -## FAQ +# FAQ -### Will enabling auto-sync affect existing approved and reimbursed reports? +## Will enabling auto-sync affect existing approved and reimbursed reports? Auto-sync will only export newly approved reports to Sage Intacct. Any reports that were approved or reimbursed before enabling auto-sync will need to be manually exported in order to sync them to Sage Intacct. From 121b2417dd9052c0ab37c1dbc34ba5e67de6022d Mon Sep 17 00:00:00 2001 From: Victoria O'Leary <54568958+VictoriaExpensify@users.noreply.github.com> Date: Fri, 4 Oct 2024 17:03:27 +1000 Subject: [PATCH 531/555] Create Enable-Report-Fields.md New resource required, as outlined in this GH - https://github.com/Expensify/Expensify/issues/427726 --- .../workspaces/Enable-Report-Fields.md | 51 +++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 docs/articles/new-expensify/workspaces/Enable-Report-Fields.md diff --git a/docs/articles/new-expensify/workspaces/Enable-Report-Fields.md b/docs/articles/new-expensify/workspaces/Enable-Report-Fields.md new file mode 100644 index 000000000000..3ae1af36482b --- /dev/null +++ b/docs/articles/new-expensify/workspaces/Enable-Report-Fields.md @@ -0,0 +1,51 @@ +--- +title: Enable-Report-Fields.md +description: Enable and create Report Fields for your Workspaces +--- + +{% include info.html %} +Report fields are only available on the Control plan. You cannot create these report fields directly in Expensify if you are connected to an accounting integration (QuickBooks Online, QuickBooks Desktop, Intacct, Xero, or NetSuite). Please refer to the relevant article for instructions on creating fields within that system. +{% include end-info.html %} + +If you are not connected to an accounting integration, workspace Admins can add additional required report fields that allow you to specify header-level details like specific project names, business trip information, locations, and more. + +## Enable Report Fields +To enable report fields on a Workspace: + +1. Click Settings in the bottom left menu +2. Click Workspaces from the left-hand menu +3. Select the Workspace you want to enable Report Fields for +4. Go to More Features and toggle on Report Fields + +{% include info.html %} +If you are not already on a Control plan, you will be prompted to upgrade +{% include end-info.html %} + +## Create New Report Fields +To create new Report Fields: + +1. Click Settings in the bottom left menu +2. Click Workspaces from the left-hand menu +3. Select the Workspace you want to create Report Fields on +4. Click Report Fields on the lefthand menu (if you do not see this option, enable Report Fields by following the Enable Report Fields process above this) +5. Click “Add Field” in the top right corner +6. Click “Name” and add a name your your Report Field +7. Click “Type” to select the Report Field type; you will have the following options: + - Text - Add a field for free-text input + - Date - Add a calendar for date selection + - List - Add a list of options to choose from + - To create values for your list, click List Vales > Add Values +8. Once you have added a Name and the Type, click Save at the bottom of the page + +## Edit or Delete Existing Report Fields +To edit or delete existing report fields Report Fields: + +1. Click Settings in the bottom left menu +2. Click Workspaces from the left-hand menu +3. Select the Workspace you want to edit Report Fields on +4. Click Report Fields on the lefthand menu +5. Click the Report Field you wish to edit or delete +6. Make the required edits in the right-hand panel, or select “Delete” + + + From f13df4cef3dad8875de1d597f3430bd82e27b63c Mon Sep 17 00:00:00 2001 From: Bernhard Owen Josephus Date: Fri, 4 Oct 2024 18:48:00 +0800 Subject: [PATCH 532/555] fix categories page always show loader when open the page --- src/pages/workspace/withPolicyConnections.tsx | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/pages/workspace/withPolicyConnections.tsx b/src/pages/workspace/withPolicyConnections.tsx index 127631bc5437..f681193444c7 100644 --- a/src/pages/workspace/withPolicyConnections.tsx +++ b/src/pages/workspace/withPolicyConnections.tsx @@ -8,6 +8,7 @@ import usePrevious from '@hooks/usePrevious'; import {openPolicyAccountingPage} from '@libs/actions/PolicyConnections'; import ONYXKEYS from '@src/ONYXKEYS'; import {isEmptyObject} from '@src/types/utils/EmptyObject'; +import isLoadingOnyxValue from '@src/types/utils/isLoadingOnyxValue'; import withPolicy from './withPolicy'; import type {WithPolicyProps} from './withPolicy'; @@ -28,11 +29,10 @@ type WithPolicyConnectionsProps = WithPolicyProps & { function withPolicyConnections(WrappedComponent: ComponentType, shouldBlockView = true) { function WithPolicyConnections(props: TProps) { const {isOffline} = useNetwork(); - const [hasConnectionsDataBeenFetched] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY_HAS_CONNECTIONS_DATA_BEEN_FETCHED}${props.policy?.id ?? '-1'}`, { - initWithStoredValues: false, - }); + const [hasConnectionsDataBeenFetched, hasConnectionsDataBeenFetchedResult] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY_HAS_CONNECTIONS_DATA_BEEN_FETCHED}${props.policy?.id ?? '-1'}`); + const isOnyxDataLoading = isLoadingOnyxValue(hasConnectionsDataBeenFetchedResult); const isConnectionDataFetchNeeded = - !isOffline && !!props.policy && (!!props.policy.areConnectionsEnabled || !isEmptyObject(props.policy.connections)) && !hasConnectionsDataBeenFetched; + !isOnyxDataLoading && !isOffline && !!props.policy && (!!props.policy.areConnectionsEnabled || !isEmptyObject(props.policy.connections)) && !hasConnectionsDataBeenFetched; const [isFetchingData, setIsFetchingData] = useState(false); @@ -55,7 +55,7 @@ function withPolicyConnections(Wrappe openPolicyAccountingPage(props.policy.id); }, [props.policy?.id, isConnectionDataFetchNeeded]); - if ((isConnectionDataFetchNeeded || isFetchingData) && shouldBlockView) { + if ((isConnectionDataFetchNeeded || isFetchingData || isOnyxDataLoading) && shouldBlockView) { return ; } From ee48f01779abdb2d874da0138646c017ca5f1cdd Mon Sep 17 00:00:00 2001 From: Sonia Liapounova Date: Fri, 4 Oct 2024 13:44:04 +0200 Subject: [PATCH 533/555] Create General-product-troubleshooting.md --- .../General-product-troubleshooting.md | 48 +++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 docs/articles/expensify-classic/settings/General-product-troubleshooting.md diff --git a/docs/articles/expensify-classic/settings/General-product-troubleshooting.md b/docs/articles/expensify-classic/settings/General-product-troubleshooting.md new file mode 100644 index 000000000000..a314357391f1 --- /dev/null +++ b/docs/articles/expensify-classic/settings/General-product-troubleshooting.md @@ -0,0 +1,48 @@ +--- +title: General Product Troubleshooting +description: How to troubleshoot a website issue +--- + + +# Issues with a specific feature +If you're having issues with a specific feature, please reffer to the corresponding section of the help docs for detailed explinations of common errors and troubleshooting steps. If you cannot find an answer to your question, pleasee reach out to Concierge via the app or by emailing us at concierge@expensify.com. + +# Troubleshooting local issues +Is your webpage not loading? Try these steps: +- Try clicking [here](https://www.expensify.com/signout.php?clean=true), which will force a clean sign-out from the site, which can be very helpful in removing any stale data that can cause issues. +- Clear cookies & cache on your browser. +- Try using an Incognito or Private browsing window. +- Try on a different browser. + +# JavaScript Console +A developer console is a tool that logs information about the backend operations of the sites you visit and the applications you run. This information can help our developers solve any issue that you may experience. + +If you've been asked to provide a screenshot of your developer console, scroll down to find the instructions for the browser or application you're using. + +## Chrome + +- Keyboard shortcut + - Mac: Cmd + Option + J + - Windows: Ctrl + Shift + J +- From the menu: View > Developer > JavaScript Console + +## Firefox + +- Keyboard shortcut: + - Mac: Cmd + Option + K + - Windows: Ctrl + Shift + J +- From the menu: Menu Bar > More Tools > Web Developer Tools > Console tab + +## Safari + +Before opening the console you will need to enable it in Safari by clicking the Safari Menu > Settings > Advanced > and selecting the "Show features for web developers" checkbox. Once enabled, you can locate the console in the developer menu or open it using the keyboard shortcut: + +- Keyboard shortcut: Cmd + Option + C +- From the menu: Develop Menu > Show JavaScript Console + +## Microsoft Edge + +- Keyboard shortcut: + - Mac: Cmd + Option + J + - Windows: Ctrl + Shift + J +- From the menu: Right-click a webpage > Inspect > Console From b930f0e12f6848ecadf525144f32c611277788fb Mon Sep 17 00:00:00 2001 From: Sonia Liapounova Date: Fri, 4 Oct 2024 13:45:32 +0200 Subject: [PATCH 534/555] Create General-product-troubleshooting.md --- .../General-product-troubleshooting.md | 48 +++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 docs/articles/new-expensify/settings/General-product-troubleshooting.md diff --git a/docs/articles/new-expensify/settings/General-product-troubleshooting.md b/docs/articles/new-expensify/settings/General-product-troubleshooting.md new file mode 100644 index 000000000000..a314357391f1 --- /dev/null +++ b/docs/articles/new-expensify/settings/General-product-troubleshooting.md @@ -0,0 +1,48 @@ +--- +title: General Product Troubleshooting +description: How to troubleshoot a website issue +--- + + +# Issues with a specific feature +If you're having issues with a specific feature, please reffer to the corresponding section of the help docs for detailed explinations of common errors and troubleshooting steps. If you cannot find an answer to your question, pleasee reach out to Concierge via the app or by emailing us at concierge@expensify.com. + +# Troubleshooting local issues +Is your webpage not loading? Try these steps: +- Try clicking [here](https://www.expensify.com/signout.php?clean=true), which will force a clean sign-out from the site, which can be very helpful in removing any stale data that can cause issues. +- Clear cookies & cache on your browser. +- Try using an Incognito or Private browsing window. +- Try on a different browser. + +# JavaScript Console +A developer console is a tool that logs information about the backend operations of the sites you visit and the applications you run. This information can help our developers solve any issue that you may experience. + +If you've been asked to provide a screenshot of your developer console, scroll down to find the instructions for the browser or application you're using. + +## Chrome + +- Keyboard shortcut + - Mac: Cmd + Option + J + - Windows: Ctrl + Shift + J +- From the menu: View > Developer > JavaScript Console + +## Firefox + +- Keyboard shortcut: + - Mac: Cmd + Option + K + - Windows: Ctrl + Shift + J +- From the menu: Menu Bar > More Tools > Web Developer Tools > Console tab + +## Safari + +Before opening the console you will need to enable it in Safari by clicking the Safari Menu > Settings > Advanced > and selecting the "Show features for web developers" checkbox. Once enabled, you can locate the console in the developer menu or open it using the keyboard shortcut: + +- Keyboard shortcut: Cmd + Option + C +- From the menu: Develop Menu > Show JavaScript Console + +## Microsoft Edge + +- Keyboard shortcut: + - Mac: Cmd + Option + J + - Windows: Ctrl + Shift + J +- From the menu: Right-click a webpage > Inspect > Console From 3f515da8ce3339093d653082447564e2c7a1c67f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kacper=20Miko=C5=82ajczak?= Date: Fri, 4 Oct 2024 13:50:24 +0200 Subject: [PATCH 535/555] add descriptions to memoize options --- src/libs/memoize/types.ts | 29 ++++++++++++++++++++++++----- 1 file changed, 24 insertions(+), 5 deletions(-) diff --git a/src/libs/memoize/types.ts b/src/libs/memoize/types.ts index 80a6b4c55507..9ee48c9dc790 100644 --- a/src/libs/memoize/types.ts +++ b/src/libs/memoize/types.ts @@ -16,21 +16,40 @@ type IsomorphicReturnType = Fn extends Callable ? Retur type KeyComparator = (k1: Key, k2: Key) => boolean; type InternalOptions = { + /** + * Type of cache to use. Currently only `array` is supported. + */ cache: 'array'; }; type Options = { + /** + * Maximum number of entries in the cache. If the cache exceeds this number, the oldest entries will be removed. + */ maxSize: number; + /** + * Equality comparator to use for comparing keys in the cache. Can be either: + * - `deep` - default comparator that uses [DeepEqual](https://github.com/planttheidea/fast-equals?tab=readme-ov-file#deepequal) + * - `shallow` - comparator that uses [ShallowEqual](https://github.com/planttheidea/fast-equals?tab=readme-ov-file#shallowequal) + * - a custom comparator - a function that takes two keys and returns a boolean. + */ equality: 'deep' | 'shallow' | KeyComparator; + /** + * If set to `true`, memoized function stats will be collected. It can be overridden by global `Memoize` config. See `MemoizeStats` for more information. + */ monitor: boolean; + /** + * Maximum number of arguments to use for caching. If set, only the first `maxArgs` arguments will be used to generate the cache key. + */ maxArgs?: MaxArgs; + /** + * Name of the monitoring entry. If not provided, the function name will be used. + */ monitoringName?: string; /** - * Function to transform the arguments into a key, which is used to reference the result in the cache. - * When called with constructable (e.g. class, `new` keyword) functions, it won't get proper types for `truncatedArgs` - * Any viable fixes are welcome! - * @param truncatedArgs - Tuple of arguments passed to the memoized function (truncated to `maxArgs`). Does not work with constructable (see description). - * @returns - Key to use for caching + * Transforms arguments into a cache key. If set, `maxArgs` will be applied to arguments first. + * @param truncatedArgs Tuple of arguments passed to the memoized function (truncated to `maxArgs`). Does not work with constructable (see description). + * @returns Key to use for caching */ transformKey?: (truncatedArgs: TakeFirst, MaxArgs>) => Key; } & InternalOptions; From 120bdc9948f753165b096b03c9c2cdb0d6563c74 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kacper=20Miko=C5=82ajczak?= Date: Fri, 4 Oct 2024 13:50:32 +0200 Subject: [PATCH 536/555] add descriptions to memoize stats --- src/libs/memoize/stats.ts | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/libs/memoize/stats.ts b/src/libs/memoize/stats.ts index 59d563100ec4..6020371154ee 100644 --- a/src/libs/memoize/stats.ts +++ b/src/libs/memoize/stats.ts @@ -13,14 +13,29 @@ function isMemoizeStatsEntry(entry: any): entry is MemoizeStatsEntry { } class MemoizeStats { + /** + * Number of calls to the memoized function. Both cache hits and misses are counted. + */ private calls = 0; + /** + * Number of cache hits. This is the number of times the cache returned a value instead of calling the original function. + */ private hits = 0; + /** + * Average time of cache retrieval. This is the time it takes to retrieve a value from the cache, without calling the original function. + */ private avgCacheTime = 0; + /** + * Average time of original function execution. This is the time it takes to execute the original function when the cache does not have a value. + */ private avgFnTime = 0; + /** + * Current cache size. This is the number of entries in the cache. + */ private cacheSize = 0; isEnabled = false; From 8fcb0d6346557c110f9bdae68d31b098d02e5230 Mon Sep 17 00:00:00 2001 From: Vit Horacek <36083550+mountiny@users.noreply.github.com> Date: Fri, 4 Oct 2024 13:52:46 +0200 Subject: [PATCH 537/555] Revert "Add the workspace name to the title of the workspace chats" --- src/libs/ReportUtils.ts | 12 +++--------- src/libs/SidebarUtils.ts | 2 +- src/pages/home/HeaderView.tsx | 14 +++----------- tests/unit/SidebarTest.ts | 2 +- 4 files changed, 8 insertions(+), 22 deletions(-) diff --git a/src/libs/ReportUtils.ts b/src/libs/ReportUtils.ts index a50bdd7a10ba..8427f5d90b46 100644 --- a/src/libs/ReportUtils.ts +++ b/src/libs/ReportUtils.ts @@ -3755,12 +3755,11 @@ function getReportName( parentReportActionParam?: OnyxInputOrEntry, personalDetails?: Partial, invoiceReceiverPolicy?: OnyxEntry, - shouldIncludePolicyName = false, ): string { const reportID = report?.reportID; const cacheKey = getCacheKey(report); - if (reportID && !isUserCreatedPolicyRoom(report) && !isDefaultRoom(report)) { + if (reportID) { const reportNameFromCache = reportNameCache.get(cacheKey); if (reportNameFromCache?.reportName && reportNameFromCache.reportName === report?.reportName && reportNameFromCache.reportName !== CONST.REPORT.DEFAULT_REPORT_NAME) { @@ -3874,11 +3873,6 @@ function getReportName( formattedName = getInvoicesChatName(report, invoiceReceiverPolicy); } - if (shouldIncludePolicyName && (isUserCreatedPolicyRoom(report) || isDefaultRoom(report))) { - const policyName = getPolicyName(report, true); - formattedName = policyName ? `${policyName} • ${report?.reportName}` : report?.reportName; - } - if (isArchivedRoom(report, getReportNameValuePairs(report?.reportID))) { formattedName += ` (${Localize.translateLocal('common.archived')})`; } @@ -3935,8 +3929,8 @@ function getPayeeName(report: OnyxEntry): string | undefined { /** * Get either the policyName or domainName the chat is tied to */ -function getChatRoomSubtitle(report: OnyxEntry, isTitleIncludePolicyName = false): string | undefined { - if (isChatThread(report) || ((isUserCreatedPolicyRoom(report) || isDefaultRoom(report)) && isTitleIncludePolicyName)) { +function getChatRoomSubtitle(report: OnyxEntry): string | undefined { + if (isChatThread(report)) { return ''; } if (isSelfDM(report)) { diff --git a/src/libs/SidebarUtils.ts b/src/libs/SidebarUtils.ts index 0496bc66fe5b..4bf74f3c5fc1 100644 --- a/src/libs/SidebarUtils.ts +++ b/src/libs/SidebarUtils.ts @@ -488,7 +488,7 @@ function getOptionData({ result.phoneNumber = personalDetail?.phoneNumber ?? ''; } - const reportName = ReportUtils.getReportName(report, policy, undefined, undefined, invoiceReceiverPolicy, true); + const reportName = ReportUtils.getReportName(report, policy, undefined, undefined, invoiceReceiverPolicy); result.text = reportName; result.subtitle = subtitle; diff --git a/src/pages/home/HeaderView.tsx b/src/pages/home/HeaderView.tsx index 81ee426aa8dd..42483cc3d223 100644 --- a/src/pages/home/HeaderView.tsx +++ b/src/pages/home/HeaderView.tsx @@ -87,8 +87,8 @@ function HeaderView({report, parentReportAction, reportID, onNavigationMenuButto const isTaskReport = ReportUtils.isTaskReport(report); const reportHeaderData = !isTaskReport && !isChatThread && report?.parentReportID ? parentReport : report; // Use sorted display names for the title for group chats on native small screen widths - const title = ReportUtils.getReportName(reportHeaderData, policy, parentReportAction, personalDetails, invoiceReceiverPolicy, true); - const subtitle = ReportUtils.getChatRoomSubtitle(reportHeaderData, true); + const title = ReportUtils.getReportName(reportHeaderData, policy, parentReportAction, personalDetails, invoiceReceiverPolicy); + const subtitle = ReportUtils.getChatRoomSubtitle(reportHeaderData); const parentNavigationSubtitleData = ReportUtils.getParentNavigationSubtitle(reportHeaderData); const reportDescription = ReportUtils.getReportDescriptionText(report); const policyName = ReportUtils.getPolicyName(report, true); @@ -120,15 +120,7 @@ function HeaderView({report, parentReportAction, reportID, onNavigationMenuButto ); const renderAdditionalText = () => { - if ( - shouldShowSubtitle() || - isPersonalExpenseChat || - !policyName || - !isEmptyObject(parentNavigationSubtitleData) || - isSelfDM || - ReportUtils.isUserCreatedPolicyRoom(report) || - ReportUtils.isDefaultRoom(report) - ) { + if (shouldShowSubtitle() || isPersonalExpenseChat || !policyName || !isEmptyObject(parentNavigationSubtitleData) || isSelfDM) { return null; } return ( diff --git a/tests/unit/SidebarTest.ts b/tests/unit/SidebarTest.ts index 443b719194b3..2c8d28c537c6 100644 --- a/tests/unit/SidebarTest.ts +++ b/tests/unit/SidebarTest.ts @@ -141,7 +141,7 @@ describe('Sidebar', () => { .then(() => { const hintText = Localize.translateLocal('accessibilityHints.chatUserDisplayNames'); const displayNames = screen.queryAllByLabelText(hintText); - expect(displayNames.at(0)).toHaveTextContent('Vikings Policy • Report (archived)'); + expect(displayNames.at(0)).toHaveTextContent('Report (archived)'); const hintMessagePreviewText = Localize.translateLocal('accessibilityHints.lastChatMessagePreview'); const messagePreviewTexts = screen.queryAllByLabelText(hintMessagePreviewText); From ec7a1f7877f234ce7ae6cf6460bbf81b82dcda4d Mon Sep 17 00:00:00 2001 From: Sonia Liapounova Date: Fri, 4 Oct 2024 13:53:56 +0200 Subject: [PATCH 538/555] Update General-product-troubleshooting.md --- .../settings/General-product-troubleshooting.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/articles/expensify-classic/settings/General-product-troubleshooting.md b/docs/articles/expensify-classic/settings/General-product-troubleshooting.md index a314357391f1..6c594608498e 100644 --- a/docs/articles/expensify-classic/settings/General-product-troubleshooting.md +++ b/docs/articles/expensify-classic/settings/General-product-troubleshooting.md @@ -5,7 +5,7 @@ description: How to troubleshoot a website issue # Issues with a specific feature -If you're having issues with a specific feature, please reffer to the corresponding section of the help docs for detailed explinations of common errors and troubleshooting steps. If you cannot find an answer to your question, pleasee reach out to Concierge via the app or by emailing us at concierge@expensify.com. +If you're having issues with a specific feature, please reffer to the corresponding section of the help docs for detailed explinations of common errors and troubleshooting steps. If you cannot find an answer to your question, please reach out to Concierge via the app or by emailing us at concierge@expensify.com. # Troubleshooting local issues Is your webpage not loading? Try these steps: From 4fb0c8e78fe536f01af9107cd39370a343c47eb0 Mon Sep 17 00:00:00 2001 From: Sonia Liapounova Date: Fri, 4 Oct 2024 13:54:31 +0200 Subject: [PATCH 539/555] Update General-product-troubleshooting.md --- .../new-expensify/settings/General-product-troubleshooting.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/articles/new-expensify/settings/General-product-troubleshooting.md b/docs/articles/new-expensify/settings/General-product-troubleshooting.md index a314357391f1..6c594608498e 100644 --- a/docs/articles/new-expensify/settings/General-product-troubleshooting.md +++ b/docs/articles/new-expensify/settings/General-product-troubleshooting.md @@ -5,7 +5,7 @@ description: How to troubleshoot a website issue # Issues with a specific feature -If you're having issues with a specific feature, please reffer to the corresponding section of the help docs for detailed explinations of common errors and troubleshooting steps. If you cannot find an answer to your question, pleasee reach out to Concierge via the app or by emailing us at concierge@expensify.com. +If you're having issues with a specific feature, please reffer to the corresponding section of the help docs for detailed explinations of common errors and troubleshooting steps. If you cannot find an answer to your question, please reach out to Concierge via the app or by emailing us at concierge@expensify.com. # Troubleshooting local issues Is your webpage not loading? Try these steps: From 2d1f3baf8391779f2f585134002690d9709d413c Mon Sep 17 00:00:00 2001 From: Sonia Liapounova Date: Fri, 4 Oct 2024 13:54:52 +0200 Subject: [PATCH 540/555] Update General-product-troubleshooting.md --- .../new-expensify/settings/General-product-troubleshooting.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/articles/new-expensify/settings/General-product-troubleshooting.md b/docs/articles/new-expensify/settings/General-product-troubleshooting.md index 6c594608498e..57126628e04f 100644 --- a/docs/articles/new-expensify/settings/General-product-troubleshooting.md +++ b/docs/articles/new-expensify/settings/General-product-troubleshooting.md @@ -5,7 +5,7 @@ description: How to troubleshoot a website issue # Issues with a specific feature -If you're having issues with a specific feature, please reffer to the corresponding section of the help docs for detailed explinations of common errors and troubleshooting steps. If you cannot find an answer to your question, please reach out to Concierge via the app or by emailing us at concierge@expensify.com. +If you're having issues with a specific feature, please reffer to the corresponding section of the help docs for detailed explinations of common errors and troubleshooting steps. If you cannot find an answer to your question, please reach out to Concierge via in-product chat or by emailing us at concierge@expensify.com. # Troubleshooting local issues Is your webpage not loading? Try these steps: From 96fb2ac14fa05fb6e0889b58d3b37f5dc54ede12 Mon Sep 17 00:00:00 2001 From: Sonia Liapounova Date: Fri, 4 Oct 2024 13:55:08 +0200 Subject: [PATCH 541/555] Update General-product-troubleshooting.md --- .../settings/General-product-troubleshooting.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/articles/expensify-classic/settings/General-product-troubleshooting.md b/docs/articles/expensify-classic/settings/General-product-troubleshooting.md index 6c594608498e..57126628e04f 100644 --- a/docs/articles/expensify-classic/settings/General-product-troubleshooting.md +++ b/docs/articles/expensify-classic/settings/General-product-troubleshooting.md @@ -5,7 +5,7 @@ description: How to troubleshoot a website issue # Issues with a specific feature -If you're having issues with a specific feature, please reffer to the corresponding section of the help docs for detailed explinations of common errors and troubleshooting steps. If you cannot find an answer to your question, please reach out to Concierge via the app or by emailing us at concierge@expensify.com. +If you're having issues with a specific feature, please reffer to the corresponding section of the help docs for detailed explinations of common errors and troubleshooting steps. If you cannot find an answer to your question, please reach out to Concierge via in-product chat or by emailing us at concierge@expensify.com. # Troubleshooting local issues Is your webpage not loading? Try these steps: From 48e49f3a3fb9e5d602ddd9fe44a4023ead7b10f6 Mon Sep 17 00:00:00 2001 From: Rayane Djouah <77965000+rayane-djouah@users.noreply.github.com> Date: Fri, 4 Oct 2024 15:39:40 +0100 Subject: [PATCH 542/555] Fix: Saved search - Saved search list is not scrollable when there is a long list --- src/pages/Search/SearchPageBottomTab.tsx | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/src/pages/Search/SearchPageBottomTab.tsx b/src/pages/Search/SearchPageBottomTab.tsx index 38e4c5166884..c72462d1f66e 100644 --- a/src/pages/Search/SearchPageBottomTab.tsx +++ b/src/pages/Search/SearchPageBottomTab.tsx @@ -102,12 +102,12 @@ function SearchPageBottomTab() { isCustomSearchQuery={shouldUseNarrowLayout && !SearchUtils.isCannedSearchQuery(queryJSON)} /> - - - {shouldUseNarrowLayout && ( + {shouldUseNarrowLayout ? ( + + - )} - + + ) : ( + + )} ) : ( From 5e484340deae19d14a4a6a98f4c83f51bc26b32b Mon Sep 17 00:00:00 2001 From: Ishpaul Singh <104348397+ishpaul777@users.noreply.github.com> Date: Fri, 4 Oct 2024 22:08:07 +0530 Subject: [PATCH 543/555] Revert "Fix task title is overflown and align the checkbox and arrow correctly" --- .../ReportActionItem/TaskPreview.tsx | 32 +++++++------------ src/pages/home/report/ReportActionItem.tsx | 1 - src/styles/index.ts | 5 +++ src/styles/utils/index.ts | 11 ------- 4 files changed, 17 insertions(+), 32 deletions(-) diff --git a/src/components/ReportActionItem/TaskPreview.tsx b/src/components/ReportActionItem/TaskPreview.tsx index 95528286d1e1..a2ea7487df02 100644 --- a/src/components/ReportActionItem/TaskPreview.tsx +++ b/src/components/ReportActionItem/TaskPreview.tsx @@ -1,7 +1,6 @@ import {Str} from 'expensify-common'; import React from 'react'; import {View} from 'react-native'; -import type {StyleProp, ViewStyle} from 'react-native'; import {useOnyx} from 'react-native-onyx'; import type {OnyxEntry} from 'react-native-onyx'; import Avatar from '@components/Avatar'; @@ -12,7 +11,6 @@ import {usePersonalDetails} from '@components/OnyxProvider'; import PressableWithoutFeedback from '@components/Pressable/PressableWithoutFeedback'; import RenderHTML from '@components/RenderHTML'; import {showContextMenuForReport} from '@components/ShowContextMenuContext'; -import Text from '@components/Text'; import withCurrentUserPersonalDetails from '@components/withCurrentUserPersonalDetails'; import type {WithCurrentUserPersonalDetailsProps} from '@components/withCurrentUserPersonalDetails'; import useLocalize from '@hooks/useLocalize'; @@ -55,12 +53,9 @@ type TaskPreviewProps = WithCurrentUserPersonalDetailsProps & { /** Callback for updating context menu active state, used for showing context menu */ checkIfContextMenuActive: () => void; - - /** Style for the task preview container */ - style: StyleProp; }; -function TaskPreview({taskReportID, action, contextMenuAnchor, chatReportID, checkIfContextMenuActive, currentUserPersonalDetails, isHovered = false, style}: TaskPreviewProps) { +function TaskPreview({taskReportID, action, contextMenuAnchor, chatReportID, checkIfContextMenuActive, currentUserPersonalDetails, isHovered = false}: TaskPreviewProps) { const styles = useThemeStyles(); const StyleUtils = useStyleUtils(); const {translate} = useLocalize(); @@ -75,33 +70,29 @@ function TaskPreview({taskReportID, action, contextMenuAnchor, chatReportID, che : action?.childStateNum === CONST.REPORT.STATE_NUM.APPROVED && action?.childStatusNum === CONST.REPORT.STATUS_NUM.APPROVED; const taskTitle = Str.htmlEncode(TaskUtils.getTaskTitle(taskReportID, action?.childReportName ?? '')); const taskAssigneeAccountID = Task.getTaskAssigneeAccountID(taskReport) ?? action?.childManagerAccountID ?? -1; - const hasAssignee = taskAssigneeAccountID > 0; const personalDetails = usePersonalDetails(); const avatar = personalDetails?.[taskAssigneeAccountID]?.avatar ?? Expensicons.FallbackAvatar; - const avatarSize = CONST.AVATAR_SIZE.SMALL; + const htmlForTaskPreview = `${taskTitle}`; const isDeletedParentAction = ReportUtils.isCanceledTaskReport(taskReport, action); - const iconWrapperStyle = StyleUtils.getTaskPreviewIconWrapper(hasAssignee ? avatarSize : undefined); - const titleStyle = StyleUtils.getTaskPreviewTitleStyle(iconWrapperStyle.height, isTaskCompleted); - const shouldShowGreenDotIndicator = ReportUtils.isOpenTaskReport(taskReport, action) && ReportUtils.isReportManager(taskReport); if (isDeletedParentAction) { return ${translate('parentReportAction.deletedTask')}`} />; } return ( - + Navigation.navigate(ROUTES.REPORT_WITH_ID.getRoute(taskReportID))} onPressIn={() => DeviceCapabilities.canUseTouchScreen() && ControlSelection.block()} onPressOut={() => ControlSelection.unblock()} onLongPress={(event) => showContextMenuForReport(event, contextMenuAnchor, chatReportID, action, checkIfContextMenuActive)} shouldUseHapticsOnLongPress - style={[styles.flexRow, styles.justifyContentBetween, style]} + style={[styles.flexRow, styles.justifyContentBetween]} role={CONST.ROLE.BUTTON} accessibilityLabel={translate('task.task')} > - - + + - {hasAssignee && ( + {taskAssigneeAccountID > 0 && ( )} - {taskTitle} + + ${htmlForTaskPreview}` : htmlForTaskPreview} /> + {shouldShowGreenDotIndicator && ( @@ -138,7 +131,6 @@ function TaskPreview({taskReportID, action, contextMenuAnchor, chatReportID, che diff --git a/src/pages/home/report/ReportActionItem.tsx b/src/pages/home/report/ReportActionItem.tsx index 5b826b94aa77..d9701219418e 100644 --- a/src/pages/home/report/ReportActionItem.tsx +++ b/src/pages/home/report/ReportActionItem.tsx @@ -572,7 +572,6 @@ function ReportActionItem({ children = ( width: 1, }, + taskCheckboxWrapper: { + height: variables.fontSizeNormalHeight, + ...flex.justifyContentCenter, + }, + taskTitleMenuItem: { ...writingDirection.ltr, ...headlineFont, diff --git a/src/styles/utils/index.ts b/src/styles/utils/index.ts index 9eeced6de5a6..c7665fc1e3dd 100644 --- a/src/styles/utils/index.ts +++ b/src/styles/utils/index.ts @@ -1667,17 +1667,6 @@ const createStyleUtils = (theme: ThemeColors, styles: ThemeStyles) => ({ alignItems: 'center', justifyContent: 'center', }), - - getTaskPreviewIconWrapper: (avatarSize?: AvatarSizeName) => ({ - height: avatarSize ? getAvatarSize(avatarSize) : variables.fontSizeNormalHeight, - ...styles.justifyContentCenter, - }), - - getTaskPreviewTitleStyle: (iconHeight: number, isTaskCompleted: boolean): StyleProp => [ - styles.flex1, - isTaskCompleted ? [styles.textSupporting, styles.textLineThrough] : [], - {marginTop: (iconHeight - variables.fontSizeNormalHeight) / 2}, - ], }); type StyleUtilsType = ReturnType; From 575e904e7b50272e68fe19dc547d8e46a54bad21 Mon Sep 17 00:00:00 2001 From: OSBotify Date: Fri, 4 Oct 2024 16:55:12 +0000 Subject: [PATCH 544/555] Update version to 9.0.44-9 --- android/app/build.gradle | 4 ++-- ios/NewExpensify/Info.plist | 2 +- ios/NewExpensifyTests/Info.plist | 2 +- ios/NotificationServiceExtension/Info.plist | 2 +- package-lock.json | 4 ++-- package.json | 2 +- 6 files changed, 8 insertions(+), 8 deletions(-) diff --git a/android/app/build.gradle b/android/app/build.gradle index 3834cf464243..cbf2f602d249 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -110,8 +110,8 @@ android { minSdkVersion rootProject.ext.minSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion multiDexEnabled rootProject.ext.multiDexEnabled - versionCode 1009004408 - versionName "9.0.44-8" + versionCode 1009004409 + versionName "9.0.44-9" // Supported language variants must be declared here to avoid from being removed during the compilation. // This also helps us to not include unnecessary language variants in the APK. resConfigs "en", "es" diff --git a/ios/NewExpensify/Info.plist b/ios/NewExpensify/Info.plist index 51caecb7c81a..39fad1ad9696 100644 --- a/ios/NewExpensify/Info.plist +++ b/ios/NewExpensify/Info.plist @@ -40,7 +40,7 @@ CFBundleVersion - 9.0.44.8 + 9.0.44.9 FullStory OrgId diff --git a/ios/NewExpensifyTests/Info.plist b/ios/NewExpensifyTests/Info.plist index c2ee6978f322..8c55df2af295 100644 --- a/ios/NewExpensifyTests/Info.plist +++ b/ios/NewExpensifyTests/Info.plist @@ -19,6 +19,6 @@ CFBundleSignature ???? CFBundleVersion - 9.0.44.8 + 9.0.44.9 diff --git a/ios/NotificationServiceExtension/Info.plist b/ios/NotificationServiceExtension/Info.plist index 1f812f0eff46..222efefed74d 100644 --- a/ios/NotificationServiceExtension/Info.plist +++ b/ios/NotificationServiceExtension/Info.plist @@ -13,7 +13,7 @@ CFBundleShortVersionString 9.0.44 CFBundleVersion - 9.0.44.8 + 9.0.44.9 NSExtension NSExtensionPointIdentifier diff --git a/package-lock.json b/package-lock.json index cf9978bae510..683242a636cb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "new.expensify", - "version": "9.0.44-8", + "version": "9.0.44-9", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "new.expensify", - "version": "9.0.44-8", + "version": "9.0.44-9", "hasInstallScript": true, "license": "MIT", "dependencies": { diff --git a/package.json b/package.json index baf05e92111b..25a31d8107b3 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "new.expensify", - "version": "9.0.44-8", + "version": "9.0.44-9", "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.", From 896bc78eb90272b7160cba98871a7630c400f68c Mon Sep 17 00:00:00 2001 From: OSBotify Date: Fri, 4 Oct 2024 17:24:36 +0000 Subject: [PATCH 545/555] Update version to 9.0.44-10 --- android/app/build.gradle | 4 ++-- ios/NewExpensify/Info.plist | 2 +- ios/NewExpensifyTests/Info.plist | 2 +- ios/NotificationServiceExtension/Info.plist | 2 +- package-lock.json | 4 ++-- package.json | 2 +- 6 files changed, 8 insertions(+), 8 deletions(-) diff --git a/android/app/build.gradle b/android/app/build.gradle index cbf2f602d249..4466f8558024 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -110,8 +110,8 @@ android { minSdkVersion rootProject.ext.minSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion multiDexEnabled rootProject.ext.multiDexEnabled - versionCode 1009004409 - versionName "9.0.44-9" + versionCode 1009004410 + versionName "9.0.44-10" // Supported language variants must be declared here to avoid from being removed during the compilation. // This also helps us to not include unnecessary language variants in the APK. resConfigs "en", "es" diff --git a/ios/NewExpensify/Info.plist b/ios/NewExpensify/Info.plist index 39fad1ad9696..0a05e6af082f 100644 --- a/ios/NewExpensify/Info.plist +++ b/ios/NewExpensify/Info.plist @@ -40,7 +40,7 @@ CFBundleVersion - 9.0.44.9 + 9.0.44.10 FullStory OrgId diff --git a/ios/NewExpensifyTests/Info.plist b/ios/NewExpensifyTests/Info.plist index 8c55df2af295..327dbf1bcc7e 100644 --- a/ios/NewExpensifyTests/Info.plist +++ b/ios/NewExpensifyTests/Info.plist @@ -19,6 +19,6 @@ CFBundleSignature ???? CFBundleVersion - 9.0.44.9 + 9.0.44.10 diff --git a/ios/NotificationServiceExtension/Info.plist b/ios/NotificationServiceExtension/Info.plist index 222efefed74d..94a98eb26032 100644 --- a/ios/NotificationServiceExtension/Info.plist +++ b/ios/NotificationServiceExtension/Info.plist @@ -13,7 +13,7 @@ CFBundleShortVersionString 9.0.44 CFBundleVersion - 9.0.44.9 + 9.0.44.10 NSExtension NSExtensionPointIdentifier diff --git a/package-lock.json b/package-lock.json index 683242a636cb..1a02390f6c7b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "new.expensify", - "version": "9.0.44-9", + "version": "9.0.44-10", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "new.expensify", - "version": "9.0.44-9", + "version": "9.0.44-10", "hasInstallScript": true, "license": "MIT", "dependencies": { diff --git a/package.json b/package.json index 25a31d8107b3..f28c9e10740e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "new.expensify", - "version": "9.0.44-9", + "version": "9.0.44-10", "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.", From c40e883031be55fddb2e3d3648ed8658e3dd0508 Mon Sep 17 00:00:00 2001 From: Jasper Huang Date: Fri, 4 Oct 2024 11:47:09 -0700 Subject: [PATCH 546/555] Revert "fix: migrate withFullTransactionOrNotFound to useOnyx" --- .../step/withFullTransactionOrNotFound.tsx | 40 +++++++++---------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/src/pages/iou/request/step/withFullTransactionOrNotFound.tsx b/src/pages/iou/request/step/withFullTransactionOrNotFound.tsx index 0ddddf7ff878..491c37c9a402 100644 --- a/src/pages/iou/request/step/withFullTransactionOrNotFound.tsx +++ b/src/pages/iou/request/step/withFullTransactionOrNotFound.tsx @@ -2,8 +2,8 @@ import type {RouteProp} from '@react-navigation/native'; import {useIsFocused} from '@react-navigation/native'; import type {ComponentType, ForwardedRef, RefAttributes} from 'react'; import React, {forwardRef} from 'react'; -import {useOnyx} from 'react-native-onyx'; import type {OnyxEntry} from 'react-native-onyx'; +import {withOnyx} from 'react-native-onyx'; import FullPageNotFoundView from '@components/BlockingViews/FullPageNotFoundView'; import getComponentDisplayName from '@libs/getComponentDisplayName'; import * as IOUUtils from '@libs/IOUUtils'; @@ -38,25 +38,14 @@ type MoneyRequestRouteName = | typeof SCREENS.MONEY_REQUEST.STEP_SEND_FROM | typeof SCREENS.MONEY_REQUEST.STEP_COMPANY_INFO; -type Route = RouteProp; +type Route = RouteProp; -type WithFullTransactionOrNotFoundProps = WithFullTransactionOrNotFoundOnyxProps & { - route: Route; -}; +type WithFullTransactionOrNotFoundProps = WithFullTransactionOrNotFoundOnyxProps & {route: Route}; -export default function , TRef>( - WrappedComponent: ComponentType>, -): React.ComponentType & RefAttributes> { +export default function , TRef>(WrappedComponent: ComponentType>) { // eslint-disable-next-line rulesdir/no-negated-variables - function WithFullTransactionOrNotFound(props: Omit, ref: ForwardedRef) { - const {route} = props; - const transactionID = route.params.transactionID ?? -1; - const userAction = 'action' in route.params && route.params.action ? route.params.action : CONST.IOU.ACTION.CREATE; - - const shouldUseTransactionDraft = IOUUtils.shouldUseTransactionDraft(userAction); - - const [transaction] = useOnyx(`${ONYXKEYS.COLLECTION.TRANSACTION}${transactionID}`); - const [transactionDraft] = useOnyx(`${ONYXKEYS.COLLECTION.TRANSACTION_DRAFT}${transactionID}`); + function WithFullTransactionOrNotFound(props: TProps, ref: ForwardedRef) { + const transactionID = props.transaction?.transactionID; const isFocused = useIsFocused(); @@ -70,8 +59,7 @@ export default function ); @@ -79,7 +67,19 @@ export default function , WithFullTransactionOrNotFoundOnyxProps>({ + transaction: { + key: ({route}) => { + const transactionID = route.params.transactionID ?? -1; + const userAction = 'action' in route.params && route.params.action ? route.params.action : CONST.IOU.ACTION.CREATE; + + if (IOUUtils.shouldUseTransactionDraft(userAction)) { + return `${ONYXKEYS.COLLECTION.TRANSACTION_DRAFT}${transactionID}` as `${typeof ONYXKEYS.COLLECTION.TRANSACTION}${string}`; + } + return `${ONYXKEYS.COLLECTION.TRANSACTION}${transactionID}`; + }, + }, + })(forwardRef(WithFullTransactionOrNotFound)); } export type {WithFullTransactionOrNotFoundProps}; From abe4f3a5bf88f2b9f68afed13e13dd0cd7f95fe8 Mon Sep 17 00:00:00 2001 From: Jasper Huang Date: Fri, 4 Oct 2024 12:05:12 -0700 Subject: [PATCH 547/555] disable deprecation warning --- src/pages/iou/request/step/withFullTransactionOrNotFound.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pages/iou/request/step/withFullTransactionOrNotFound.tsx b/src/pages/iou/request/step/withFullTransactionOrNotFound.tsx index 491c37c9a402..66736dc80b52 100644 --- a/src/pages/iou/request/step/withFullTransactionOrNotFound.tsx +++ b/src/pages/iou/request/step/withFullTransactionOrNotFound.tsx @@ -66,7 +66,7 @@ export default function , WithFullTransactionOrNotFoundOnyxProps>({ transaction: { key: ({route}) => { From 58fc7b2b8a22351a5478ed2698f6469994794892 Mon Sep 17 00:00:00 2001 From: Jasper Huang Date: Fri, 4 Oct 2024 12:09:38 -0700 Subject: [PATCH 548/555] fix import warning --- src/components/ReportActionItem/TaskPreview.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/src/components/ReportActionItem/TaskPreview.tsx b/src/components/ReportActionItem/TaskPreview.tsx index eb780311f087..187dfbafa5c4 100644 --- a/src/components/ReportActionItem/TaskPreview.tsx +++ b/src/components/ReportActionItem/TaskPreview.tsx @@ -7,6 +7,7 @@ import Avatar from '@components/Avatar'; import Checkbox from '@components/Checkbox'; import Icon from '@components/Icon'; import * as Expensicons from '@components/Icon/Expensicons'; +import iconWrapperStyle from '@components/Icon/IconWrapperStyles'; import {usePersonalDetails} from '@components/OnyxProvider'; import PressableWithoutFeedback from '@components/Pressable/PressableWithoutFeedback'; import RenderHTML from '@components/RenderHTML'; From 89a3b6158c07f4636d85498e85b92192b3ea72ba Mon Sep 17 00:00:00 2001 From: Jasper Huang Date: Fri, 4 Oct 2024 12:35:11 -0700 Subject: [PATCH 549/555] Revert "[No QA] Callable buildIOS workflow" --- .github/workflows/buildAndroid.yml | 1 + .github/workflows/buildIOS.yml | 155 -------------------------- .github/workflows/deploy.yml | 170 ++++++++++++++++------------- .github/workflows/testBuild.yml | 114 +++++++++++++------ fastlane/Fastfile | 10 +- 5 files changed, 179 insertions(+), 271 deletions(-) delete mode 100644 .github/workflows/buildIOS.yml diff --git a/.github/workflows/buildAndroid.yml b/.github/workflows/buildAndroid.yml index 69bbfa380234..403a40214b40 100644 --- a/.github/workflows/buildAndroid.yml +++ b/.github/workflows/buildAndroid.yml @@ -41,6 +41,7 @@ on: description: Git ref to checkout and build required: true type: string + pull_request_number: description: The pull request number associated with this build, if relevant. type: number diff --git a/.github/workflows/buildIOS.yml b/.github/workflows/buildIOS.yml deleted file mode 100644 index 2386d01da793..000000000000 --- a/.github/workflows/buildIOS.yml +++ /dev/null @@ -1,155 +0,0 @@ -name: Build iOS app - -on: - workflow_call: - inputs: - type: - description: 'What type of build to run. Must be one of ["release", "adhoc"]' - type: string - required: true - ref: - description: Git ref to checkout and build - type: string - required: true - pull_request_number: - description: The pull request number associated with this build, if relevant. - type: string - required: false - outputs: - IPA_FILE_NAME: - value: ${{ jobs.build.outputs.IPA_FILE_NAME }} - DSYM_FILE_NAME: - value: ${{ jobs.build.outputs.DSYM_FILE_NAME }} - - workflow_dispatch: - inputs: - type: - description: What type of build do you want to run? - required: true - type: choice - options: - - release - - adhoc - ref: - description: Git ref to checkout and build - required: true - type: string - pull_request_number: - description: The pull request number associated with this build, if relevant. - type: number - required: false - -jobs: - build: - name: Build iOS app - runs-on: macos-13-xlarge - env: - DEVELOPER_DIR: /Applications/Xcode_15.2.0.app/Contents/Developer - outputs: - IPA_FILE_NAME: ${{ steps.build.outputs.IPA_FILE_NAME }} - DSYM_FILE_NAME: ${{ steps.build.outputs.DSYM_FILE_NAME }} - steps: - - name: Checkout - uses: actions/checkout@v4 - with: - ref: ${{ inputs.ref }} - - - name: Create .env.adhoc file based on staging and add PULL_REQUEST_NUMBER env to it - if: ${{ inputs.type == 'adhoc' }} - run: | - cp .env.staging .env.adhoc - sed -i '' 's/ENVIRONMENT=staging/ENVIRONMENT=adhoc/' .env.adhoc - echo "PULL_REQUEST_NUMBER=${{ inputs.pull_request_number }}" >> .env.adhoc - - - name: Configure MapBox SDK - run: ./scripts/setup-mapbox-sdk.sh ${{ secrets.MAPBOX_SDK_DOWNLOAD_TOKEN }} - - - name: Setup Node - id: setup-node - uses: ./.github/actions/composite/setupNode - - - name: Setup Ruby - uses: ruby/setup-ruby@v1.190.0 - with: - bundler-cache: true - - - name: Cache Pod dependencies - uses: actions/cache@v4 - id: pods-cache - with: - path: ios/Pods - key: ${{ runner.os }}-pods-cache-${{ hashFiles('ios/Podfile.lock', 'firebase.json') }} - - - name: Compare Podfile.lock and Manifest.lock - id: compare-podfile-and-manifest - run: echo "IS_PODFILE_SAME_AS_MANIFEST=${{ hashFiles('ios/Podfile.lock') == hashFiles('ios/Pods/Manifest.lock') }}" >> "$GITHUB_OUTPUT" - - - name: Install cocoapods - uses: nick-fields/retry@3f757583fb1b1f940bc8ef4bf4734c8dc02a5847 - if: steps.pods-cache.outputs.cache-hit != 'true' || steps.compare-podfile-and-manifest.outputs.IS_PODFILE_SAME_AS_MANIFEST != 'true' || steps.setup-node.outputs.cache-hit != 'true' - with: - timeout_minutes: 10 - max_attempts: 5 - command: scripts/pod-install.sh - - - name: Decrypt provisioning profiles - run: | - cd ios - provisioningProfile='' - if [ '${{ inputs.type }}' == 'release' ]; then - provisioningProfile='NewApp_AppStore' - else - provisioningProfile='NewApp_AdHoc' - fi - echo "Using provisioning profile: $provisioningProfile" - gpg --quiet --batch --yes --decrypt --passphrase="$LARGE_SECRET_PASSPHRASE" --output "$provisioningProfile.mobileprovision" "$provisioningProfile.mobileprovision.gpg" - gpg --quiet --batch --yes --decrypt --passphrase="$LARGE_SECRET_PASSPHRASE" --output "${provisioningProfile}_Notification_Service.mobileprovision" "${provisioningProfile}_Notification_Service.mobileprovision.gpg" - env: - LARGE_SECRET_PASSPHRASE: ${{ secrets.LARGE_SECRET_PASSPHRASE }} - - - name: Decrypt code signing certificate - run: cd ios && gpg --quiet --batch --yes --decrypt --passphrase="$LARGE_SECRET_PASSPHRASE" --output Certificates.p12 Certificates.p12.gpg - env: - LARGE_SECRET_PASSPHRASE: ${{ secrets.LARGE_SECRET_PASSPHRASE }} - - - name: Build iOS ${{ inputs.type }} app - id: build - run: | - lane='' - if [ '${{ inputs.type }}' == 'release' ]; then - lane='build' - else - lane='build_adhoc' - fi - - bundle exec fastlane ios "$lane" - - # Reload environment variables from GITHUB_ENV - # shellcheck disable=SC1090 - source "$GITHUB_ENV" - - { - # ipaPath and dsymPath are environment variables set within the Fastfile - echo "IPA_PATH=$ipaPath" - echo "IPA_FILE_NAME=$(basename "$ipaPath")" - echo "DSYM_PATH=$dsymPath" - echo "DSYM_FILE_NAME=$(basename "$dsymPath")" - } >> "$GITHUB_OUTPUT" - - - name: Upload iOS build artifact - uses: actions/upload-artifact@v4 - with: - name: ios-artifact-ipa - path: ${{ steps.build.outputs.IPA_PATH }} - - - name: Upload iOS debug symbols artifact - uses: actions/upload-artifact@v4 - with: - name: ios-artifact-dsym - path: ${{ steps.build.outputs.DSYM_PATH }} - - - name: Upload iOS sourcemaps - uses: actions/upload-artifact@v4 - with: - name: ios-artifact-sourcemaps - path: ./main.jsbundle.map diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 2053ce44aadb..555e7650193c 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -203,73 +203,61 @@ jobs: name: ${{ fromJSON(env.SHOULD_DEPLOY_PRODUCTION) && 'desktop-build-artifact' || 'desktop-staging-build-artifact' }} path: ./desktop-build/NewExpensify.dmg - buildIOS: - name: Build iOS app - uses: ./.github/workflows/buildIOS.yml - if: ${{ github.ref == 'refs/heads/staging' }} + iOS: + name: Build and deploy iOS needs: prep - secrets: inherit - with: - type: release - ref: staging - - uploadIOS: - name: Upload iOS App to TestFlight - needs: buildIOS - runs-on: ubuntu-latest + env: + DEVELOPER_DIR: /Applications/Xcode_15.2.0.app/Contents/Developer + runs-on: macos-13-xlarge steps: - name: Checkout uses: actions/checkout@v4 + - name: Configure MapBox SDK + run: ./scripts/setup-mapbox-sdk.sh ${{ secrets.MAPBOX_SDK_DOWNLOAD_TOKEN }} + + - name: Setup Node + id: setup-node + uses: ./.github/actions/composite/setupNode + - name: Setup Ruby uses: ruby/setup-ruby@v1.190.0 with: bundler-cache: true - - name: Decrypt App Store Connect API key - run: cd ios && gpg --quiet --batch --yes --decrypt --passphrase="$LARGE_SECRET_PASSPHRASE" --output ios-fastlane-json-key.json ios-fastlane-json-key.json.gpg - env: - LARGE_SECRET_PASSPHRASE: ${{ secrets.LARGE_SECRET_PASSPHRASE }} - - - name: Download iOS build artifacts - uses: actions/download-artifact@v4 + - name: Cache Pod dependencies + uses: actions/cache@v4 + id: pods-cache with: - path: /tmp/artifacts - pattern: ios-artifact-* - merge-multiple: true + path: ios/Pods + key: ${{ runner.os }}-pods-cache-${{ hashFiles('ios/Podfile.lock', 'firebase.json') }} - - name: Log downloaded artifact paths - run: ls -R /tmp/artifacts + - name: Compare Podfile.lock and Manifest.lock + id: compare-podfile-and-manifest + run: echo "IS_PODFILE_SAME_AS_MANIFEST=${{ hashFiles('ios/Podfile.lock') == hashFiles('ios/Pods/Manifest.lock') }}" >> "$GITHUB_OUTPUT" - - name: Upload iOS app to TestFlight - run: bundle exec fastlane ios upload_testflight - env: - APPLE_CONTACT_EMAIL: ${{ secrets.APPLE_CONTACT_EMAIL }} - APPLE_CONTACT_PHONE: ${{ secrets.APPLE_CONTACT_PHONE }} - APPLE_DEMO_EMAIL: ${{ secrets.APPLE_DEMO_EMAIL }} - APPLE_DEMO_PASSWORD: ${{ secrets.APPLE_DEMO_PASSWORD }} - ipaPath: /tmp/artifacts/${{ needs.buildIOS.outputs.IPA_FILE_NAME }} - dsymPath: /tmp/artifacts/${{ needs.buildIOS.outputs.DSYM_FILE_NAME }} + - name: Install cocoapods + uses: nick-fields/retry@3f757583fb1b1f940bc8ef4bf4734c8dc02a5847 + if: steps.pods-cache.outputs.cache-hit != 'true' || steps.compare-podfile-and-manifest.outputs.IS_PODFILE_SAME_AS_MANIFEST != 'true' || steps.setup-node.outputs.cache-hit != 'true' + with: + timeout_minutes: 10 + max_attempts: 5 + command: scripts/pod-install.sh - - name: Upload iOS build to Browser Stack - if: ${{ !fromJSON(env.SHOULD_DEPLOY_PRODUCTION) }} - run: curl -u "$BROWSERSTACK" -X POST "https://api-cloud.browserstack.com/app-live/upload" -F "file=@/tmp/artifacts/${{ needs.buildIOS.outputs.IPA_FILE_NAME }}" + - name: Decrypt AppStore profile + run: cd ios && gpg --quiet --batch --yes --decrypt --passphrase="$LARGE_SECRET_PASSPHRASE" --output NewApp_AppStore.mobileprovision NewApp_AppStore.mobileprovision.gpg env: - BROWSERSTACK: ${{ secrets.BROWSERSTACK }} + LARGE_SECRET_PASSPHRASE: ${{ secrets.LARGE_SECRET_PASSPHRASE }} - submitIOS: - name: Submit iOS app for Apple review - needs: prep - if: ${{ github.ref == 'refs/heads/production' }} - runs-on: ubuntu-latest - steps: - - name: Checkout - uses: actions/checkout@v4 + - name: Decrypt AppStore Notification Service profile + run: cd ios && gpg --quiet --batch --yes --decrypt --passphrase="$LARGE_SECRET_PASSPHRASE" --output NewApp_AppStore_Notification_Service.mobileprovision NewApp_AppStore_Notification_Service.mobileprovision.gpg + env: + LARGE_SECRET_PASSPHRASE: ${{ secrets.LARGE_SECRET_PASSPHRASE }} - - name: Setup Ruby - uses: ruby/setup-ruby@v1.190.0 - with: - bundler-cache: true + - name: Decrypt certificate + run: cd ios && gpg --quiet --batch --yes --decrypt --passphrase="$LARGE_SECRET_PASSPHRASE" --output Certificates.p12 Certificates.p12.gpg + env: + LARGE_SECRET_PASSPHRASE: ${{ secrets.LARGE_SECRET_PASSPHRASE }} - name: Decrypt App Store Connect API key run: cd ios && gpg --quiet --batch --yes --decrypt --passphrase="$LARGE_SECRET_PASSPHRASE" --output ios-fastlane-json-key.json ios-fastlane-json-key.json.gpg @@ -280,13 +268,47 @@ jobs: id: getIOSVersion run: echo "IOS_VERSION=$(echo '${{ needs.prep.outputs.APP_VERSION }}' | tr '-' '.')" >> "$GITHUB_OUTPUT" + - name: Build iOS release app + if: ${{ !fromJSON(env.SHOULD_DEPLOY_PRODUCTION) }} + run: bundle exec fastlane ios build + + - name: Upload release build to TestFlight + if: ${{ !fromJSON(env.SHOULD_DEPLOY_PRODUCTION) }} + run: bundle exec fastlane ios upload_testflight + env: + APPLE_CONTACT_EMAIL: ${{ secrets.APPLE_CONTACT_EMAIL }} + APPLE_CONTACT_PHONE: ${{ secrets.APPLE_CONTACT_PHONE }} + APPLE_DEMO_EMAIL: ${{ secrets.APPLE_DEMO_EMAIL }} + APPLE_DEMO_PASSWORD: ${{ secrets.APPLE_DEMO_PASSWORD }} + - name: Submit build for App Store review + if: ${{ fromJSON(env.SHOULD_DEPLOY_PRODUCTION) }} run: bundle exec fastlane ios submit_for_review env: VERSION: ${{ steps.getIOSVersion.outputs.IOS_VERSION }} + - name: Upload iOS build to Browser Stack + if: ${{ !fromJSON(env.SHOULD_DEPLOY_PRODUCTION) }} + run: curl -u "$BROWSERSTACK" -X POST "https://api-cloud.browserstack.com/app-live/upload" -F "file=@/Users/runner/work/App/App/New Expensify.ipa" + env: + BROWSERSTACK: ${{ secrets.BROWSERSTACK }} + + - name: Upload iOS sourcemaps artifact + if: ${{ !fromJSON(env.SHOULD_DEPLOY_PRODUCTION) }} + uses: actions/upload-artifact@v4 + with: + name: ios-sourcemaps-artifact + path: ./main.jsbundle.map + + - name: Upload iOS build artifact + if: ${{ !fromJSON(env.SHOULD_DEPLOY_PRODUCTION) }} + uses: actions/upload-artifact@v4 + with: + name: ios-build-artifact + path: /Users/runner/work/App/App/New\ Expensify.ipa + - name: Warn deployers if iOS production deploy failed - if: ${{ failure() }} + if: ${{ failure() && fromJSON(env.SHOULD_DEPLOY_PRODUCTION) }} uses: 8398a7/action-slack@v3 with: status: custom @@ -389,7 +411,7 @@ jobs: name: Post a Slack message when any platform fails to build or deploy runs-on: ubuntu-latest if: ${{ failure() }} - needs: [buildAndroid, uploadAndroid, submitAndroid, desktop, buildIOS, uploadIOS, submitIOS, web] + needs: [buildAndroid, uploadAndroid, submitAndroid, desktop, iOS, web] steps: - name: Checkout uses: actions/checkout@v4 @@ -415,7 +437,7 @@ jobs: outputs: IS_AT_LEAST_ONE_PLATFORM_DEPLOYED: ${{ steps.checkDeploymentSuccessOnAtLeastOnePlatform.outputs.IS_AT_LEAST_ONE_PLATFORM_DEPLOYED }} IS_ALL_PLATFORMS_DEPLOYED: ${{ steps.checkDeploymentSuccessOnAllPlatforms.outputs.IS_ALL_PLATFORMS_DEPLOYED }} - needs: [buildAndroid, uploadAndroid, submitAndroid, desktop, buildIOS, uploadIOS, submitIOS, web] + needs: [buildAndroid, uploadAndroid, submitAndroid, desktop, iOS, web] if: ${{ always() }} steps: - name: Check deployment success on at least one platform @@ -423,19 +445,18 @@ jobs: run: | isAtLeastOnePlatformDeployed="false" if [ ${{ github.ref }} == 'refs/heads/production' ]; then - if [ '${{ needs.submitAndroid.result }}' == 'success' ] || \ - [ '${{ needs.submitIOS.result }}' == 'success' ]; then + if [ "${{ needs.submitAndroid.result }}" == "success" ]; then isAtLeastOnePlatformDeployed="true" fi else - if [ '${{ needs.uploadAndroid.result }}' == 'success' ] || \ - [ '${{ needs.uploadIOS.result }}' == 'success' ]; then + if [ "${{ needs.uploadAndroid.result }}" == "success" ]; then isAtLeastOnePlatformDeployed="true" fi fi - - if [ '${{ needs.desktop.result }}' == 'success' ] || \ - [ '${{ needs.web.result }}' == 'success' ]; then + + if [ "${{ needs.iOS.result }}" == "success" ] || \ + [ "${{ needs.desktop.result }}" == "success" ] || \ + [ "${{ needs.web.result }}" == "success" ]; then isAtLeastOnePlatformDeployed="true" fi echo "IS_AT_LEAST_ONE_PLATFORM_DEPLOYED=$isAtLeastOnePlatformDeployed" >> "$GITHUB_OUTPUT" @@ -444,20 +465,19 @@ jobs: - name: Check deployment success on all platforms id: checkDeploymentSuccessOnAllPlatforms run: | - isAllPlatformsDeployed='false' - if [ '${{ needs.desktop.result }}' == 'success' ] && \ - [ '${{ needs.web.result }}' == 'success' ]; then + isAllPlatformsDeployed="false" + if [ "${{ needs.iOS.result }}" == "success" ] && \ + [ "${{ needs.desktop.result }}" == "success" ] && \ + [ "${{ needs.web.result }}" == "success" ]; then isAllPlatformsDeployed="true" fi if [ ${{ github.ref }} == 'refs/heads/production' ]; then - if [ '${{ needs.submitAndroid.result }}' != 'success' ] || \ - [ '${{ needs.submitIOS.result }}' != 'success' ]; then + if [ "${{ needs.submitAndroid.result }}" != "success" ]; then isAllPlatformsDeployed="false" fi else - if [ '${{ needs.uploadAndroid.result }}' != 'success' ] || \ - [ '${{ needs.uploadIOS.result }}' != 'success' ]; then + if [ "${{ needs.uploadAndroid.result }}" != "success" ]; then isAllPlatformsDeployed="false" fi fi @@ -468,7 +488,7 @@ jobs: createPrerelease: runs-on: ubuntu-latest if: ${{ always() && github.ref == 'refs/heads/staging' && fromJSON(needs.checkDeploymentSuccess.outputs.IS_AT_LEAST_ONE_PLATFORM_DEPLOYED) }} - needs: [prep, checkDeploymentSuccess, buildAndroid, buildIOS] + needs: [prep, checkDeploymentSuccess] steps: - name: Download all workflow run artifacts uses: actions/download-artifact@v4 @@ -495,12 +515,12 @@ jobs: continue-on-error: true run: | gh release upload ${{ needs.prep.outputs.APP_VERSION }} --repo ${{ github.repository }} --clobber \ - ./android-artifact-sourcemaps/index.android.bundle.map#android-sourcemap-${{ needs.prep.outputs.APP_VERSION }} \ - ./android-artifact-aab/${{ needs.buildAndroid.outputs.AAB_FILE_NAME }} \ + ./android-sourcemaps-artifact/index.android.bundle.map#android-sourcemap-${{ needs.prep.outputs.APP_VERSION }} \ + ./android-build-artifact/app-production-release.aab \ ./desktop-staging-sourcemaps-artifact/desktop-staging-merged-source-map.js.map#desktop-staging-sourcemap-${{ needs.prep.outputs.APP_VERSION }} \ ./desktop-staging-build-artifact/NewExpensify.dmg#NewExpensifyStaging.dmg \ - ./ios-artifact-sourcemaps/main.jsbundle.map#ios-sourcemap-${{ needs.prep.outputs.APP_VERSION }} \ - ./ios-artifact-ipa/${{ needs.buildIOS.outputs.IPA_FILE_NAME }} \ + ./ios-sourcemaps-artifact/main.jsbundle.map#ios-sourcemap-${{ needs.prep.outputs.APP_VERSION }} \ + ./ios-build-artifact/New\ Expensify.ipa \ ./web-staging-sourcemaps-artifact/web-staging-merged-source-map.js.map#web-staging-sourcemap-${{ needs.prep.outputs.APP_VERSION }} \ ./web-staging-build-tar-gz-artifact/webBuild.tar.gz#stagingWebBuild.tar.gz \ ./web-staging-build-zip-artifact/webBuild.zip#stagingWebBuild.zip @@ -581,7 +601,7 @@ jobs: name: Post a Slack message when all platforms deploy successfully runs-on: ubuntu-latest if: ${{ always() && fromJSON(needs.checkDeploymentSuccess.outputs.IS_ALL_PLATFORMS_DEPLOYED) }} - needs: [prep, buildAndroid, uploadAndroid, submitAndroid, desktop, buildIOS, uploadIOS, submitIOS, web, checkDeploymentSuccess, createPrerelease, finalizeRelease] + needs: [prep, buildAndroid, uploadAndroid, submitAndroid, desktop, iOS, web, checkDeploymentSuccess, createPrerelease, finalizeRelease] steps: - name: 'Announces the deploy in the #announce Slack room' uses: 8398a7/action-slack@v3 @@ -635,11 +655,11 @@ jobs: postGithubComments: uses: ./.github/workflows/postDeployComments.yml if: ${{ always() && fromJSON(needs.checkDeploymentSuccess.outputs.IS_AT_LEAST_ONE_PLATFORM_DEPLOYED) }} - needs: [prep, buildAndroid, uploadAndroid, submitAndroid, buildIOS, uploadIOS, submitIOS, desktop, web, checkDeploymentSuccess, createPrerelease, finalizeRelease] + needs: [prep, buildAndroid, uploadAndroid, submitAndroid, desktop, iOS, web, checkDeploymentSuccess, createPrerelease, finalizeRelease] with: version: ${{ needs.prep.outputs.APP_VERSION }} env: ${{ github.ref == 'refs/heads/production' && 'production' || 'staging' }} android: ${{ github.ref == 'refs/heads/production' && needs.submitAndroid.result || needs.uploadAndroid.result }} - ios: ${{ github.ref == 'refs/heads/production' && needs.submitIOS.result || needs.uploadIOS.result }} + ios: ${{ needs.iOS.result }} web: ${{ needs.web.result }} desktop: ${{ needs.desktop.result }} diff --git a/.github/workflows/testBuild.yml b/.github/workflows/testBuild.yml index ac20a8d09141..672d468ed3b1 100644 --- a/.github/workflows/testBuild.yml +++ b/.github/workflows/testBuild.yml @@ -120,41 +120,73 @@ jobs: # $s3APKPath is set from within the Fastfile, android upload_s3 lane echo "S3_APK_PATH=$s3APKPath" >> "$GITHUB_OUTPUT" - buildIOS: - name: Build iOS app for testing - uses: ./.github/workflows/buildIOS.yml - if: ${{ fromJSON(needs.validateActor.outputs.READY_TO_BUILD) }} + iOS: + name: Build and deploy iOS for testing needs: [validateActor, getBranchRef] - secrets: inherit - with: - type: adhoc - ref: ${{ github.event.pull_request.head.sha || needs.getBranchRef.outputs.REF }} - pull_request_number: ${{ github.event.number || github.event.inputs.PULL_REQUEST_NUMBER }} - - uploadIOS: - name: Upload IOS app to S3 - needs: buildIOS - runs-on: ubuntu-latest - outputs: - S3_IPA_PATH: ${{ steps.exportS3Path.outputs.S3_IPA_PATH }} + if: ${{ fromJSON(needs.validateActor.outputs.READY_TO_BUILD) }} + env: + DEVELOPER_DIR: /Applications/Xcode_15.2.0.app/Contents/Developer + runs-on: macos-13-xlarge steps: - name: Checkout uses: actions/checkout@v4 + with: + ref: ${{ github.event.pull_request.head.sha || needs.getBranchRef.outputs.REF }} + + - name: Configure MapBox SDK + run: ./scripts/setup-mapbox-sdk.sh ${{ secrets.MAPBOX_SDK_DOWNLOAD_TOKEN }} + + - name: Create .env.adhoc file based on staging and add PULL_REQUEST_NUMBER env to it + run: | + cp .env.staging .env.adhoc + sed -i '' 's/ENVIRONMENT=staging/ENVIRONMENT=adhoc/' .env.adhoc + echo "PULL_REQUEST_NUMBER=$PULL_REQUEST_NUMBER" >> .env.adhoc + + - name: Setup Node + id: setup-node + uses: ./.github/actions/composite/setupNode + + - name: Setup XCode + run: sudo xcode-select -switch /Applications/Xcode_15.2.0.app - name: Setup Ruby uses: ruby/setup-ruby@v1.190.0 with: bundler-cache: true - - name: Download IOS build artifacts - uses: actions/download-artifact@v4 + - name: Cache Pod dependencies + uses: actions/cache@v4 + id: pods-cache with: - path: /tmp/artifacts - pattern: ios-artifact-* - merge-multiple: true + path: ios/Pods + key: ${{ runner.os }}-pods-cache-${{ hashFiles('ios/Podfile.lock', 'firebase.json') }} - - name: Log downloaded artifact paths - run: ls -R /tmp/artifacts + - name: Compare Podfile.lock and Manifest.lock + id: compare-podfile-and-manifest + run: echo "IS_PODFILE_SAME_AS_MANIFEST=${{ hashFiles('ios/Podfile.lock') == hashFiles('ios/Pods/Manifest.lock') }}" >> "$GITHUB_OUTPUT" + + - name: Install cocoapods + uses: nick-fields/retry@3f757583fb1b1f940bc8ef4bf4734c8dc02a5847 + if: steps.pods-cache.outputs.cache-hit != 'true' || steps.compare-podfile-and-manifest.outputs.IS_PODFILE_SAME_AS_MANIFEST != 'true' || steps.setup-node.outputs.cache-hit != 'true' + with: + timeout_minutes: 10 + max_attempts: 5 + command: scripts/pod-install.sh + + - name: Decrypt AdHoc profile + run: cd ios && gpg --quiet --batch --yes --decrypt --passphrase="$LARGE_SECRET_PASSPHRASE" --output NewApp_AdHoc.mobileprovision NewApp_AdHoc.mobileprovision.gpg + env: + LARGE_SECRET_PASSPHRASE: ${{ secrets.LARGE_SECRET_PASSPHRASE }} + + - name: Decrypt AdHoc Notification Service profile + run: cd ios && gpg --quiet --batch --yes --decrypt --passphrase="$LARGE_SECRET_PASSPHRASE" --output NewApp_AdHoc_Notification_Service.mobileprovision NewApp_AdHoc_Notification_Service.mobileprovision.gpg + env: + LARGE_SECRET_PASSPHRASE: ${{ secrets.LARGE_SECRET_PASSPHRASE }} + + - name: Decrypt certificate + run: cd ios && gpg --quiet --batch --yes --decrypt --passphrase="$LARGE_SECRET_PASSPHRASE" --output Certificates.p12 Certificates.p12.gpg + env: + LARGE_SECRET_PASSPHRASE: ${{ secrets.LARGE_SECRET_PASSPHRASE }} - name: Configure AWS Credentials uses: aws-actions/configure-aws-credentials@v4 @@ -163,20 +195,22 @@ jobs: aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} aws-region: us-east-1 + - name: Build AdHoc app + run: bundle exec fastlane ios build_adhoc + - name: Upload AdHoc build to S3 run: bundle exec fastlane ios upload_s3 env: - ipaPath: /tmp/artifacts/${{ needs.buildIOS.outputs.IPA_FILE_NAME }} S3_ACCESS_KEY: ${{ secrets.AWS_ACCESS_KEY_ID }} S3_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} S3_BUCKET: ad-hoc-expensify-cash S3_REGION: us-east-1 - - name: Export S3 paths - id: exportS3Path - run: | - # $s3IpaPath is set from within the Fastfile, ios upload_s3 lane - echo "S3_IPA_PATH=$s3IpaPath" >> "$GITHUB_OUTPUT" + - name: Upload Artifact + uses: actions/upload-artifact@v4 + with: + name: ios + path: ./ios_paths.json desktop: name: Build and deploy Desktop for testing @@ -257,27 +291,41 @@ jobs: postGithubComment: runs-on: ubuntu-latest name: Post a GitHub comment with app download links for testing - needs: [validateActor, getBranchRef, uploadAndroid, uploadIOS, desktop, web] - if: ${{ always() && fromJSON(needs.validateActor.outputs.READY_TO_BUILD) }} + needs: [validateActor, getBranchRef, uploadAndroid, iOS, desktop, web] + if: ${{ always() }} steps: - name: Checkout uses: actions/checkout@v4 + if: ${{ fromJSON(needs.validateActor.outputs.READY_TO_BUILD) }} with: ref: ${{ github.event.pull_request.head.sha || needs.getBranchRef.outputs.REF }} - name: Download Artifact uses: actions/download-artifact@v4 + if: ${{ fromJSON(needs.validateActor.outputs.READY_TO_BUILD) }} + + - name: Read JSONs with iOS paths + id: get_ios_path + if: ${{ needs.iOS.result == 'success' }} + run: | + content_ios="$(cat ./ios/ios_paths.json)" + content_ios="${content_ios//'%'/'%25'}" + content_ios="${content_ios//$'\n'/'%0A'}" + content_ios="${content_ios//$'\r'/'%0D'}" + ios_path=$(echo "$content_ios" | jq -r '.html_path') + echo "ios_path=$ios_path" >> "$GITHUB_OUTPUT" - name: Publish links to apps for download + if: ${{ fromJSON(needs.validateActor.outputs.READY_TO_BUILD) }} uses: ./.github/actions/javascript/postTestBuildComment with: PR_NUMBER: ${{ env.PULL_REQUEST_NUMBER }} GITHUB_TOKEN: ${{ github.token }} ANDROID: ${{ needs.uploadAndroid.result }} DESKTOP: ${{ needs.desktop.result }} - IOS: ${{ needs.uploadIOS.result }} + IOS: ${{ needs.iOS.result }} WEB: ${{ needs.web.result }} ANDROID_LINK: ${{ needs.uploadAndroid.outputs.S3_APK_PATH }} DESKTOP_LINK: https://ad-hoc-expensify-cash.s3.amazonaws.com/desktop/${{ env.PULL_REQUEST_NUMBER }}/NewExpensify.dmg - IOS_LINK: ${{ needs.uploadIOS.outputs.S3_IPA_PATH }} + IOS_LINK: ${{ steps.get_ios_path.outputs.ios_path }} WEB_LINK: https://${{ env.PULL_REQUEST_NUMBER }}.pr-testing.expensify.com diff --git a/fastlane/Fastfile b/fastlane/Fastfile index 1a7499a2a2c3..eed84acdc916 100644 --- a/fastlane/Fastfile +++ b/fastlane/Fastfile @@ -19,7 +19,6 @@ KEY_GRADLE_APK_PATH = "apkPath" KEY_S3_APK_PATH = "s3APKPath" KEY_GRADLE_AAB_PATH = "aabPath" KEY_IPA_PATH = "ipaPath" -KEY_S3_IPA_PATH = "s3IpaPath" KEY_DSYM_PATH = "dsymPath" # Export environment variables to GITHUB_ENV @@ -216,7 +215,7 @@ platform :ios do build_app( workspace: "./ios/NewExpensify.xcworkspace", scheme: "New Expensify", - output_name: "NewExpensify.ipa", + output_name: "New Expensify.ipa", export_options: { provisioningProfiles: { "com.chat.expensify.chat" => "(NewApp) AppStore", @@ -257,7 +256,6 @@ platform :ios do workspace: "./ios/NewExpensify.xcworkspace", skip_profile_detection: true, scheme: "New Expensify AdHoc", - output_name: "NewExpensify_AdHoc.ipa", export_method: "ad-hoc", export_options: { method: "ad-hoc", @@ -282,16 +280,12 @@ platform :ios do ipa: ENV[KEY_IPA_PATH], app_directory: "ios/#{ENV['PULL_REQUEST_NUMBER']}", ) - puts "Saving S3 outputs in env..." - exportEnvVars({ - KEY_S3_IPA_PATH => lane_context[SharedValues::S3_HTML_OUTPUT_PATH], - }) + sh("echo '{\"ipa_path\": \"#{lane_context[SharedValues::S3_IPA_OUTPUT_PATH]}\",\"html_path\": \"#{lane_context[SharedValues::S3_HTML_OUTPUT_PATH]}\"}' > ../ios_paths.json") end desc "Upload app to TestFlight" lane :upload_testflight do upload_to_testflight( - ipa: ENV[KEY_IPA_PATH], api_key_path: "./ios/ios-fastlane-json-key.json", distribute_external: true, notify_external_testers: true, From 49b096d94cab2970d29cf2702d040646d8a62147 Mon Sep 17 00:00:00 2001 From: OSBotify Date: Fri, 4 Oct 2024 19:43:15 +0000 Subject: [PATCH 550/555] Update version to 9.0.44-11 --- android/app/build.gradle | 4 ++-- ios/NewExpensify/Info.plist | 2 +- ios/NewExpensifyTests/Info.plist | 2 +- ios/NotificationServiceExtension/Info.plist | 2 +- package-lock.json | 4 ++-- package.json | 2 +- 6 files changed, 8 insertions(+), 8 deletions(-) diff --git a/android/app/build.gradle b/android/app/build.gradle index 4466f8558024..87e0d11b86de 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -110,8 +110,8 @@ android { minSdkVersion rootProject.ext.minSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion multiDexEnabled rootProject.ext.multiDexEnabled - versionCode 1009004410 - versionName "9.0.44-10" + versionCode 1009004411 + versionName "9.0.44-11" // Supported language variants must be declared here to avoid from being removed during the compilation. // This also helps us to not include unnecessary language variants in the APK. resConfigs "en", "es" diff --git a/ios/NewExpensify/Info.plist b/ios/NewExpensify/Info.plist index 0a05e6af082f..80fe04c9c3e6 100644 --- a/ios/NewExpensify/Info.plist +++ b/ios/NewExpensify/Info.plist @@ -40,7 +40,7 @@ CFBundleVersion - 9.0.44.10 + 9.0.44.11 FullStory OrgId diff --git a/ios/NewExpensifyTests/Info.plist b/ios/NewExpensifyTests/Info.plist index 327dbf1bcc7e..8cde11c13509 100644 --- a/ios/NewExpensifyTests/Info.plist +++ b/ios/NewExpensifyTests/Info.plist @@ -19,6 +19,6 @@ CFBundleSignature ???? CFBundleVersion - 9.0.44.10 + 9.0.44.11 diff --git a/ios/NotificationServiceExtension/Info.plist b/ios/NotificationServiceExtension/Info.plist index 94a98eb26032..b15d81284d97 100644 --- a/ios/NotificationServiceExtension/Info.plist +++ b/ios/NotificationServiceExtension/Info.plist @@ -13,7 +13,7 @@ CFBundleShortVersionString 9.0.44 CFBundleVersion - 9.0.44.10 + 9.0.44.11 NSExtension NSExtensionPointIdentifier diff --git a/package-lock.json b/package-lock.json index 1a02390f6c7b..c98b15512211 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "new.expensify", - "version": "9.0.44-10", + "version": "9.0.44-11", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "new.expensify", - "version": "9.0.44-10", + "version": "9.0.44-11", "hasInstallScript": true, "license": "MIT", "dependencies": { diff --git a/package.json b/package.json index f28c9e10740e..41352fc019fa 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "new.expensify", - "version": "9.0.44-10", + "version": "9.0.44-11", "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.", From 69691038cd6e024e14ca42dfe8ca59387e0226f9 Mon Sep 17 00:00:00 2001 From: OSBotify Date: Fri, 4 Oct 2024 19:46:59 +0000 Subject: [PATCH 551/555] Update version to 9.0.44-12 --- android/app/build.gradle | 4 ++-- ios/NewExpensify/Info.plist | 2 +- ios/NewExpensifyTests/Info.plist | 2 +- ios/NotificationServiceExtension/Info.plist | 2 +- package-lock.json | 4 ++-- package.json | 2 +- 6 files changed, 8 insertions(+), 8 deletions(-) diff --git a/android/app/build.gradle b/android/app/build.gradle index 87e0d11b86de..abd8492fb20f 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -110,8 +110,8 @@ android { minSdkVersion rootProject.ext.minSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion multiDexEnabled rootProject.ext.multiDexEnabled - versionCode 1009004411 - versionName "9.0.44-11" + versionCode 1009004412 + versionName "9.0.44-12" // Supported language variants must be declared here to avoid from being removed during the compilation. // This also helps us to not include unnecessary language variants in the APK. resConfigs "en", "es" diff --git a/ios/NewExpensify/Info.plist b/ios/NewExpensify/Info.plist index 80fe04c9c3e6..0166a6a5dee8 100644 --- a/ios/NewExpensify/Info.plist +++ b/ios/NewExpensify/Info.plist @@ -40,7 +40,7 @@ CFBundleVersion - 9.0.44.11 + 9.0.44.12 FullStory OrgId diff --git a/ios/NewExpensifyTests/Info.plist b/ios/NewExpensifyTests/Info.plist index 8cde11c13509..a7316a4414f1 100644 --- a/ios/NewExpensifyTests/Info.plist +++ b/ios/NewExpensifyTests/Info.plist @@ -19,6 +19,6 @@ CFBundleSignature ???? CFBundleVersion - 9.0.44.11 + 9.0.44.12 diff --git a/ios/NotificationServiceExtension/Info.plist b/ios/NotificationServiceExtension/Info.plist index b15d81284d97..8e0564af0be2 100644 --- a/ios/NotificationServiceExtension/Info.plist +++ b/ios/NotificationServiceExtension/Info.plist @@ -13,7 +13,7 @@ CFBundleShortVersionString 9.0.44 CFBundleVersion - 9.0.44.11 + 9.0.44.12 NSExtension NSExtensionPointIdentifier diff --git a/package-lock.json b/package-lock.json index c98b15512211..46912604ed2b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "new.expensify", - "version": "9.0.44-11", + "version": "9.0.44-12", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "new.expensify", - "version": "9.0.44-11", + "version": "9.0.44-12", "hasInstallScript": true, "license": "MIT", "dependencies": { diff --git a/package.json b/package.json index 41352fc019fa..eb8cdf2caf3c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "new.expensify", - "version": "9.0.44-11", + "version": "9.0.44-12", "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.", From 52fce24c47aa9f734c04dfc5c66d27dc235eb171 Mon Sep 17 00:00:00 2001 From: OSBotify Date: Fri, 4 Oct 2024 20:43:39 +0000 Subject: [PATCH 552/555] Update version to 9.0.45-0 --- android/app/build.gradle | 4 ++-- ios/NewExpensify/Info.plist | 4 ++-- ios/NewExpensifyTests/Info.plist | 4 ++-- ios/NotificationServiceExtension/Info.plist | 4 ++-- package-lock.json | 4 ++-- package.json | 2 +- 6 files changed, 11 insertions(+), 11 deletions(-) diff --git a/android/app/build.gradle b/android/app/build.gradle index abd8492fb20f..cc31b09234dd 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -110,8 +110,8 @@ android { minSdkVersion rootProject.ext.minSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion multiDexEnabled rootProject.ext.multiDexEnabled - versionCode 1009004412 - versionName "9.0.44-12" + versionCode 1009004500 + versionName "9.0.45-0" // Supported language variants must be declared here to avoid from being removed during the compilation. // This also helps us to not include unnecessary language variants in the APK. resConfigs "en", "es" diff --git a/ios/NewExpensify/Info.plist b/ios/NewExpensify/Info.plist index 0166a6a5dee8..12b063918cd9 100644 --- a/ios/NewExpensify/Info.plist +++ b/ios/NewExpensify/Info.plist @@ -19,7 +19,7 @@ CFBundlePackageType APPL CFBundleShortVersionString - 9.0.44 + 9.0.45 CFBundleSignature ???? CFBundleURLTypes @@ -40,7 +40,7 @@ CFBundleVersion - 9.0.44.12 + 9.0.45.0 FullStory OrgId diff --git a/ios/NewExpensifyTests/Info.plist b/ios/NewExpensifyTests/Info.plist index a7316a4414f1..30f0d86d6206 100644 --- a/ios/NewExpensifyTests/Info.plist +++ b/ios/NewExpensifyTests/Info.plist @@ -15,10 +15,10 @@ CFBundlePackageType BNDL CFBundleShortVersionString - 9.0.44 + 9.0.45 CFBundleSignature ???? CFBundleVersion - 9.0.44.12 + 9.0.45.0 diff --git a/ios/NotificationServiceExtension/Info.plist b/ios/NotificationServiceExtension/Info.plist index 8e0564af0be2..f9b8084421de 100644 --- a/ios/NotificationServiceExtension/Info.plist +++ b/ios/NotificationServiceExtension/Info.plist @@ -11,9 +11,9 @@ CFBundleName $(PRODUCT_NAME) CFBundleShortVersionString - 9.0.44 + 9.0.45 CFBundleVersion - 9.0.44.12 + 9.0.45.0 NSExtension NSExtensionPointIdentifier diff --git a/package-lock.json b/package-lock.json index 46912604ed2b..fa81f7dbc10a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "new.expensify", - "version": "9.0.44-12", + "version": "9.0.45-0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "new.expensify", - "version": "9.0.44-12", + "version": "9.0.45-0", "hasInstallScript": true, "license": "MIT", "dependencies": { diff --git a/package.json b/package.json index eb8cdf2caf3c..58173a2cffa4 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "new.expensify", - "version": "9.0.44-12", + "version": "9.0.45-0", "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.", From a004a5f0be607318486d94748d03c7ac4c00110f Mon Sep 17 00:00:00 2001 From: OSBotify Date: Fri, 4 Oct 2024 20:43:57 +0000 Subject: [PATCH 553/555] Update version to 9.0.45-1 --- android/app/build.gradle | 4 ++-- ios/NewExpensify/Info.plist | 2 +- ios/NewExpensifyTests/Info.plist | 2 +- ios/NotificationServiceExtension/Info.plist | 2 +- package-lock.json | 4 ++-- package.json | 2 +- 6 files changed, 8 insertions(+), 8 deletions(-) diff --git a/android/app/build.gradle b/android/app/build.gradle index cc31b09234dd..4cb4ef1fb62e 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -110,8 +110,8 @@ android { minSdkVersion rootProject.ext.minSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion multiDexEnabled rootProject.ext.multiDexEnabled - versionCode 1009004500 - versionName "9.0.45-0" + versionCode 1009004501 + versionName "9.0.45-1" // Supported language variants must be declared here to avoid from being removed during the compilation. // This also helps us to not include unnecessary language variants in the APK. resConfigs "en", "es" diff --git a/ios/NewExpensify/Info.plist b/ios/NewExpensify/Info.plist index 12b063918cd9..3108ba6fc2e8 100644 --- a/ios/NewExpensify/Info.plist +++ b/ios/NewExpensify/Info.plist @@ -40,7 +40,7 @@ CFBundleVersion - 9.0.45.0 + 9.0.45.1 FullStory OrgId diff --git a/ios/NewExpensifyTests/Info.plist b/ios/NewExpensifyTests/Info.plist index 30f0d86d6206..4f84f32eb01b 100644 --- a/ios/NewExpensifyTests/Info.plist +++ b/ios/NewExpensifyTests/Info.plist @@ -19,6 +19,6 @@ CFBundleSignature ???? CFBundleVersion - 9.0.45.0 + 9.0.45.1 diff --git a/ios/NotificationServiceExtension/Info.plist b/ios/NotificationServiceExtension/Info.plist index f9b8084421de..9868898ab82b 100644 --- a/ios/NotificationServiceExtension/Info.plist +++ b/ios/NotificationServiceExtension/Info.plist @@ -13,7 +13,7 @@ CFBundleShortVersionString 9.0.45 CFBundleVersion - 9.0.45.0 + 9.0.45.1 NSExtension NSExtensionPointIdentifier diff --git a/package-lock.json b/package-lock.json index fa81f7dbc10a..d8ac17ad8f08 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "new.expensify", - "version": "9.0.45-0", + "version": "9.0.45-1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "new.expensify", - "version": "9.0.45-0", + "version": "9.0.45-1", "hasInstallScript": true, "license": "MIT", "dependencies": { diff --git a/package.json b/package.json index 58173a2cffa4..15aca5e97146 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "new.expensify", - "version": "9.0.45-0", + "version": "9.0.45-1", "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.", From 30a5280c58b75130c8657ec6d7012a27d50c9e3a Mon Sep 17 00:00:00 2001 From: rory Date: Fri, 4 Oct 2024 13:53:20 -0700 Subject: [PATCH 554/555] Decrypt json Google Play key --- .github/workflows/deploy.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 555e7650193c..4ff1a2004d8f 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -136,6 +136,10 @@ jobs: id: getAndroidVersion run: echo "VERSION_CODE=$(grep -o 'versionCode\s\+[0-9]\+' android/app/build.gradle | awk '{ print $2 }')" >> "$GITHUB_OUTPUT" + - name: Decrypt json w/ Google Play credentials + run: gpg --batch --yes --decrypt --passphrase="${{ secrets.LARGE_SECRET_PASSPHRASE }}" --output android-fastlane-json-key.json android-fastlane-json-key.json.gpg + working-directory: android/app + - name: Submit Android build for review run: bundle exec fastlane android upload_google_play_production env: From 10b8547c3fdad76e9a6f1986edef5b94507e1ae6 Mon Sep 17 00:00:00 2001 From: OSBotify Date: Fri, 4 Oct 2024 21:14:35 +0000 Subject: [PATCH 555/555] Update version to 9.0.45-2 --- android/app/build.gradle | 4 ++-- ios/NewExpensify/Info.plist | 2 +- ios/NewExpensifyTests/Info.plist | 2 +- ios/NotificationServiceExtension/Info.plist | 2 +- package-lock.json | 4 ++-- package.json | 2 +- 6 files changed, 8 insertions(+), 8 deletions(-) diff --git a/android/app/build.gradle b/android/app/build.gradle index 4cb4ef1fb62e..56ae4bd0a873 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -110,8 +110,8 @@ android { minSdkVersion rootProject.ext.minSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion multiDexEnabled rootProject.ext.multiDexEnabled - versionCode 1009004501 - versionName "9.0.45-1" + versionCode 1009004502 + versionName "9.0.45-2" // Supported language variants must be declared here to avoid from being removed during the compilation. // This also helps us to not include unnecessary language variants in the APK. resConfigs "en", "es" diff --git a/ios/NewExpensify/Info.plist b/ios/NewExpensify/Info.plist index 3108ba6fc2e8..9b44440ea8ce 100644 --- a/ios/NewExpensify/Info.plist +++ b/ios/NewExpensify/Info.plist @@ -40,7 +40,7 @@ CFBundleVersion - 9.0.45.1 + 9.0.45.2 FullStory OrgId diff --git a/ios/NewExpensifyTests/Info.plist b/ios/NewExpensifyTests/Info.plist index 4f84f32eb01b..f3fe791cc8a1 100644 --- a/ios/NewExpensifyTests/Info.plist +++ b/ios/NewExpensifyTests/Info.plist @@ -19,6 +19,6 @@ CFBundleSignature ???? CFBundleVersion - 9.0.45.1 + 9.0.45.2 diff --git a/ios/NotificationServiceExtension/Info.plist b/ios/NotificationServiceExtension/Info.plist index 9868898ab82b..747676c49fc0 100644 --- a/ios/NotificationServiceExtension/Info.plist +++ b/ios/NotificationServiceExtension/Info.plist @@ -13,7 +13,7 @@ CFBundleShortVersionString 9.0.45 CFBundleVersion - 9.0.45.1 + 9.0.45.2 NSExtension NSExtensionPointIdentifier diff --git a/package-lock.json b/package-lock.json index d8ac17ad8f08..22385023374c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "new.expensify", - "version": "9.0.45-1", + "version": "9.0.45-2", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "new.expensify", - "version": "9.0.45-1", + "version": "9.0.45-2", "hasInstallScript": true, "license": "MIT", "dependencies": { diff --git a/package.json b/package.json index 15aca5e97146..1387bda002d6 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "new.expensify", - "version": "9.0.45-1", + "version": "9.0.45-2", "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.",