Skip to content

Commit aabf459

Browse files
Merge branch 'main' into chore/eslint-config-expensify-2.0.100
2 parents 9c697c5 + ce35545 commit aabf459

156 files changed

Lines changed: 3113 additions & 1665 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.

Mobile-Expensify

android/app/build.gradle

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -114,8 +114,8 @@ android {
114114
minSdkVersion rootProject.ext.minSdkVersion
115115
targetSdkVersion rootProject.ext.targetSdkVersion
116116
multiDexEnabled rootProject.ext.multiDexEnabled
117-
versionCode 1009026308
118-
versionName "9.2.63-8"
117+
versionCode 1009026403
118+
versionName "9.2.64-3"
119119
// Supported language variants must be declared here to avoid from being removed during the compilation.
120120
// This also helps us to not include unnecessary language variants in the APK.
121121
resConfigs "en", "es"
693 Bytes
Loading

ios/NewExpensify/Info.plist

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
<key>CFBundlePackageType</key>
2424
<string>APPL</string>
2525
<key>CFBundleShortVersionString</key>
26-
<string>9.2.63</string>
26+
<string>9.2.64</string>
2727
<key>CFBundleSignature</key>
2828
<string>????</string>
2929
<key>CFBundleURLTypes</key>
@@ -44,7 +44,7 @@
4444
</dict>
4545
</array>
4646
<key>CFBundleVersion</key>
47-
<string>9.2.63.8</string>
47+
<string>9.2.64.3</string>
4848
<key>FullStory</key>
4949
<dict>
5050
<key>OrgId</key>

ios/NotificationServiceExtension/Info.plist

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,9 @@
1111
<key>CFBundleName</key>
1212
<string>$(PRODUCT_NAME)</string>
1313
<key>CFBundleShortVersionString</key>
14-
<string>9.2.63</string>
14+
<string>9.2.64</string>
1515
<key>CFBundleVersion</key>
16-
<string>9.2.63.8</string>
16+
<string>9.2.64.3</string>
1717
<key>NSExtension</key>
1818
<dict>
1919
<key>NSExtensionPointIdentifier</key>

ios/ShareViewController/Info.plist

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,9 @@
1111
<key>CFBundleName</key>
1212
<string>$(PRODUCT_NAME)</string>
1313
<key>CFBundleShortVersionString</key>
14-
<string>9.2.63</string>
14+
<string>9.2.64</string>
1515
<key>CFBundleVersion</key>
16-
<string>9.2.63.8</string>
16+
<string>9.2.64.3</string>
1717
<key>NSExtension</key>
1818
<dict>
1919
<key>NSExtensionAttributes</key>

jest/setup.ts

Lines changed: 66 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
/* eslint-disable max-classes-per-file */
22
import * as core from '@actions/core';
33
import '@shopify/flash-list/jestSetup';
4+
import {useMemo} from 'react';
45
import type * as RNAppLogs from 'react-native-app-logs';
6+
import type {ReadDirItem} from 'react-native-fs';
57
import 'react-native-gesture-handler/jestSetup';
68
import type * as RNKeyboardController from 'react-native-keyboard-controller';
79
import mockStorage from 'react-native-onyx/dist/storage/__mocks__';
@@ -69,6 +71,12 @@ jest.mock('react-native-fs', () => ({
6971
res();
7072
}),
7173
),
74+
readDir: jest.fn(
75+
() =>
76+
new Promise<ReadDirItem[]>((res) => {
77+
res([]);
78+
}),
79+
),
7280
CachesDirectoryPath: jest.fn(),
7381
}));
7482

@@ -135,60 +143,70 @@ jest.mock('../modules/hybrid-app/src/NativeReactNativeHybridApp', () => ({
135143
clearOldDotAfterSignOut: jest.fn(),
136144
}));
137145

