From 3e9270b7ebc438ba15497a946ac0b5105d7e5cc3 Mon Sep 17 00:00:00 2001 From: rory Date: Fri, 7 Jul 2023 15:36:01 -0700 Subject: [PATCH 001/775] 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 d8eb4262395888cb5147c63fd70fa6a0148d9163 Mon Sep 17 00:00:00 2001 From: christianwen Date: Fri, 8 Dec 2023 17:13:46 +0700 Subject: [PATCH 002/775] fix: 10731 --- src/components/Composer/index.js | 5 +++++ .../ComposerWithSuggestions.js | 18 +++++++++++------- .../ReportActionCompose/ReportActionCompose.js | 6 +----- 3 files changed, 17 insertions(+), 12 deletions(-) diff --git a/src/components/Composer/index.js b/src/components/Composer/index.js index 4bb3df5c1b85..bea38fc38414 100755 --- a/src/components/Composer/index.js +++ b/src/components/Composer/index.js @@ -86,6 +86,8 @@ const propTypes = { /** Whether the sull composer is open */ isComposerFullSize: PropTypes.bool, + showSoftInputOnFocus: PropTypes.bool, + ...withLocalizePropTypes, }; @@ -113,6 +115,7 @@ const defaultProps = { checkComposerVisibility: () => false, isReportActionCompose: false, isComposerFullSize: false, + showSoftInputOnFocus: true, }; /** @@ -164,6 +167,7 @@ function Composer({ selection: selectionProp, isReportActionCompose, isComposerFullSize, + showSoftInputOnFocus, ...props }) { const theme = useTheme(); @@ -445,6 +449,7 @@ function Composer({ forwardedRef={forwardedRef} defaultValue={defaultValue} autoFocus={autoFocus} + inputMode={!showSoftInputOnFocus && 'none'} /* eslint-disable-next-line react/jsx-props-no-spreading */ {...props} onSelectionChange={addCursorPositionToSelectionChange} diff --git a/src/pages/home/report/ReportActionCompose/ComposerWithSuggestions/ComposerWithSuggestions.js b/src/pages/home/report/ReportActionCompose/ComposerWithSuggestions/ComposerWithSuggestions.js index f99bd7ab7d9d..5cd9fe8be1d5 100644 --- a/src/pages/home/report/ReportActionCompose/ComposerWithSuggestions/ComposerWithSuggestions.js +++ b/src/pages/home/report/ReportActionCompose/ComposerWithSuggestions/ComposerWithSuggestions.js @@ -49,10 +49,6 @@ const debouncedBroadcastUserIsTyping = _.debounce((reportID) => { const willBlurTextInputOnTapOutside = willBlurTextInputOnTapOutsideFunc(); -// We want consistent auto focus behavior on input between native and mWeb so we have some auto focus management code that will -// prevent auto focus on existing chat for mobile device -const shouldFocusInputOnScreenFocus = canFocusInputOnScreenFocus(); - /** * This component holds the value and selection state. * If a component really needs access to these state values it should be put here. @@ -120,9 +116,9 @@ function ComposerWithSuggestions({ const {isSmallScreenWidth} = useWindowDimensions(); const maxComposerLines = isSmallScreenWidth ? CONST.COMPOSER.MAX_LINES_SMALL_SCREEN : CONST.COMPOSER.MAX_LINES; - const isEmptyChat = useMemo(() => _.size(reportActions) === 1, [reportActions]); - const parentAction = ReportActionsUtils.getParentReportAction(report); - const shouldAutoFocus = !modal.isVisible && (shouldFocusInputOnScreenFocus || (isEmptyChat && !ReportActionsUtils.isTransactionThread(parentAction))) && shouldShowComposeInput; + const shouldAutoFocus = !modal.isVisible && shouldShowComposeInput; + + const [showSoftInputOnFocus, setShowSoftInputOnFocus] = useState(false); const valueRef = useRef(value); valueRef.current = value; @@ -556,6 +552,14 @@ function ComposerWithSuggestions({ setComposerHeight(composerLayoutHeight); }} onScroll={hideSuggestionMenu} + showSoftInputOnFocus={showSoftInputOnFocus} + onTouchStart={() => { + if (showSoftInputOnFocus) { + return; + } + + setShowSoftInputOnFocus(true); + }} /> diff --git a/src/pages/home/report/ReportActionCompose/ReportActionCompose.js b/src/pages/home/report/ReportActionCompose/ReportActionCompose.js index 2632324a963f..885d566cf450 100644 --- a/src/pages/home/report/ReportActionCompose/ReportActionCompose.js +++ b/src/pages/home/report/ReportActionCompose/ReportActionCompose.js @@ -89,10 +89,6 @@ const defaultProps = { ...withCurrentUserPersonalDetailsDefaultProps, }; -// We want consistent auto focus behavior on input between native and mWeb so we have some auto focus management code that will -// prevent auto focus on existing chat for mobile device -const shouldFocusInputOnScreenFocus = canFocusInputOnScreenFocus(); - const willBlurTextInputOnTapOutside = willBlurTextInputOnTapOutsideFunc(); function ReportActionCompose({ @@ -121,7 +117,7 @@ function ReportActionCompose({ */ const [isFocused, setIsFocused] = useState(() => { const initialModalState = getModalState(); - return shouldFocusInputOnScreenFocus && shouldShowComposeInput && !initialModalState.isVisible && !initialModalState.willAlertModalBecomeVisible; + return shouldShowComposeInput && !initialModalState.isVisible && !initialModalState.willAlertModalBecomeVisible; }); const [isFullComposerAvailable, setIsFullComposerAvailable] = useState(isComposerFullSize); From a5f99b738732b9d3609bb7c5ef4a826fabf8169b Mon Sep 17 00:00:00 2001 From: christianwen Date: Mon, 11 Dec 2023 11:42:09 +0700 Subject: [PATCH 003/775] lint fix --- .../ComposerWithSuggestions/ComposerWithSuggestions.js | 1 - src/pages/home/report/ReportActionCompose/ReportActionCompose.js | 1 - 2 files changed, 2 deletions(-) diff --git a/src/pages/home/report/ReportActionCompose/ComposerWithSuggestions/ComposerWithSuggestions.js b/src/pages/home/report/ReportActionCompose/ComposerWithSuggestions/ComposerWithSuggestions.js index d39ad7e8ff0c..ad8e5daa6256 100644 --- a/src/pages/home/report/ReportActionCompose/ComposerWithSuggestions/ComposerWithSuggestions.js +++ b/src/pages/home/report/ReportActionCompose/ComposerWithSuggestions/ComposerWithSuggestions.js @@ -10,7 +10,6 @@ import useDebounce from '@hooks/useDebounce'; import useLocalize from '@hooks/useLocalize'; import usePrevious from '@hooks/usePrevious'; import useWindowDimensions from '@hooks/useWindowDimensions'; -import canFocusInputOnScreenFocus from '@libs/canFocusInputOnScreenFocus'; import compose from '@libs/compose'; import * as ComposerUtils from '@libs/ComposerUtils'; import getDraftComment from '@libs/ComposerUtils/getDraftComment'; diff --git a/src/pages/home/report/ReportActionCompose/ReportActionCompose.js b/src/pages/home/report/ReportActionCompose/ReportActionCompose.js index 885d566cf450..cd49f1b0585d 100644 --- a/src/pages/home/report/ReportActionCompose/ReportActionCompose.js +++ b/src/pages/home/report/ReportActionCompose/ReportActionCompose.js @@ -15,7 +15,6 @@ import {usePersonalDetails, withNetwork} from '@components/OnyxProvider'; import withCurrentUserPersonalDetails, {withCurrentUserPersonalDetailsDefaultProps, withCurrentUserPersonalDetailsPropTypes} from '@components/withCurrentUserPersonalDetails'; import useLocalize from '@hooks/useLocalize'; import useWindowDimensions from '@hooks/useWindowDimensions'; -import canFocusInputOnScreenFocus from '@libs/canFocusInputOnScreenFocus'; import compose from '@libs/compose'; import getDraftComment from '@libs/ComposerUtils/getDraftComment'; import * as DeviceCapabilities from '@libs/DeviceCapabilities'; From f6e2e28c0d57cacfeed4c2c615936b42122a1c59 Mon Sep 17 00:00:00 2001 From: christianwen Date: Tue, 2 Jan 2024 16:00:51 +0700 Subject: [PATCH 004/775] lint fix --- src/components/Composer/index.tsx | 2 +- src/components/Composer/types.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/Composer/index.tsx b/src/components/Composer/index.tsx index 849bf14594df..d6249a1e3dcc 100755 --- a/src/components/Composer/index.tsx +++ b/src/components/Composer/index.tsx @@ -363,7 +363,7 @@ function Composer( value={value} defaultValue={defaultValue} autoFocus={autoFocus} - inputMode={!showSoftInputOnFocus ? 'none': 'text'} + inputMode={!showSoftInputOnFocus ? 'none' : 'text'} /* eslint-disable-next-line react/jsx-props-no-spreading */ {...props} onSelectionChange={addCursorPositionToSelectionChange} diff --git a/src/components/Composer/types.ts b/src/components/Composer/types.ts index 208def7fabab..92ecc5038be4 100644 --- a/src/components/Composer/types.ts +++ b/src/components/Composer/types.ts @@ -72,7 +72,7 @@ type ComposerProps = { /** Should make the input only scroll inside the element avoid scroll out to parent */ shouldContainScroll?: boolean; - showSoftInputOnFocus?: boolean, + showSoftInputOnFocus?: boolean; }; export type {TextSelection, ComposerProps}; From 7e930b8e104ba234ea360d9db1750299f5816cf3 Mon Sep 17 00:00:00 2001 From: christianwen Date: Thu, 25 Jan 2024 17:49:48 +0700 Subject: [PATCH 005/775] lint fix --- .../ComposerWithSuggestions/ComposerWithSuggestions.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pages/home/report/ReportActionCompose/ComposerWithSuggestions/ComposerWithSuggestions.js b/src/pages/home/report/ReportActionCompose/ComposerWithSuggestions/ComposerWithSuggestions.js index 535344e38786..c80016519ee6 100644 --- a/src/pages/home/report/ReportActionCompose/ComposerWithSuggestions/ComposerWithSuggestions.js +++ b/src/pages/home/report/ReportActionCompose/ComposerWithSuggestions/ComposerWithSuggestions.js @@ -120,7 +120,7 @@ function ComposerWithSuggestions({ const {isSmallScreenWidth} = useWindowDimensions(); const maxComposerLines = isSmallScreenWidth ? CONST.COMPOSER.MAX_LINES_SMALL_SCREEN : CONST.COMPOSER.MAX_LINES; - + const parentReportAction = lodashGet(parentReportActions, [report.parentReportActionID]); const shouldAutoFocus = !modal.isVisible && shouldShowComposeInput; From 5dc692229b23addada41e7486d63a181d53f91dd Mon Sep 17 00:00:00 2001 From: christianwen Date: Tue, 5 Mar 2024 16:14:36 +0700 Subject: [PATCH 006/775] fix focus input --- src/components/Composer/index.tsx | 12 ++++++ .../ComposerWithSuggestions.tsx | 38 +++++++------------ .../ReportActionCompose.tsx | 7 +--- 3 files changed, 26 insertions(+), 31 deletions(-) diff --git a/src/components/Composer/index.tsx b/src/components/Composer/index.tsx index 51bebd710e62..ffdb6825a211 100755 --- a/src/components/Composer/index.tsx +++ b/src/components/Composer/index.tsx @@ -327,6 +327,18 @@ function Composer( [numberOfLines, scrollStyleMemo, styles.rtlTextRenderForSafari, style, StyleUtils, isComposerFullSize], ); + useEffect(() => { + if (!showSoftInputOnFocus) { + return; + } + textInput.current?.blur(); + // On Safari when changing inputMode from none to text, the keyboard will cover the view + // We need the logic to re-focus to trigger the keyboard to open below the view + setTimeout(() => { + textInput.current?.focus(); + }, 2000); + }, [showSoftInputOnFocus]); + return ( <> ; - /** The parent report actions for the report */ - parentReportActions: OnyxEntry; - /** The modal state */ modal: OnyxEntry; @@ -155,21 +150,11 @@ type ComposerWithSuggestionsProps = ComposerWithSuggestionsOnyxProps & /** Whether the edit is focused */ editFocused: boolean; - /** Wheater chat is empty */ - isEmptyChat?: boolean; - /** The last report action */ lastReportAction?: OnyxTypes.ReportAction; /** Whether to include chronos */ includeChronos?: boolean; - - /** The parent report action ID */ - parentReportActionID?: string; - - /** The parent report ID */ - // eslint-disable-next-line react/no-unused-prop-types -- its used in the withOnyx HOC - parentReportID: string | undefined; }; const {RNTextInputReset} = NativeModules; @@ -196,15 +181,12 @@ function ComposerWithSuggestions( // Onyx modal, preferredSkinTone = CONST.EMOJI_DEFAULT_SKIN_TONE, - parentReportActions, numberOfLines, // Props: Report reportID, includeChronos, - isEmptyChat, lastReportAction, - parentReportActionID, // Focus onFocus, @@ -262,7 +244,6 @@ function ComposerWithSuggestions( const {isSmallScreenWidth} = useWindowDimensions(); const maxComposerLines = isSmallScreenWidth ? CONST.COMPOSER.MAX_LINES_SMALL_SCREEN : CONST.COMPOSER.MAX_LINES; - const parentReportAction = parentReportActions?.[parentReportActionID ?? ''] ?? null; const shouldAutoFocus = !modal?.isVisible && shouldShowComposeInput; const valueRef = useRef(value); @@ -276,6 +257,7 @@ function ComposerWithSuggestions( const textInputRef = useRef(null); const insertedEmojisRef = useRef([]); + const shouldInitFocus = useRef(true); const syncSelectionWithOnChangeTextRef = useRef(null); @@ -659,7 +641,15 @@ function ComposerWithSuggestions( // We want to focus or refocus the input when a modal has been closed or the underlying screen is refocused. // We avoid doing this on native platforms since the software keyboard popping // open creates a jarring and broken UX. - if (!((willBlurTextInputOnTapOutside || shouldAutoFocus) && !isNextModalWillOpenRef.current && !modal?.isVisible && isFocused && (!!prevIsModalVisible || !prevIsFocused))) { + if ( + !( + (willBlurTextInputOnTapOutside || shouldAutoFocus) && + !isNextModalWillOpenRef.current && + !modal?.isVisible && + isFocused && + (!!prevIsModalVisible || !prevIsFocused || shouldInitFocus.current) + ) + ) { return; } @@ -668,6 +658,9 @@ function ComposerWithSuggestions( return; } focus(true); + if (shouldInitFocus.current) { + shouldInitFocus.current = false; + } }, [focus, prevIsFocused, editFocused, prevIsModalVisible, isFocused, modal?.isVisible, isNextModalWillOpenRef, shouldAutoFocus]); useEffect(() => { @@ -817,11 +810,6 @@ export default withOnyx `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${parentReportID}`, - canEvict: false, - initWithStoredValues: false, - }, })(memo(ComposerWithSuggestionsWithRef)); export type {ComposerWithSuggestionsProps}; diff --git a/src/pages/home/report/ReportActionCompose/ReportActionCompose.tsx b/src/pages/home/report/ReportActionCompose/ReportActionCompose.tsx index bc3bb4fd19d6..345f4a24cfea 100644 --- a/src/pages/home/report/ReportActionCompose/ReportActionCompose.tsx +++ b/src/pages/home/report/ReportActionCompose/ReportActionCompose.tsx @@ -23,7 +23,6 @@ import useLocalize from '@hooks/useLocalize'; import useNetwork from '@hooks/useNetwork'; import useThemeStyles from '@hooks/useThemeStyles'; import useWindowDimensions from '@hooks/useWindowDimensions'; -import compose from '@libs/compose'; import getDraftComment from '@libs/ComposerUtils/getDraftComment'; import * as DeviceCapabilities from '@libs/DeviceCapabilities'; import getModalState from '@libs/getModalState'; @@ -73,7 +72,7 @@ type ReportActionComposeOnyxProps = { type ReportActionComposeProps = ReportActionComposeOnyxProps & WithCurrentUserPersonalDetailsProps & - Pick & { + Pick & { /** A method to call when the form is submitted */ onSubmit: (newComment: string | undefined) => void; @@ -101,7 +100,6 @@ function ReportActionCompose({ listHeight = 0, shouldShowComposeInput = true, isReportReadyForDisplay = true, - isEmptyChat, lastReportAction, }: ReportActionComposeProps) { const styles = useThemeStyles(); @@ -414,10 +412,7 @@ function ReportActionCompose({ isScrollLikelyLayoutTriggered={isScrollLikelyLayoutTriggered} raiseIsScrollLikelyLayoutTriggered={raiseIsScrollLikelyLayoutTriggered} reportID={reportID} - parentReportID={report?.parentReportID} - parentReportActionID={report?.parentReportActionID} includeChronos={ReportUtils.chatIncludesChronos(report)} - isEmptyChat={isEmptyChat} lastReportAction={lastReportAction} isMenuVisible={isMenuVisible} inputPlaceholder={inputPlaceholder} From b6647b48816e5772850cb754c00d9aff5a7ae796 Mon Sep 17 00:00:00 2001 From: christianwen Date: Tue, 5 Mar 2024 17:20:09 +0700 Subject: [PATCH 007/775] focus input on safari --- src/components/Composer/index.tsx | 12 ---------- .../ComposerWithSuggestions.tsx | 22 ++++++++++++++++++- 2 files changed, 21 insertions(+), 13 deletions(-) diff --git a/src/components/Composer/index.tsx b/src/components/Composer/index.tsx index ffdb6825a211..51bebd710e62 100755 --- a/src/components/Composer/index.tsx +++ b/src/components/Composer/index.tsx @@ -327,18 +327,6 @@ function Composer( [numberOfLines, scrollStyleMemo, styles.rtlTextRenderForSafari, style, StyleUtils, isComposerFullSize], ); - useEffect(() => { - if (!showSoftInputOnFocus) { - return; - } - textInput.current?.blur(); - // On Safari when changing inputMode from none to text, the keyboard will cover the view - // We need the logic to re-focus to trigger the keyboard to open below the view - setTimeout(() => { - textInput.current?.focus(); - }, 2000); - }, [showSoftInputOnFocus]); - return ( <> (null); const insertedEmojisRef = useRef([]); const shouldInitFocus = useRef(true); + const isFocusedWhileChangingInputMode = useRef(false); const syncSelectionWithOnChangeTextRef = useRef(null); @@ -711,6 +712,16 @@ function ComposerWithSuggestions( // eslint-disable-next-line react-hooks/exhaustive-deps }, []); + useEffect(() => { + if (!showSoftInputOnFocus || !isFocusedWhileChangingInputMode.current) { + return; + } + // On Safari when changing inputMode from none to text, the keyboard will cover the view + // We need to re-focus to trigger the keyboard to open below the view + isFocusedWhileChangingInputMode.current = false; + textInputRef.current?.focus(); + }, [showSoftInputOnFocus]); + return ( <> @@ -727,7 +738,12 @@ function ComposerWithSuggestions( style={[styles.textInputCompose, isComposerFullSize ? styles.textInputFullCompose : styles.textInputCollapseCompose]} maxLines={maxComposerLines} onFocus={onFocus} - onBlur={onBlur} + onBlur={(e) => { + if (isFocusedWhileChangingInputMode.current) { + return; + } + onBlur(e); + }} onClick={setShouldBlockSuggestionCalcToFalse} onPasteFile={displayFileInModal} shouldClear={textInputShouldClear} @@ -751,6 +767,10 @@ function ComposerWithSuggestions( if (showSoftInputOnFocus) { return; } + if (Browser.isMobileSafari()) { + isFocusedWhileChangingInputMode.current = true; + textInputRef.current?.blur(); + } setShowSoftInputOnFocus(true); }} From cb1be523c0d5e8f139a29bd482add784decac732 Mon Sep 17 00:00:00 2001 From: rory Date: Tue, 9 Apr 2024 11:42:57 -0700 Subject: [PATCH 008/775] 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 eb79042fcbecc617a2e4651fb3353efb2fa9e8c1 Mon Sep 17 00:00:00 2001 From: christianwen Date: Wed, 10 Apr 2024 11:09:59 +0700 Subject: [PATCH 009/775] lint fix --- .../home/report/ReportActionCompose/ReportActionCompose.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/src/pages/home/report/ReportActionCompose/ReportActionCompose.tsx b/src/pages/home/report/ReportActionCompose/ReportActionCompose.tsx index 6214b30e8278..a10e3bd0a36c 100644 --- a/src/pages/home/report/ReportActionCompose/ReportActionCompose.tsx +++ b/src/pages/home/report/ReportActionCompose/ReportActionCompose.tsx @@ -23,7 +23,6 @@ import useLocalize from '@hooks/useLocalize'; import useNetwork from '@hooks/useNetwork'; import useThemeStyles from '@hooks/useThemeStyles'; import useWindowDimensions from '@hooks/useWindowDimensions'; -import canFocusInputOnScreenFocus from '@libs/canFocusInputOnScreenFocus'; import * as DeviceCapabilities from '@libs/DeviceCapabilities'; import {getDraftComment} from '@libs/DraftCommentUtils'; import getModalState from '@libs/getModalState'; From 97b6c82050ab3abc1e0372ececfb37b2b2893c44 Mon Sep 17 00:00:00 2001 From: rory Date: Tue, 9 Jul 2024 09:47:07 -0700 Subject: [PATCH 010/775] 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 011/775] 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 012/775] 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 659/775] 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 660/775] 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 661/775] 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 662/775] 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 663/775] 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 664/775] 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 665/775] 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 666/775] 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 667/775] 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 668/775] 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 669/775] 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 670/775] 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 671/775] 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 672/775] 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 673/775] 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 674/775] 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 675/775] 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 676/775] 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 677/775] 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 678/775] 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 679/775] 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 680/775] 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 681/775] 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 682/775] 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 683/775] 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 684/775] 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 685/775] -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 686/775] 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 687/775] 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 688/775] 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 689/775] 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 690/775] 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 691/775] 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 692/775] 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 693/775] 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 694/775] 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 695/775] 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 696/775] 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 697/775] 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 698/775] 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 699/775] 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 700/775] 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 701/775] 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 702/775] 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 703/775] 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 704/775] 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 705/775] 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 706/775] 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 707/775] 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 708/775] 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 709/775] 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 710/775] 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 711/775] 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 712/775] 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 713/775] 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 714/775] 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 715/775] 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 716/775] 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 717/775] 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 718/775] 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 e61ee7fbe60acc12879b9d5cc6ef92c4a0b98caa Mon Sep 17 00:00:00 2001 From: OSBotify Date: Thu, 3 Oct 2024 03:17:30 +0000 Subject: [PATCH 719/775] 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 52c3de16dee277c3695ab70d9b2d33afcfdf2e35 Mon Sep 17 00:00:00 2001 From: nkdengineer Date: Thu, 3 Oct 2024 11:16:59 +0700 Subject: [PATCH 720/775] 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 2790ba4f1069d7be2fd400d98336f5dd89d8e16b Mon Sep 17 00:00:00 2001 From: Tomasz Misiukiewicz Date: Thu, 3 Oct 2024 08:43:34 +0200 Subject: [PATCH 721/775] 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 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 722/775] 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 723/775] 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 dfb3325cd9bbc0a21e3283262096c83cdead0249 Mon Sep 17 00:00:00 2001 From: Jakub Szymczak Date: Thu, 3 Oct 2024 12:35:29 +0200 Subject: [PATCH 724/775] 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 725/775] 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 726/775] 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 727/775] 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 728/775] 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 729/775] 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 730/775] 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 731/775] 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 732/775] 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 733/775] 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 cb58008a60d1ba1afcbe53bd5df903a465d622ab Mon Sep 17 00:00:00 2001 From: OSBotify Date: Thu, 3 Oct 2024 15:45:36 +0000 Subject: [PATCH 734/775] 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 735/775] 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 736/775] 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 737/775] 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 738/775] 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 739/775] 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 740/775] 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 741/775] 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 742/775] 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 743/775] 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 744/775] 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 745/775] 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 746/775] 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 747/775] 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 748/775] 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 749/775] 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 750/775] 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 751/775] 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 752/775] 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 753/775] 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 754/775] 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 755/775] 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 756/775] 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 757/775] 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 758/775] 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 759/775] 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 760/775] 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 346359ec2ee6304b39f0146ebc3bb87a59b3efbb Mon Sep 17 00:00:00 2001 From: rory Date: Thu, 3 Oct 2024 13:41:05 -0700 Subject: [PATCH 761/775] 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 762/775] 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 763/775] 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 764/775] 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 765/775] 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 766/775] 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 767/775] 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 768/775] 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 769/775] 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 770/775] 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 771/775] 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 772/775] 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 773/775] 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 774/775] 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 771611147a3d2df5f3ed3a41df43dee5d927ef80 Mon Sep 17 00:00:00 2001 From: Sasha Kluger Date: Thu, 3 Oct 2024 22:26:27 -0700 Subject: [PATCH 775/775] 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: