Skip to content

Commit 191f844

Browse files
committed
resolve conflict
2 parents ef61966 + 2c846db commit 191f844

File tree

246 files changed

+5886
-2352
lines changed

Some content is hidden

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

246 files changed

+5886
-2352
lines changed

.eslintrc.js

+13-1
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,26 @@ const path = require('path');
33
const restrictedImportPaths = [
44
{
55
name: 'react-native',
6-
importNames: ['useWindowDimensions', 'StatusBar', 'TouchableOpacity', 'TouchableWithoutFeedback', 'TouchableNativeFeedback', 'TouchableHighlight', 'Pressable', 'Text', 'ScrollView'],
6+
importNames: [
7+
'useWindowDimensions',
8+
'StatusBar',
9+
'TouchableOpacity',
10+
'TouchableWithoutFeedback',
11+
'TouchableNativeFeedback',
12+
'TouchableHighlight',
13+
'Pressable',
14+
'Text',
15+
'ScrollView',
16+
'Animated',
17+
],
718
message: [
819
'',
920
"For 'useWindowDimensions', please use '@src/hooks/useWindowDimensions' instead.",
1021
"For 'TouchableOpacity', 'TouchableWithoutFeedback', 'TouchableNativeFeedback', 'TouchableHighlight', 'Pressable', please use 'PressableWithFeedback' and/or 'PressableWithoutFeedback' from '@components/Pressable' instead.",
1122
"For 'StatusBar', please use '@libs/StatusBar' instead.",
1223
"For 'Text', please use '@components/Text' instead.",
1324
"For 'ScrollView', please use '@components/ScrollView' instead.",
25+
"For 'Animated', please use 'Animated' from 'react-native-reanimated' instead.",
1426
].join('\n'),
1527
},
1628
{
+28
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
---
2+
name: 'Tooltips Template'
3+
about: Create this issue when adding a new tooltip to New Expensify
4+
labels: Daily, Design, WaitingForCopy
5+
title: 'Tooltips Template'
6+
---
7+
Refer to https://stackoverflowteams.com/c/expensify/questions/20762 for the full process to add a tooltip.
8+
9+
### Problem
10+
Enter the problem that currently exists without the tooltip.
11+
12+
### Solution
13+
Enter the solution that implementing the tooltip will achieve.
14+
15+
### What is the purpose of the tooltip?
16+
Enter the purpose.
17+
18+
### How should the tooltip look
19+
Add the Figma Mock Up that Design builds.
20+
21+
### Condition
22+
We should show this tooltip to:
23+
24+
### Decide the prioritisation
25+
26+
Priority score:
27+
28+
NOTE: Only one tooltip is shown at a time.

.github/workflows/README.md

+1
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,7 @@ The GitHub workflows require a large list of secrets to deploy, notify and test
9494
1. `CSC_LINK` - Required to be set for desktop code signing: https://www.electron.build/code-signing.html#travis-appveyor-and-other-ci-servers
9595
1. `CSC_KEY_PASSWORD` - Required to be set for desktop code signing: https://www.electron.build/code-signing.html#travis-appveyor-and-other-ci-servers
9696
1. `APPLE_ID` - Required for notarizing desktop code in `desktop/notarize.js`
97+
1. `APPLE_TEAM_ID` - Required for notarizing desktop code in `desktop/notarize.js`
9798
1. `APPLE_ID_PASSWORD` - Required for notarizing desktop code in `desktop/notarize.js`
9899
1. `AWS_ACCESS_KEY_ID` - Required for hosting website and desktop compiled code
99100
1. `AWS_SECRET_ACCESS_KEY` - Required for hosting website and desktop compiled code

.github/workflows/deploy.yml

+1
Original file line numberDiff line numberDiff line change
@@ -318,6 +318,7 @@ jobs:
318318
CSC_LINK: ${{ secrets.CSC_LINK }}
319319
CSC_KEY_PASSWORD: ${{ secrets.CSC_KEY_PASSWORD }}
320320
APPLE_ID: ${{ secrets.APPLE_ID }}
321+
APPLE_TEAM_ID: ${{ secrets.APPLE_TEAM_ID }}
321322
APPLE_APP_SPECIFIC_PASSWORD: ${{ secrets.APPLE_ID_PASSWORD }}
322323
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
323324
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}

.github/workflows/testBuild.yml

+1
Original file line numberDiff line numberDiff line change
@@ -266,6 +266,7 @@ jobs:
266266
CSC_LINK: ${{ secrets.CSC_LINK }}
267267
CSC_KEY_PASSWORD: ${{ secrets.CSC_KEY_PASSWORD }}
268268
APPLE_ID: ${{ secrets.APPLE_ID }}
269+
APPLE_TEAM_ID: ${{ secrets.APPLE_TEAM_ID }}
269270
APPLE_APP_SPECIFIC_PASSWORD: ${{ secrets.APPLE_ID_PASSWORD }}
270271
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
271272
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}

