Skip to content

Commit effcb31

Browse files
committed
Merge branch 'main' into paulnjs-fix/88315
2 parents f0ef8d1 + e3bfd1d commit effcb31

359 files changed

Lines changed: 10872 additions & 4612 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/actions/javascript/isDeployChecklistLocked/index.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11816,8 +11816,8 @@ async function generateDeployChecklistBodyAndAssignees({ tag, PRList, PRListMobi
1181611816
const check = (checked) => (checked ? 'x' : ' ');
1181711817
sections.push((0, dedent_1.default)(`
1181811818
**Deployer verifications:**
11819-
- [${check(isSentryChecked)}] I checked [Sentry](https://expensify.sentry.io/releases/new.expensify%40${tag}/?project=app&environment=staging) for **this release version** and verified that this release does not introduce any new crashes. More detailed instructions on this verification can be found [here](https://stackoverflowteams.com/c/expensify/questions/15095/15096).
11820-
- [${check(isSentryChecked)}] I checked [Sentry](https://expensify.sentry.io/releases/new.expensify%40${previousTag}/?project=app&environment=production) for **the previous release version** and verified that the release did not introduce any new crashes. Because mobile deploys use a phased rollout, completing this checklist will deploy the previous release version to 100% of users. More detailed instructions on this verification can be found [here](https://stackoverflowteams.com/c/expensify/questions/15095/15096).
11819+
- [${check(isSentryChecked)}] I checked [Sentry](https://expensify.sentry.io/releases/new.expensify%40${tag}/?project=4510228107427840&environment=staging) for **this release version** and verified that this release does not introduce any new crashes. More detailed instructions on this verification can be found [here](https://stackoverflowteams.com/c/expensify/questions/15095/15096).
11820+
- [${check(isSentryChecked)}] I checked [Sentry](https://expensify.sentry.io/releases/new.expensify%40${previousTag}/?project=4510228107427840&environment=production) for **the previous release version** and verified that the release did not introduce any new crashes. Because mobile deploys use a phased rollout, completing this checklist will deploy the previous release version to 100% of users. More detailed instructions on this verification can be found [here](https://stackoverflowteams.com/c/expensify/questions/15095/15096).
1182111821
- [${check(isGHStatusChecked)}] I checked [GitHub Status](https://www.githubstatus.com/) and verified there is no reported incident with Actions.
1182211822
`).trimEnd());
1182311823
// Footer

.github/libs/DeployChecklistUtils.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -249,8 +249,8 @@ async function generateDeployChecklistBodyAndAssignees({
249249
sections.push(
250250
dedent(`
251251
**Deployer verifications:**
252-
- [${check(isSentryChecked)}] I checked [Sentry](https://expensify.sentry.io/releases/new.expensify%40${tag}/?project=app&environment=staging) for **this release version** and verified that this release does not introduce any new crashes. More detailed instructions on this verification can be found [here](https://stackoverflowteams.com/c/expensify/questions/15095/15096).
253-
- [${check(isSentryChecked)}] I checked [Sentry](https://expensify.sentry.io/releases/new.expensify%40${previousTag}/?project=app&environment=production) for **the previous release version** and verified that the release did not introduce any new crashes. Because mobile deploys use a phased rollout, completing this checklist will deploy the previous release version to 100% of users. More detailed instructions on this verification can be found [here](https://stackoverflowteams.com/c/expensify/questions/15095/15096).
252+
- [${check(isSentryChecked)}] I checked [Sentry](https://expensify.sentry.io/releases/new.expensify%40${tag}/?project=4510228107427840&environment=staging) for **this release version** and verified that this release does not introduce any new crashes. More detailed instructions on this verification can be found [here](https://stackoverflowteams.com/c/expensify/questions/15095/15096).
253+
- [${check(isSentryChecked)}] I checked [Sentry](https://expensify.sentry.io/releases/new.expensify%40${previousTag}/?project=4510228107427840&environment=production) for **the previous release version** and verified that the release did not introduce any new crashes. Because mobile deploys use a phased rollout, completing this checklist will deploy the previous release version to 100% of users. More detailed instructions on this verification can be found [here](https://stackoverflowteams.com/c/expensify/questions/15095/15096).
254254
- [${check(isGHStatusChecked)}] I checked [GitHub Status](https://www.githubstatus.com/) and verified there is no reported incident with Actions.
255255
`).trimEnd(),
256256
);

Mobile-Expensify

__mocks__/reportData/violations.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ const receiptErrorsR14932: ReceiptErrors = {
3333
transactionID: RECEIPT_ERRORS_TRANSACTION_ID_R14932,
3434
source: CONST.POLICY.ID_FAKE,
3535
transactionPolicy: undefined,
36+
transactionPolicyTagList: undefined,
3637
},
3738
},
3839
};

android/app/build.gradle

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -111,8 +111,8 @@ android {
111111
minSdkVersion rootProject.ext.minSdkVersion
112112
targetSdkVersion rootProject.ext.targetSdkVersion
113113
multiDexEnabled rootProject.ext.multiDexEnabled
114-
versionCode 1009036803
115-
versionName "9.3.68-3"
114+
versionCode 1009036910
115+
versionName "9.3.69-10"
116116
// Supported language variants must be declared here to avoid from being removed during the compilation.
117117
// This also helps us to not include unnecessary language variants in the APK.
118118
resConfigs "en", "es"

assets/fonts/NotoSansSC-Months.ttf

17.9 KB
Binary file not shown.

config/eslint/eslint.seatbelt.tsv

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -277,7 +277,6 @@
277277
"../../src/libs/Navigation/AppNavigator/Navigators/RightModalNavigator.tsx" "no-restricted-syntax" 1
278278
"../../src/libs/Navigation/AppNavigator/Navigators/SearchFullscreenNavigator.tsx" "no-restricted-syntax" 1
279279
"../../src/libs/Navigation/AppNavigator/Navigators/TestToolsModalNavigator.tsx" "no-restricted-syntax" 1
280-
"../../src/libs/Navigation/AppNavigator/UserStatusHandler.tsx" "no-restricted-syntax" 1
281280
"../../src/libs/Navigation/helpers/createNormalizedConfigs.ts" "@typescript-eslint/no-deprecated/escape" 1
282281
"../../src/libs/Navigation/helpers/dismissModalAndOpenReportInInboxTab.ts" "@typescript-eslint/no-deprecated/InteractionManager.runAfterInteractions" 1
283282
"../../src/libs/Navigation/navigateAfterInteraction/index.ios.ts" "@typescript-eslint/no-deprecated/InteractionManager.runAfterInteractions" 1
@@ -316,7 +315,7 @@
316315
"../../src/libs/ReportUtils.ts" "rulesdir/no-onyx-connect" 17
317316
"../../src/libs/SearchUIUtils.ts" "@typescript-eslint/no-deprecated/getReportName" 1
318317
"../../src/libs/SearchUIUtils.ts" "@typescript-eslint/no-deprecated/getSearchReportName" 1
319-
"../../src/libs/SubscriptionUtils.ts" "rulesdir/no-onyx-connect" 2
318+
"../../src/libs/SubscriptionUtils.ts" "rulesdir/no-onyx-connect" 1
320319
"../../src/libs/TransactionUtils/index.ts" "@typescript-eslint/no-deprecated/translateLocal" 5
321320
"../../src/libs/UnreadIndicatorUpdater/index.ts" "no-restricted-syntax" 1
322321
"../../src/libs/Violations/ViolationsUtils.ts" "no-restricted-syntax" 2
@@ -344,7 +343,6 @@
344343
"../../src/libs/actions/IOU/PerDiem.ts" "@typescript-eslint/no-deprecated/InteractionManager.runAfterInteractions" 2
345344
"../../src/libs/actions/IOU/PerDiem.ts" "@typescript-eslint/no-deprecated/buildNextStepNew" 1
346345
"../../src/libs/actions/IOU/PerDiem.ts" "no-restricted-syntax" 2
347-
"../../src/libs/actions/IOU/Receipt.ts" "@typescript-eslint/no-deprecated/getPolicyTagsData" 1
348346
"../../src/libs/actions/IOU/Receipt.ts" "no-restricted-syntax" 1
349347
"../../src/libs/actions/IOU/RejectMoneyRequest.ts" "@typescript-eslint/no-deprecated/buildNextStepNew" 2
350348
"../../src/libs/actions/IOU/RejectMoneyRequest.ts" "no-restricted-syntax" 1
@@ -356,7 +354,6 @@
356354
"../../src/libs/actions/IOU/Split.ts" "@typescript-eslint/no-deprecated/InteractionManager.runAfterInteractions" 4
357355
"../../src/libs/actions/IOU/Split.ts" "@typescript-eslint/no-deprecated/Localize.translateLocal" 2
358356
"../../src/libs/actions/IOU/Split.ts" "@typescript-eslint/no-deprecated/getMoneyRequestPolicyTags" 1
359-
"../../src/libs/actions/IOU/Split.ts" "@typescript-eslint/no-deprecated/getPolicyTagsData" 1
360357
"../../src/libs/actions/IOU/Split.ts" "no-restricted-syntax" 3
361358
"../../src/libs/actions/IOU/SplitTransactionUpdate.ts" "@typescript-eslint/no-deprecated/InteractionManager.runAfterInteractions" 1
362359
"../../src/libs/actions/IOU/SplitTransactionUpdate.ts" "@typescript-eslint/no-deprecated/getMoneyRequestPolicyTags" 1
@@ -489,7 +486,6 @@
489486
"../../src/pages/ScheduleCall/ScheduleCallPage.tsx" "react-hooks/preserve-manual-memoization" 1
490487
"../../src/pages/Search/SearchAdvancedFiltersPage/SearchFiltersCardPage.tsx" "react-hooks/set-state-in-effect" 1
491488
"../../src/pages/Search/SearchMoneyRequestReportPage.tsx" "@typescript-eslint/no-deprecated/InteractionManager.runAfterInteractions" 1
492-
"../../src/pages/Search/SearchPage.tsx" "react-hooks/refs" 31
493489
"../../src/pages/Search/SearchPage.tsx" "react-hooks/set-state-in-effect" 1
494490
"../../src/pages/Search/SearchTransactionsChangeReport.tsx" "@typescript-eslint/no-deprecated/InteractionManager.runAfterInteractions" 1
495491
"../../src/pages/Share/ShareRootPage.tsx" "@typescript-eslint/no-deprecated/InteractionManager.runAfterInteractions" 1
@@ -532,6 +528,7 @@
532528
"../../src/pages/inbox/report/TripSummary.tsx" "rulesdir/no-default-id-values" 1
533529
"../../src/pages/inbox/report/UserTypingEventListener.tsx" "@typescript-eslint/no-deprecated/InteractionManager.runAfterInteractions" 4
534530
"../../src/pages/inbox/report/shouldUseEmojiPickerSelection/index.website.ts" "no-restricted-syntax" 1
531+
"../../src/pages/inbox/report/useReportActionsNewActionLiveTail.ts" "@typescript-eslint/no-deprecated/InteractionManager.runAfterInteractions" 1
535532
"../../src/pages/inbox/report/withReportOrNotFound.tsx" "react-hooks/refs" 3
536533
"../../src/pages/inbox/sidebar/SidebarLinksData.tsx" "react-hooks/refs" 1
537534
"../../src/pages/iou/MoneyRequestAmountForm.tsx" "react-hooks/set-state-in-effect" 3
@@ -548,7 +545,7 @@
548545
"../../src/pages/iou/request/step/IOURequestStepDistance.tsx" "react-hooks/set-state-in-effect" 1
549546
"../../src/pages/iou/request/step/IOURequestStepDistanceGPS/BackgroundLocationPermissionsFlow/index.android.tsx" "@typescript-eslint/no-deprecated/ConfirmModal" 3
550547
"../../src/pages/iou/request/step/IOURequestStepDistanceGPS/BackgroundLocationPermissionsFlow/index.ios.tsx" "@typescript-eslint/no-deprecated/ConfirmModal" 2
551-
"../../src/pages/iou/request/step/IOURequestStepDistanceGPS/GPSButtons/index.tsx" "@typescript-eslint/no-deprecated/ConfirmModal" 5
548+
"../../src/pages/iou/request/step/IOURequestStepDistanceGPS/GPSButtons/index.tsx" "@typescript-eslint/no-deprecated/ConfirmModal" 3
552549
"../../src/pages/iou/request/step/IOURequestStepDistanceMap.tsx" "react-hooks/set-state-in-effect" 1
553550
"../../src/pages/iou/request/step/IOURequestStepDistanceOdometer.tsx" "@typescript-eslint/no-deprecated/InteractionManager.runAfterInteractions" 1
554551
"../../src/pages/iou/request/step/IOURequestStepDistanceOdometer.tsx" "react-hooks/set-state-in-effect" 1

config/webpack/webpack.common.ts

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import {fileURLToPath} from 'url';
1414
import webpack from 'webpack';
1515
import type {Configuration, WebpackPluginInstance} from 'webpack';
1616
import {BundleAnalyzerPlugin} from 'webpack-bundle-analyzer';
17+
import {GenerateSW} from 'workbox-webpack-plugin';
1718
// Storybook 10 loads TS files directly and requires .ts extension for ESM imports
1819
// @ts-expect-error -- Can't use .ts extensions without allowImportingTsExtensions in tsconfig
1920
// eslint-disable-next-line import/extensions
@@ -125,6 +126,40 @@ const getCommonConfiguration = ({file = '.env', platform = 'web'}: Environment):
125126
},
126127
plugins: [
127128
new CleanWebpackPlugin(),
129+
// Only emit the SW for non-development builds. In dev, webpack-dev-server's HMR
130+
// and the SW's caching behavior fight each other and confuse hot reloads.
131+
// Remove this guard locally if you want to actually exercise the SW.
132+
...(isDevelopment
133+
? []
134+
: [
135+
new GenerateSW({
136+
clientsClaim: true,
137+
skipWaiting: true,
138+
// Cap is generous on purpose: the vendor (~6.5 MiB), main (~5.5 MiB),
139+
// authScreens.prefetch (~6.3 MiB) chunks and canvaskit.wasm (~7.6 MiB) are
140+
// all critical for offline boot, so we precache the lot. Everything in the
141+
// App build is content-hashed, so growth here only costs first-install bytes.
142+
maximumFileSizeToCacheInBytes: 10 * 1024 * 1024,
143+
// Single-page app: any unmatched navigation should serve the cached app shell.
144+
navigateFallback: '/index.html',
145+
// Don't fall back for asset-like or .well-known requests.
146+
navigateFallbackDenylist: [/^\/_/, /^\/\.well-known/, /\/[^/?]+\.[^/]+$/],
147+
runtimeCaching: [
148+
{
149+
// Same-origin user media (receipts, chat attachments) — cache opportunistically
150+
// so they're viewable on offline refresh. The function below is serialized into
151+
// the generated service worker, so it executes in the SW context where
152+
// `sameOrigin` is the appropriate Workbox match (no need to read `self.location`).
153+
urlPattern: ({sameOrigin, url, request}) => sameOrigin && (request.destination === 'image' || /\/(receipts|chat-attachments)\//.test(url.pathname)),
154+
handler: 'StaleWhileRevalidate',
155+
options: {
156+
cacheName: 'user-media',
157+
expiration: {maxEntries: 200, maxAgeSeconds: 7 * 24 * 60 * 60},
158+
},
159+
},
160+
],
161+
}),
162+
]),
128163
new HtmlWebpackPlugin({
129164
template: 'web/index.html',
130165
filename: 'index.html',

cspell.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -800,6 +800,7 @@
800800
"Unmigrated",
801801
"unmuting",
802802
"unredacted",
803+
"unregisters",
803804
"unscrollable",
804805
"unsharing",
805806
"Unsharing",

docs/articles/new-expensify/connect-credit-cards/Share-a-Company-Card-Connection-Across-Workspaces.md

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,9 @@ Workspace Admins with an email on a private domain can share a company card feed
3434
1. Click the navigation tabs (on the left on web, on the bottom on mobile) and select **Workspaces > [Workspace Name]**
3535
2. Choose **Company cards** to view your company’s card setup page.
3636
- If you don't see **Company cards**, enable the feature under **More features > Company cards**
37-
3. Select your existing card connection.
38-
4. In **From other workspaces**, choose a company card feed to add to the Workspace.
37+
3. Click **Add cards**.
38+
4. Select your existing card connection.
39+
5. In **From other workspaces**, choose a company card feed to add to the Workspace.
3940

4041
---
4142

0 commit comments

Comments
 (0)