Skip to content

Commit cf290b1

Browse files
author
Hayata Suenaga
committed
Merge branch 'main' into hayata-do-not-allow-users-from-requiring-tags-when-there-is-no-active-tags
2 parents a6a3c05 + 5900fea commit cf290b1

File tree

338 files changed

+6927
-5116
lines changed

Some content is hidden

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

338 files changed

+6927
-5116
lines changed

.eslintignore

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,11 @@
1-
**/node_modules/*
2-
**/dist/*
3-
android/**/build/*
4-
.github/actions/**/index.js"
1+
!.storybook
2+
!.github
3+
.github/actions/**/index.js
4+
*.config.js
5+
**/.eslintrc.js
6+
**/node_modules/**
7+
**/dist/**
8+
android/**/build/**
59
docs/vendor/**
10+
docs/assets/**
11+
web/gtm.js

.eslintrc.js

Lines changed: 164 additions & 207 deletions
Large diffs are not rendered by default.

.github/.eslintrc.js

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
1-
// For all these Node.js scripts, we do not want to disable `console` statements
21
module.exports = {
32
rules: {
3+
// For all these Node.js scripts, we do not want to disable `console` statements
44
'no-console': 'off',
5+
6+
'@lwc/lwc/no-async-await': 'off',
7+
'no-await-in-loop': 'off',
8+
'no-restricted-syntax': ['error', 'ForInStatement', 'LabeledStatement', 'WithStatement'],
59
},
610
};

.github/actions/javascript/awaitStagingDeploys/awaitStagingDeploys.ts

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -8,19 +8,10 @@ import {promiseDoWhile} from '@github/libs/promiseWhile';
88
type CurrentStagingDeploys = Awaited<ReturnType<typeof GitHubUtils.octokit.actions.listWorkflowRuns>>['data']['workflow_runs'];
99

1010
function run() {
11-
console.info('[awaitStagingDeploys] POLL RATE', CONST.POLL_RATE);
12-
console.info('[awaitStagingDeploys] run()');
13-
console.info('[awaitStagingDeploys] getStringInput', getStringInput);
14-
console.info('[awaitStagingDeploys] GitHubUtils', GitHubUtils);
15-
console.info('[awaitStagingDeploys] promiseDoWhile', promiseDoWhile);
16-
1711
const tag = getStringInput('TAG', {required: false});
18-
console.info('[awaitStagingDeploys] run() tag', tag);
1912

2013
let currentStagingDeploys: CurrentStagingDeploys = [];
2114

22-
console.info('[awaitStagingDeploys] run() _.throttle', lodashThrottle);
23-
2415
const throttleFunc = () =>
2516
Promise.all([
2617
// These are active deploys
@@ -42,24 +33,20 @@ function run() {
4233
}),
4334
])
4435
.then((responses) => {
45-
console.info('[awaitStagingDeploys] listWorkflowRuns responses', responses);
4636
const workflowRuns = responses[0].data.workflow_runs;
4737
if (!tag && typeof responses[1] === 'object') {
4838
workflowRuns.push(...responses[1].data.workflow_runs);
4939
}
50-
console.info('[awaitStagingDeploys] workflowRuns', workflowRuns);
5140
return workflowRuns;
5241
})
5342
.then((workflowRuns) => (currentStagingDeploys = workflowRuns.filter((workflowRun) => workflowRun.status !== 'completed')))
5443
.then(() => {
55-
console.info('[awaitStagingDeploys] currentStagingDeploys', currentStagingDeploys);
5644
console.log(
5745
!currentStagingDeploys.length
5846
? 'No current staging deploys found'
5947
: `Found ${currentStagingDeploys.length} staging deploy${currentStagingDeploys.length > 1 ? 's' : ''} still running...`,
6048
);
6149
});
62-
console.info('[awaitStagingDeploys] run() throttleFunc', throttleFunc);
6350

6451
return promiseDoWhile(
6552
() => !!currentStagingDeploys.length,

.github/actions/javascript/awaitStagingDeploys/index.js

Lines changed: 0 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -12131,15 +12131,8 @@ const CONST_1 = __importDefault(__nccwpck_require__(9873));
1213112131
const GithubUtils_1 = __importDefault(__nccwpck_require__(9296));
1213212132
const promiseWhile_1 = __nccwpck_require__(9438);
1213312133
function run() {
12134-
console.info('[awaitStagingDeploys] POLL RATE', CONST_1.default.POLL_RATE);
12135-
console.info('[awaitStagingDeploys] run()');
12136-
console.info('[awaitStagingDeploys] getStringInput', ActionUtils_1.getStringInput);
12137-
console.info('[awaitStagingDeploys] GitHubUtils', GithubUtils_1.default);
12138-
console.info('[awaitStagingDeploys] promiseDoWhile', promiseWhile_1.promiseDoWhile);
1213912134
const tag = (0, ActionUtils_1.getStringInput)('TAG', { required: false });
12140-
console.info('[awaitStagingDeploys] run() tag', tag);
1214112135
let currentStagingDeploys = [];
12142-
console.info('[awaitStagingDeploys] run() _.throttle', throttle_1.default);
1214312136
const throttleFunc = () => Promise.all([
1214412137
// These are active deploys
1214512138
GithubUtils_1.default.octokit.actions.listWorkflowRuns({
@@ -12159,22 +12152,18 @@ function run() {
1215912152
}),
1216012153
])
1216112154
.then((responses) => {
12162-
console.info('[awaitStagingDeploys] listWorkflowRuns responses', responses);
1216312155
const workflowRuns = responses[0].data.workflow_runs;
1216412156
if (!tag && typeof responses[1] === 'object') {
1216512157
workflowRuns.push(...responses[1].data.workflow_runs);
1216612158
}
12167-
console.info('[awaitStagingDeploys] workflowRuns', workflowRuns);
1216812159
return workflowRuns;
1216912160
})
1217012161
.then((workflowRuns) => (currentStagingDeploys = workflowRuns.filter((workflowRun) => workflowRun.status !== 'completed')))
1217112162
.then(() => {
12172-
console.info('[awaitStagingDeploys] currentStagingDeploys', currentStagingDeploys);
1217312163
console.log(!currentStagingDeploys.length
1217412164
? 'No current staging deploys found'
1217512165
: `Found ${currentStagingDeploys.length} staging deploy${currentStagingDeploys.length > 1 ? 's' : ''} still running...`);
1217612166
});
12177-
console.info('[awaitStagingDeploys] run() throttleFunc', throttleFunc);
1217812167
return (0, promiseWhile_1.promiseDoWhile)(() => !!currentStagingDeploys.length, (0, throttle_1.default)(throttleFunc,
1217912168
// Poll every 60 seconds instead of every 10 seconds
1218012169
CONST_1.default.POLL_RATE * 6));
@@ -12730,15 +12719,13 @@ exports.promiseDoWhile = exports.promiseWhile = void 0;
1273012719
* Simulates a while loop where the condition is determined by the result of a Promise.
1273112720
*/
1273212721
function promiseWhile(condition, action) {
12733-
console.info('[promiseWhile] promiseWhile()');
1273412722
return new Promise((resolve, reject) => {
1273512723
const loop = function () {
1273612724
if (!condition()) {
1273712725
resolve();
1273812726
}
1273912727
else {
1274012728
const actionResult = action?.();
12741-
console.info('[promiseWhile] promiseWhile() actionResult', actionResult);
1274212729
if (!actionResult) {
1274312730
resolve();
1274412731
return;
@@ -12759,11 +12746,8 @@ exports.promiseWhile = promiseWhile;
1275912746
* Simulates a do-while loop where the condition is determined by the result of a Promise.
1276012747
*/
1276112748
function promiseDoWhile(condition, action) {
12762-
console.info('[promiseWhile] promiseDoWhile()');
1276312749
return new Promise((resolve, reject) => {
12764-
console.info('[promiseWhile] promiseDoWhile() condition', condition);
1276512750
const actionResult = action?.();
12766-
console.info('[promiseWhile] promiseDoWhile() actionResult', actionResult);
1276712751
if (!actionResult) {
1276812752
resolve();
1276912753
return;

.github/libs/promiseWhile.ts

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,12 @@ import type {DebouncedFunc} from 'lodash';
44
* Simulates a while loop where the condition is determined by the result of a Promise.
55
*/
66
function promiseWhile(condition: () => boolean, action: (() => Promise<void>) | DebouncedFunc<() => Promise<void>> | undefined): Promise<void> {
7-
console.info('[promiseWhile] promiseWhile()');
8-
97
return new Promise((resolve, reject) => {
108
const loop = function () {
119
if (!condition()) {
1210
resolve();
1311
} else {
1412
const actionResult = action?.();
15-
console.info('[promiseWhile] promiseWhile() actionResult', actionResult);
1613

1714
if (!actionResult) {
1815
resolve();
@@ -35,12 +32,9 @@ function promiseWhile(condition: () => boolean, action: (() => Promise<void>) |
3532
* Simulates a do-while loop where the condition is determined by the result of a Promise.
3633
*/
3734
function promiseDoWhile(condition: () => boolean, action: (() => Promise<void>) | DebouncedFunc<() => Promise<void>> | undefined): Promise<void> {
38-
console.info('[promiseWhile] promiseDoWhile()');
39-
4035
return new Promise((resolve, reject) => {
41-
console.info('[promiseWhile] promiseDoWhile() condition', condition);
4236
const actionResult = action?.();
43-
console.info('[promiseWhile] promiseDoWhile() actionResult', actionResult);
37+
4438
if (!actionResult) {
4539
resolve();
4640
return;

.github/libs/sanitizeStringForJSONParse.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ const replacer = (str: string): string =>
1616
* Solution partly taken from SO user Gabriel Rodríguez Flores 🙇
1717
* https://stackoverflow.com/questions/52789718/how-to-remove-special-characters-before-json-parse-while-file-reading
1818
*/
19-
const sanitizeStringForJSONParse = (inputString: string): string => {
19+
const sanitizeStringForJSONParse = (inputString: string | number | boolean | null | undefined): string => {
2020
if (typeof inputString !== 'string') {
2121
throw new TypeError('Input must me of type String');
2222
}

.storybook/preview.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ import './fonts.css';
1616
Onyx.init({
1717
keys: ONYXKEYS,
1818
initialKeyStates: {
19-
[ONYXKEYS.NETWORK]: {isOffline: false},
19+
[ONYXKEYS.NETWORK]: {isOffline: false, isBackendReachable: true},
2020
},
2121
});
2222

__mocks__/@react-navigation/native/index.ts

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,7 @@ import {useIsFocused as realUseIsFocused, useTheme as realUseTheme} from '@react
33
// We only want these mocked for storybook, not jest
44
const useIsFocused: typeof realUseIsFocused = process.env.NODE_ENV === 'test' ? realUseIsFocused : () => true;
55

6-
// @ts-expect-error as we're mocking this function
7-
const useTheme: typeof realUseTheme = process.env.NODE_ENV === 'test' ? realUseTheme : () => ({});
6+
const useTheme = process.env.NODE_ENV === 'test' ? realUseTheme : () => ({});
87

98
export * from '@react-navigation/core';
10-
export * from '@react-navigation/native';
119
export {useIsFocused, useTheme};

android/app/build.gradle

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -98,8 +98,8 @@ android {
9898
minSdkVersion rootProject.ext.minSdkVersion
9999
targetSdkVersion rootProject.ext.targetSdkVersion
100100
multiDexEnabled rootProject.ext.multiDexEnabled
101-
versionCode 1001047301
102-
versionName "1.4.73-1"
101+
versionCode 1001047404
102+
versionName "1.4.74-4"
103103
// Supported language variants must be declared here to avoid from being removed during the compilation.
104104
// This also helps us to not include unnecessary language variants in the APK.
105105
resConfigs "en", "es"

docs/articles/expensify-classic/expensify-card/Unlimited-Virtual-Cards.md

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -26,13 +26,13 @@ After adopting the new Expensify Card, domain admins can issue virtual cards to
2626

2727
**To assign a virtual card:**
2828

29-
1. Head to **Settings** > **Domains** > [**Company Cards**](https://www.expensify.com/domain_companycards).
30-
2. Click the **Issue Virtual Cards** button.
31-
3. Enter a card name (i.e., "Google Ads").
32-
4. Select a domain member to assign the card to.
33-
5. Enter a card limit.
34-
6. Select a **Limit Type** of _Fixed_ or _Monthly_.
35-
7. Click **Issue Card**.
29+
Head to **Settings** > **Domains** > [**Company Cards**](https://www.expensify.com/domain_companycards) and click the **Issue Virtual Cards** button. From there:
30+
31+
1. Enter a card name (i.e., "Google Ads").
32+
2. Select a domain member to assign the card to.
33+
3. Enter a card limit.
34+
4. Select a **Limit Type** of _Fixed_ or _Monthly_.
35+
5. Click **Issue Card**.
3636

3737
![The Issue Virtual Cards modal is open in the middle of the screen. There are four options to set; Card Name, Assignee, Card Limit, and Limit type. A cancel (left) and save (right) button are at the bottom right of the modal.]({{site.url}}/assets/images/AdminissuedVirtualCards.png){:width="100%"}
3838

docs/articles/expensify-classic/expensify-partner-program/Referral-Program.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,9 @@ The sky's the limit for this referral program! Your referral can be anyone - a f
1616

1717
1. There are a bunch of different ways to refer someone to New Expensify:
1818
- Start a chat
19-
- Request money
20-
- Send money
21-
- Split a bill
19+
- Submit an expense to them
20+
- Split an expense with them
21+
- Pay someone (them)
2222
- Assign them a task
2323
- @ mention them
2424
- Invite them to a room

docs/articles/expensify-classic/workspaces/reports/Currency.md

Lines changed: 0 additions & 31 deletions
This file was deleted.
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
---
2+
title: Resolve Errors Adding a Bank Account
3+
description: Troubleshooting issues adding a business bank account in Expensify.
4+
---
5+
<div id="new-expensify" markdown="1">
6+
7+
Expensify is required to verify the identity of the individual who is connecting a business bank account.
8+
9+
**If you get a generic error message while uploading your ID, please go through the following steps:**
10+
1. Ensure you are using either Safari (on iPhone) or Chrome (on Android) as your web browser.
11+
2. Check your browser's permissions to make sure that the camera and microphone settings are set to "Allow"
12+
3. Clear your web cache for Safari (on iPhone) or Chrome (on Android).
13+
4. If using a corporate Wi-Fi network, confirm that your corporate firewall isn't blocking the website.
14+
5. Make sure no other apps are overlapping your screen, such as the Facebook Messenger bubble, while recording the video.
15+
6. On iPhone, if using iOS version 15 or later, disable the Hide IP address feature in Safari.
16+
7. If possible, try these steps on another device
17+
8. If you have another phone available, try to follow these steps on that device
18+
19+
If the issue persists, please contact your Account Manager or Concierge for further troubleshooting assistance.
20+
21+
</div>

docs/redirects.csv

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -171,3 +171,5 @@ https://help.expensify.com/articles/expensify-classic/reports/The-Reports-Page,h
171171
https://help.expensify.com/articles/new-expensify/getting-started/Free-plan-upgrade-to-collect-plan,https://help.expensify.com/articles/new-expensify/getting-started/Upgrade-to-a-Collect-Plan
172172
https://help.expensify.com/articles/new-expensify/bank-accounts-and-payments/Connect-a-Bank-Account,https://help.expensify.com/new-expensify/hubs/expenses/Connect-a-Bank-Account
173173
https://help.expensify.com/articles/new-expensify/settings/Profile,https://help.expensify.com/new-expensify/hubs/settings/
174+
https://help.expensify.com/articles/new-expensify/expenses/Referral-Program.html,https://help.expensify.com/articles/expensify-classic/expensify-partner-program/Referral-Program
175+
https://help.expensify.com/articles/expensify-classic/workspaces/reports/Currency,https://help.expensify.com/articles/expensify-classic/workspaces/Currency

ios/NewExpensify/Info.plist

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
<key>CFBundlePackageType</key>
2020
<string>APPL</string>
2121
<key>CFBundleShortVersionString</key>
22-
<string>1.4.73</string>
22+
<string>1.4.74</string>
2323
<key>CFBundleSignature</key>
2424
<string>????</string>
2525
<key>CFBundleURLTypes</key>
@@ -40,7 +40,7 @@
4040
</dict>
4141
</array>
4242
<key>CFBundleVersion</key>
43-
<string>1.4.73.1</string>
43+
<string>1.4.74.4</string>
4444
<key>FullStory</key>
4545
<dict>
4646
<key>OrgId</key>

ios/NewExpensifyTests/Info.plist

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,10 @@
1515
<key>CFBundlePackageType</key>
1616
<string>BNDL</string>
1717
<key>CFBundleShortVersionString</key>
18-
<string>1.4.73</string>
18+
<string>1.4.74</string>
1919
<key>CFBundleSignature</key>
2020
<string>????</string>
2121
<key>CFBundleVersion</key>
22-
<string>1.4.73.1</string>
22+
<string>1.4.74.4</string>
2323
</dict>
2424
</plist>

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>1.4.73</string>
14+
<string>1.4.74</string>
1515
<key>CFBundleVersion</key>
16-
<string>1.4.73.1</string>
16+
<string>1.4.74.4</string>
1717
<key>NSExtension</key>
1818
<dict>
1919
<key>NSExtensionPointIdentifier</key>

package-lock.json

Lines changed: 6 additions & 6 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": "1.4.73-1",
3+
"version": "1.4.74-4",
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.",
@@ -65,7 +65,7 @@
6565
"@babel/plugin-proposal-private-methods": "^7.18.6",
6666
"@babel/plugin-proposal-private-property-in-object": "^7.21.11",
6767
"@dotlottie/react-player": "^1.6.3",
68-
"@expensify/react-native-live-markdown": "0.1.69",
68+
"@expensify/react-native-live-markdown": "0.1.70",
6969
"@expo/metro-runtime": "~3.1.1",
7070
"@formatjs/intl-datetimeformat": "^6.10.0",
7171
"@formatjs/intl-listformat": "^7.2.2",

0 commit comments

Comments
 (0)