.github/workflows/testBuildHybrid.yml

+6-3
Original file line numberDiff line numberDiff line change
@@ -77,11 +77,11 @@ jobs:
7777
const pullRequest = await github.rest.pulls.get({
7878
owner: context.repo.owner,
7979
repo: context.repo.repo,
80-
pull_number: env.PULL_REQUEST_NUMBER,
80+
pull_number: '${{ env.PULL_REQUEST_NUMBER }}'',
8181
});
8282
8383
const body = pullRequest.data.body;
84-
const regex = /MOBILE-EXPENSIFY:(?<prNumber>.*)/;
84+
const regex = /MOBILE-EXPENSIFY:(?<prNumber>\d+)/;
8585
const found = body.match(regex)?.groups?.prNumber || "";
8686
8787
return found.trim();
@@ -93,11 +93,14 @@ jobs:
9393
outputs:
9494
OLD_DOT_REF: ${{ steps.getHeadRef.outputs.REF }}
9595
steps:
96+
- name: Checkout
97+
uses: actions/checkout@v4
98+
9699
- name: Check if pull request number is correct
97100
id: getHeadRef
98101
run: |
99102
set -e
100-
echo "REF=$(gh pr view ${{ needs.getOldDotPR.outputs.OLD_DOT_PR }} --json headRefOid --jq '.headRefOid')" >> "$GITHUB_OUTPUT"
103+
echo "REF=$(gh pr view ${{ needs.getOldDotPR.outputs.OLD_DOT_PR }} -R 'Expensify/Mobile-Expensify' --json headRefOid --jq '.headRefOid')" >> "$GITHUB_OUTPUT"
101104
env:
102105
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
103106

Mobile-Expensify

README.md