146+
const mockUseMemo = useMemo;
147+
138148
// Mock lazy asset loading to be synchronous in tests
139149
jest.mock('../src/hooks/useLazyAsset.ts', () => ({
140-
useMemoizedLazyAsset: jest.fn(() => {
141-
// Return a mock asset immediately to avoid async loading in tests
142-
const mockAsset = {
143-
src: 'mock-icon',
144-
testID: 'mock-asset',
145-
// Add common icon properties that tests might expect
146-
height: 20,
147-
width: 20,
148-
};
149-
150-
return {
151-
asset: mockAsset,
152-
isLoaded: true,
153-
isLoading: false,
154-
hasError: false,
155-
};
156-
}),
157-
useMemoizedLazyIllustrations: jest.fn((names: readonly string[]) => {
158-
// Return a Record with all requested illustration names
159-
const mockIllustrations: Record<string, unknown> = {};
160-
for (const name of names) {
161-
mockIllustrations[name] = {
162-
src: `mock-${name}`,
163-
testID: `mock-illustration-${name}`,
150+
useMemoizedLazyAsset: jest.fn((importFn) =>
151+
mockUseMemo(() => {
152+
// Return a mock asset immediately to avoid async loading in tests
153+
const mockAsset = {
154+
src: 'mock-icon',
155+
testID: 'mock-asset',
156+
// Add common icon properties that tests might expect
164157
height: 20,
165158
width: 20,
166159
};
167-
}
168-
return mockIllustrations;
169-
}),
170-
useMemoizedLazyExpensifyIcons: jest.fn((names: readonly string[]) => {
171-
// Return a Record with all requested icon names
172-
const mockIcons: Record<string, unknown> = {};
173-
for (const name of names) {
174-
mockIcons[name] = {
175-
src: `mock-${name}`,
176-
testID: `mock-expensify-icon-${name}`,
177-
height: 20,
178-
width: 20,
160+
161+
return {
162+
asset: mockAsset,
163+
isLoaded: true,
164+
isLoading: false,
165+
hasError: false,
179166
};
180-
}
181-
return mockIcons;
182-
}),
183-
default: jest.fn(() => {
184-
const mockAsset = {src: 'mock-icon', testID: 'mock-asset'};
185-
return {
186-
asset: mockAsset,
187-
isLoaded: true,
188-
isLoading: false,
189-
hasError: false,
190-
};
191-
}),
167+
}, [importFn]),
168+
),
169+
useMemoizedLazyIllustrations: jest.fn((names: readonly string[]) =>
170+
mockUseMemo(() => {
171+
// Return a Record with all requested illustration names
172+
const mockIllustrations: Record<string, unknown> = {};
173+
for (const name of names) {
174+
mockIllustrations[name] = {
175+
src: `mock-${name}`,
176+
testID: `mock-illustration-${name}`,
177+
height: 20,
178+
width: 20,
179+
};
180+
}
181+
return mockIllustrations;
182+
}, [names]),
183+
),
184+
useMemoizedLazyExpensifyIcons: jest.fn((names: readonly string[]) =>
185+
mockUseMemo(() => {
186+
// Return a Record with all requested icon names
187+
const mockIcons: Record<string, unknown> = {};
188+
for (const name of names) {
189+
mockIcons[name] = {
190+
src: `mock-${name}`,
191+
testID: `mock-expensify-icon-${name}`,
192+
height: 20,
193+
width: 20,
194+
};
195+
}
196+
return mockIcons;
197+
}, [names]),
198+
),
199+
default: jest.fn((importFn) =>
200+
mockUseMemo(() => {
201+
const mockAsset = {src: 'mock-icon', testID: 'mock-asset'};
202+
return {
203+
asset: mockAsset,
204+
isLoaded: true,
205+
isLoading: false,
206+
hasError: false,
207+
};
208+
}, [importFn]),
209+
),
192210
}));
193211

194212
// Mock icon loading functions to resolve immediately

package-lock.json

Lines changed: 6 additions & 24 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "new.expensify",
3-
"version": "9.2.63-8",
3+
"version": "9.2.64-3",
44
"author": "Expensify, Inc.",
55
"homepage": "https://new.expensify.com",
66
"description": "New Expensify is the next generation of Expensify: a reimagination of payments based atop a foundation of chat.",
@@ -321,7 +321,7 @@
321321
"eslint-plugin-storybook": "^0.12.0",
322322
"eslint-plugin-testing-library": "^7.11.0",
323323
"eslint-plugin-you-dont-need-lodash-underscore": "^6.14.0",
324-
"glob": "^10.3.0",
324+
"glob": "^10.4.5",
325325
"googleapis": "^144.0.0",
326326
"html-webpack-plugin": "^5.5.0",
327327
"http-server": "^14.1.1",

src/CONST/index.ts

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1025,6 +1025,7 @@ const CONST = {
10251025
BULK_UPLOAD_HELP_URL: 'https://help.expensify.com/articles/new-expensify/reports-and-expenses/Create-an-Expense#option-4-bulk-upload-receipts-desktop-only',
10261026
ENCRYPTION_AND_SECURITY_HELP_URL: 'https://help.expensify.com/articles/new-expensify/settings/Encryption-and-Data-Security',
10271027
PLAN_TYPES_AND_PRICING_HELP_URL: 'https://help.expensify.com/articles/new-expensify/billing-and-subscriptions/Plan-types-and-pricing',
1028+
COLLECT_UPGRADE_HELP_URL: 'https://help.expensify.com/Hidden/collect-upgrade',
10281029
MERGE_ACCOUNT_HELP_URL: 'https://help.expensify.com/articles/new-expensify/settings/Merge-Accounts',
10291030
CONNECT_A_BUSINESS_BANK_ACCOUNT_HELP_URL: 'https://help.expensify.com/articles/new-expensify/expenses-&-payments/Connect-a-Business-Bank-Account',
10301031
DOMAIN_VERIFICATION_HELP_URL: 'https://help.expensify.com/articles/expensify-classic/domains/Claim-And-Verify-A-Domain',
@@ -1132,7 +1133,6 @@ const CONST = {
11321133
EXPORT: 'export',
11331134
PAY: 'pay',
11341135
MERGE: 'merge',
1135-
REPORT_LAYOUT: 'reportLayout',
11361136
},
11371137
PRIMARY_ACTIONS: {
11381138
SUBMIT: 'submit',
@@ -1339,6 +1339,7 @@ const CONST = {
13391339
UPDATE_TIME_RATE: 'POLICYCHANGELOG_UPDATE_TIME_RATE',
13401340
LEAVE_POLICY: 'POLICYCHANGELOG_LEAVE_POLICY',
13411341
CORPORATE_UPGRADE: 'POLICYCHANGELOG_CORPORATE_UPGRADE',
1342+
CORPORATE_FORCE_UPGRADE: 'POLICYCHANGELOG_CORPORATE_FORCE_UPGRADE',
13421343
TEAM_DOWNGRADE: 'POLICYCHANGELOG_TEAM_DOWNGRADE',
13431344
},
13441345
RECEIPT_SCAN_FAILED: 'RECEIPTSCANFAILED',
@@ -1536,6 +1537,7 @@ const CONST = {
15361537
WAITING_TO_PAY: 'waitingToPay',
15371538
WAITING_FOR_POLICY_BANK_ACCOUNT: 'waitingForPolicyBankAccount',
15381539
WAITING_FOR_PAYMENT: 'waitingForPayment',
1540+
WAITING_TO_EXPORT: 'waitingToExport',
15391541
},
15401542
ICONS: {
15411543
HOURGLASS: 'hourglass',
@@ -1682,12 +1684,6 @@ const CONST = {
16821684
GSD: 'gsd',
16831685
DEFAULT: 'default',
16841686
},
1685-
REPORT_LAYOUT: {
1686-
GROUP_BY: {
1687-
CATEGORY: 'mcc',
1688-
TAG: 'tag',
1689-
},
1690-
},
16911687
THEME: {
16921688
DEFAULT: 'system',
16931689
FALLBACK: 'dark',

0 commit comments

Comments
 (0)