-14
Original file line numberDiff line numberDiff line change
@@ -794,20 +794,6 @@ The commands used to compile a production or staging desktop build are `npm run
794794
HOWEVER, by default those commands will try to notarize the build (signing it as Expensify) and publish it to the S3 bucket where it's hosted for users. In most cases you won't actually need or want to do that for your local testing. To get around that and disable those behaviors for your local build, apply the following diff:
795795

796796
```diff
797-
diff --git a/config/electronBuilder.config.js b/config/electronBuilder.config.js
798-
index e4ed685f65..4c7c1b3667 100644
799-
--- a/config/electronBuilder.config.js
800-
+++ b/config/electronBuilder.config.js
801-
@@ -42,9 +42,6 @@ module.exports = {
802-
entitlements: 'desktop/entitlements.mac.plist',
803-
entitlementsInherit: 'desktop/entitlements.mac.plist',
804-
type: 'distribution',
805-
- notarize: {
806-
- teamId: '368M544MTT',
807-
- },
808-
},
809-
dmg: {
810-
title: 'New Expensify',
811797
diff --git a/scripts/build-desktop.sh b/scripts/build-desktop.sh
812798
index 791f59d733..526306eec1 100755
813799
--- a/scripts/build-desktop.sh

android/app/build.gradle

+2-2
Original file line numberDiff line numberDiff line change
@@ -110,8 +110,8 @@ android {
110110
minSdkVersion rootProject.ext.minSdkVersion
111111
targetSdkVersion rootProject.ext.targetSdkVersion
112112
multiDexEnabled rootProject.ext.multiDexEnabled
113-
versionCode 1009008806
114-
versionName "9.0.88-6"
113+
versionCode 1009008902
114+
versionName "9.0.89-2"
115115
// Supported language variants must be declared here to avoid from being removed during the compilation.
116116
// This also helps us to not include unnecessary language variants in the APK.
117117
resConfigs "en", "es"

config/electronBuilder.config.js

-3
Original file line numberDiff line numberDiff line change
@@ -42,9 +42,6 @@ module.exports = {
4242
entitlements: 'desktop/entitlements.mac.plist',
4343
entitlementsInherit: 'desktop/entitlements.mac.plist',
4444
type: 'distribution',
45-
notarize: {
46-
teamId: '368M544MTT',
47-
},
4845
target: [
4946
{
5047
target: 'default',

contributingGuides/TS_CHEATSHEET.md

+37-13
Original file line numberDiff line numberDiff line change
@@ -101,22 +101,46 @@
101101

102102
- [1.4](#animated-style) **Animated styles**
103103

104-
```ts
105-
import {useRef} from 'react';
106-
import {Animated, StyleProp, ViewStyle} from 'react-native';
104+
The recommended approach to creating animations is by using the `react-native-reanimated` library,
105+
as it offers greater efficiency and convenience compared to using the `Animated` API directly from
106+
React Native.
107107

108+
```ts
109+
import React from 'react';
110+
import { View, StyleSheet, StyleProp, ViewStyle } from 'react-native';
111+
import Animated, { useAnimatedStyle, useSharedValue, withTiming, SharedValue, WithTimingConfig } from 'react-native-reanimated';
112+
108113
type MyComponentProps = {
109-
style?: Animated.WithAnimatedValue<StyleProp<ViewStyle>>;
114+
opacity: Animated.SharedValue<number>;
115+
};
116+
117+
const MyComponent = ({ opacity }: MyComponentProps) => {
118+
const animatedStyle = useAnimatedStyle(() => ({
119+
opacity: opacity.value,
120+
}));
121+
122+
return (
123+
<Animated.View style={[styles.box, animatedStyle]} />
124+
);
125+
};
126+
127+
const App = () => {
128+
const opacity = useSharedValue(0);
129+
130+
const startAnimation = () => {
131+
opacity.value = withTiming(1, {
132+
duration: 1000,
133+
easing: Easing.inOut(Easing.quad),
134+
});
135+
};
136+
137+
return (
138+
<View style={styles.container}>
139+
<MyComponent opacity={opacity} />
140+
<Button title="Animate" onPress={startAnimation} />
141+
</View>
142+
);
110143
};
111-
112-
function MyComponent({ style }: MyComponentProps) {
113-
return <Animated.View style={style} />;
114-
}
115-
116-
function App() {
117-
const anim = useRef(new Animated.Value(0)).current;
118-
return <MyComponent style={{opacity: anim.interpolate({...})}} />;
119-
}
120144
```
121145

122146
<a name="render-prop"></a><a name="1.5"></a>

desktop/README.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,7 @@ You will need to pass your Apple ID (username) and an [app-specific password](ht
131131
Now that your credentials have been set up properly, you can push a build to Min.IO. Start by updating the version value in `package.json` to be much higher than it is currently (1.0.0-0 -> 2.0.0-0) so that the uploaded version is always higher than the version you're testing on. Then run the following, where `RootUserKey` and `RootPassKey` are the `RootUser` and `RootPass` values from step 3:
132132
133133
```shell
134-
AWS_ACCESS_KEY_ID=RootUserKey AWS_SECRET_ACCESS_KEY=RootPassKey APPLE_ID=YOUR_APPLE_ID APPLE_APP_SPECIFIC_PASSWORD=YOUR_APP_SPECIFIC_PW npm run desktop-build
134+
AWS_ACCESS_KEY_ID=RootUserKey AWS_SECRET_ACCESS_KEY=RootPassKey APPLE_ID=YOUR_APPLE_ID APPLE_TEAM_ID=YOUR_APPLE_TEAM_ID APPLE_APP_SPECIFIC_PASSWORD=YOUR_APP_SPECIFIC_PW npm run desktop-build
135135
```
136136
137137
This command will create a build, notarize it, and push your build to the server. Note that it can take around 10 minutes for the command to complete.

docs/_data/_routes.yml

+5
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,11 @@ platforms:
119119
icon: /assets/images/money-into-wallet.svg
120120
description: Learn more about expense tracking and submission.
121121

122+
- href: connect-credit-cards
123+
title: Connect Credit Cards
124+
icon: /assets/images/bank-card.svg
125+
description: Track credit card transactions and reconcile company cards.
126+
122127
- href: expensify-card
123128
title: Expensify Card
124129
icon: /assets/images/hand-card.svg
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,116 @@
1+
---
2+
title: Commercial-feeds.md
3+
description: Commercial feeds
4+
---
5+
# Overview
6+
Commercial feeds are the most reliable way to import company card expenses. They remain unaffected by changes to bank login credentials or UI updates, making them highly recommended for those eligible.
7+
The easiest way to confirm your eligibility for a commercial feed is to ask your bank directly.
8+
# Prerequisites for enabling a commercial feed
9+
If you haven't already, you need to create a workspace before setting up a commercial feed. Go to Settings > Workspaces > New workspace to create one.
10+
Additionally, you’ll need to enable company cards on your workspace by navigating to Settings > Workspaces > [your workspace] > More features, and toggling on Company cards. Note that upgrading to the Control plan is required to access this feature.
11+
# How to set up a Mastercard commercial feed
12+
Your bank must access Mastercard's SmartData portal to complete the process. Expensify is a registered vendor in the portal, so no additional Mastercard forms are required. Your bank may, however, have its own forms.
13+
## Steps to add a Mastercard commercial feed:
14+
Contact your banking relationship manager and request that your CDF (Common Data File) feed be sent directly to Expensify in the Mastercard SmartData Portal (file type: CDF version 3 Release 11.01). Specify the earliest transaction date you need in the feed.
15+
The bank will initiate feed delivery by selecting Expensify in Mastercard's portal and will email you the distribution ID.
16+
While waiting for your bank, ensure your Control plan workspace in Expensify is set up.
17+
Submit the distribution ID in Expensify by navigating to Settings > Workspaces > [your workspace] > Company cards > Add cards, selecting your bank (choose "Other" if not listed), and then selecting Mastercard Commercial Cards.
18+
Once submitted, Expensify will connect the feed and notify you when it’s enabled.
19+
# How to set up a Visa commercial feed
20+
## Steps to add a Visa commercial feed:
21+
Contact your banking relationship manager and request that your VCF (Variant Call Format) feed be sent directly to Expensify. Share this with your bank: "There’s a checkbox in your Visa Subscription Management portal that can be selected to enable the feed, eliminating the need for a test file."
22+
Request the feed filename or raw file information, including the Processor ID, Financial Institution (bank) ID, and Company ID.
23+
While waiting for your bank, ensure your Control plan workspace in Expensify is set up.
24+
Submit the required IDs in Expensify by navigating to Settings > Workspaces > [your workspace] > Company cards > Add cards, selecting your bank (choose "Other" if not listed), and then selecting Visa Commercial Cards.
25+
Once submitted, Expensify will connect the feed and notify you when it’s enabled.
26+
27+
# How to set up an American Express corporate feed
28+
To begin, fill out Amex's required forms and send them to Amex for processing. Download the forms [here](https://drive.google.com/file/d/1zqDA_MCk06jk_fWjzx2y0r4gOyAMqKJe/view?usp=sharing).
29+
30+
## Instructions for filling out the Amex forms:
31+
PAGE 1
32+
Corporation Name: The legal name of your company on file with American Express
33+
Corporation Address: The legal address of your company
34+
Requested Feed Start Date: The earliest transaction date you want in Expensify (use international date format: DD/MM/YY or spelled out, e.g., January 1, 1900).
35+
Requestor Contact: Name of the person completing the request
36+
Email Address: Email of the person completing the request
37+
Control Account Number: The master or basic control account number for the cards you’d like to add (not a credit card number). Contact Amex if you need assistance identifying the correct number.
38+
PAGE 2
39+
No information required
40+
PAGE 3
41+
Client Registered Name: The legal name of your company on file with American Express
42+
Master Control Account or Basic Control Account: Same as the control account number on page 1
43+
PAGE 4
44+
Country List: The country where the account originates
45+
Client Authorization: Complete your full name, job title, and date (use international date format i.e., DD/MM/YY). Sign where indicated.
46+
47+
48+
## Steps to add an American Express corporate feed:
49+
Send the completed forms to electronictransmissionsteam@aexp.com and request they send your corporate card feed to Expensify. You should receive a confirmation email within a few days.
50+
While waiting, ensure your Control plan workspace in Expensify is set up.
51+
Amex will send a Production Letter with delivery file name information (e.g., R123456_B123456789_GL1025_001_$DATE$$TIME$_$SEQ$).
52+
Submit the delivery file name in Expensify by navigating to Settings > Workspaces > [your workspace] > Company cards > Add cards > American Express > American Express Corporate Cards.
53+
Once submitted, Expensify will connect the feed and notify you when it’s enabled.
54+
55+
# How to assign company cards
56+
Once your feed is connected, you can assign cards to employees. To do this, navigate to Settings > Workspaces > [your workspace] > Company cards.
57+
58+
![Click the feed name to view the feed selector]({{site.url}}/assets/images/commfeed/commfeed-01.png){:width="100%"}
59+
60+
If you have multiple feeds, click the feed name at the top left to select the appropriate one.
61+
62+
![Select a feed from the feed selector to view it]({{site.url}}/assets/images/commfeed/commfeed-02.png){:width="100%"}
63+
64+
Click Assign card to select an employee. All workspace members appear in the list.
65+
66+
![Click assign card and select an employee from the list]({{site.url}}/assets/images/commfeed-03.png){:width="100%"}
67+
68+
Select the card you want to assign. Cards only appear if they have recent transactions.
69+
70+
![Select a card from the list]({{site.url}}/assets/images/commfeed/commfeed-04.png){:width="100%"}
71+
72+
Choose a start date:
73+
From the beginning: Imports all available transactions (typically 30-90 days).
74+
Custom start date: Allows you to specify a date.
75+
![Select your transaction start date]({{site.url}}/assets/images/commfeed/commfeed-05.png){:width="100%"}
76+
Review the details and click Assign card. Transactions will import immediately.
77+
![Double check the selections and assign the card]({{site.url}}/assets/images/commfeed/commfeed-06.png){:width="100%"}
78+
79+
# Managing cards
80+
Clicking an assigned card opens the Card details page, where you can:
81+
Change the card name.
82+
Select a card-specific export account (if connected to accounting software like QuickBooks, NetSuite, Xero, etc.).
83+
Update the card to pull recent transactions.
84+
Unassign the card (note: unassigning deletes unsubmitted expenses on draft reports in the cardholder’s account).
85+
![Manage the card on the card details page]({{site.url}}/assets/images/commfeed/commfeed-07.png){:width="100%"}
86+
87+
{% include faq-begin.md %}
88+
89+
## My commercial feed is connected. Why is a specific card not appearing for assignment?
90+
Cards appear for assignment if they’re active and have at least one recent transaction. If a card meeting these criteria doesn’t appear, contact your account manager or message concierge@expensify.com.
91+
92+
## Is there an extra fee for using commercial feeds?
93+
No, commercial feed setup is included in the Control plan.
94+
95+
## What’s the difference between a direct feed and commercial feed?
96+
Direct feeds use login credentials for quick setup, but can require re-authenticating from time to time. Commercial feeds require bank involvement for setup but offer the most reliable connection.
97+
98+
## I have a Small Business Amex account. Am I eligible to set up a commercial feed?
99+
Small Business or Triumph Amex accounts may not be eligible for a commercial feed and might need to use an Amex direct feed.
100+
101+
## Are commercial feeds the best option if my bank isn’t one where Expensify supports direct feeds?
102+
Yes. If direct feeds are not available for your bank, commercial feeds are the best option for importing company card transactions. Currently, Expensify supports direct feeds for:
103+
American Express
104+
Bank of America
105+
Brex
106+
Capital One
107+
Chase
108+
Citibank
109+
Stripe
110+
Wells Fargo
111+
112+
113+
{% include faq-end.md %}
114+
115+
116+

0 commit comments

Comments
 (0)