Skip to content

Commit

Permalink
Merge branch 'main' into form-migration/address-form
Browse files Browse the repository at this point in the history
merge main into form-migration/address-form
  • Loading branch information
cdOut committed Dec 7, 2023
2 parents 7a32ed0 + b0268fa commit 8f7c76b
Show file tree
Hide file tree
Showing 438 changed files with 7,432 additions and 5,057 deletions.
5 changes: 5 additions & 0 deletions .eslintrc.js
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,11 @@ const restrictedImportPaths = [
importNames: ['TouchableOpacity', 'TouchableWithoutFeedback', 'TouchableNativeFeedback', 'TouchableHighlight'],
message: "Please use 'PressableWithFeedback' and/or 'PressableWithoutFeedback' from 'src/components/Pressable' instead.",
},
{
name: 'react-native-safe-area-context',
importNames: ['useSafeAreaInsets', 'SafeAreaConsumer', 'SafeAreaInsetsContext'],
message: "Please use 'useSafeAreaInsets' from 'src/hooks/useSafeAreaInset' and/or 'SafeAreaConsumer' from 'src/components/SafeAreaConsumer' instead.",
},
];

const restrictedImportPatterns = [
Expand Down
2 changes: 1 addition & 1 deletion .github/PULL_REQUEST_TEMPLATE.md
Original file line number Diff line number Diff line change
Expand Up @@ -98,7 +98,7 @@ This is a checklist for PR authors. Please make sure to complete all tasks and c
- [ ] The file has a description of what it does and/or why is needed at the top of the file if the code is not self explanatory
- [ ] If a new CSS style is added I verified that:
- [ ] A similar style doesn't already exist
- [ ] The style can't be created with an existing [StyleUtils](https://github.com/Expensify/App/blob/main/src/styles/StyleUtils.js) function (i.e. `StyleUtils.getBackgroundAndBorderStyle(themeColors.componentBG)`)
- [ ] The style can't be created with an existing [StyleUtils](https://github.com/Expensify/App/blob/main/src/styles/StyleUtils.js) function (i.e. `StyleUtils.getBackgroundAndBorderStyle(theme.componentBG)`)
- [ ] If the PR modifies code that runs when editing or sending messages, I tested and verified there is no unexpected behavior for all supported markdown - URLs, single line code, code blocks, quotes, headings, bold, strikethrough, and italic.
- [ ] If the PR modifies a generic component, I tested and verified that those changes do not break usages of that component in the rest of the App (i.e. if a shared library or component like `Avatar` is modified, I verified that `Avatar` is working as expected in all cases)
- [ ] If the PR modifies a component related to any of the existing Storybook stories, I tested and verified all stories for that component are still working as expected.
Expand Down
3 changes: 3 additions & 0 deletions .github/workflows/platformDeploy.yml
Original file line number Diff line number Diff line change
Expand Up @@ -347,6 +347,9 @@ jobs:
if: ${{ failure() }}
needs: [android, desktop, iOS, web]
steps:
- name: Checkout
uses: actions/checkout@v4

- name: Post Slack message on failure
uses: ./.github/actions/composite/announceFailedWorkflowInSlack
with:
Expand Down
3 changes: 2 additions & 1 deletion .imgbotconfig
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
{
"ignoredFiles": [
"assets/images/empty-state_background-fade.png" // Caused an issue with colour gradients, https://github.com/Expensify/App/issues/30499
"assets/images/empty-state_background-fade-dark.png", // Caused an issue with colour gradients, https://github.com/Expensify/App/issues/30499
"assets/images/empty-state_background-fade-light.png"
],
"aggressiveCompression": "false"
}
2 changes: 1 addition & 1 deletion __mocks__/@ua/react-native-airship.js
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ const Airship = {
},
contact: {
identify: jest.fn(),
getNamedUserId: jest.fn(),
getNamedUserId: () => Promise.resolve(undefined),
reset: jest.fn(),
},
};
Expand Down
4 changes: 2 additions & 2 deletions android/app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -91,8 +91,8 @@ android {
minSdkVersion rootProject.ext.minSdkVersion
targetSdkVersion rootProject.ext.targetSdkVersion
multiDexEnabled rootProject.ext.multiDexEnabled
versionCode 1001040507
versionName "1.4.5-7"
versionCode 1001040902
versionName "1.4.9-2"
}

flavorDimensions "default"
Expand Down
13 changes: 0 additions & 13 deletions android/app/src/main/res/values/styles.xml
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@
<item name="android:editTextBackground">@drawable/rn_edit_text_material</item>
<item name="popupTheme">@style/AppTheme.Popup</item>
<item name="android:spinnerDropDownItemStyle">@style/TextViewSpinnerDropDownItem</item>
<item name="android:datePickerDialogTheme">@style/DatePickerDialogTheme</item>
<item name="android:alertDialogTheme">@style/AlertDialogTheme</item>
</style>

Expand All @@ -28,18 +27,6 @@
<item name="android:fontFamily">@font/expneuebold</item>
</style>

<!-- Theme used by the DatePicker dialog -->
<style name="DatePickerDialogTheme" parent="Theme.AppCompat.Dialog">
<item name="android:windowBackground">@drawable/datepicker_background</item>
<item name="android:datePickerStyle">@style/DatePickerStyle</item>
<item name="android:fontFamily">@font/expneuebold</item>
<item name="colorAccent">@color/accent</item>
</style>

<style name="DatePickerStyle" parent="android:Widget.Material.DatePicker">
<item name="android:headerBackground">@color/card_highlight_bg</item> <!-- header background color -->
</style>

<!-- Theme used by the Alert dialog -->
<style name="AlertDialogTheme" parent="Theme.AppCompat.Dialog.Alert">
<item name="android:windowBackground">@drawable/alert_background</item>
Expand Down
10 changes: 5 additions & 5 deletions contributingGuides/NAVIGATION.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# Overview

The navigation in the App consists of a top-level Stack Navigator (called `RootStack`) with each of its `Screen` components handling different high-level flow. All those flows can be seen in `AuthScreens.js` file.
The navigation in the App consists of a top-level Stack Navigator (called `RootStack`) with each of its `Screen` components handling different high-level flow. All those flows can be seen in `AuthScreens.tsx` file.

## Terminology

Expand All @@ -20,11 +20,11 @@ Navigation Actions - User actions correspond to resulting navigation actions tha

## Adding RHP flows

Most of the time, if you want to add some of the flows concerning one of your reports, e.g. `Money Request` from a user, you will most probably use `RightModalNavigator.js` and `ModalStackNavigators.js` file:
Most of the time, if you want to add some of the flows concerning one of your reports, e.g. `Money Request` from a user, you will most probably use `RightModalNavigator.tsx` and `ModalStackNavigators.tsx` file:

- Since each of those flows is kind of a modal stack, if you want to add a page to the existing flow, you should just add a page to the correct stack in `ModalStackNavigators.js`.
- Since each of those flows is kind of a modal stack, if you want to add a page to the existing flow, you should just add a page to the correct stack in `ModalStackNavigators.tsx`.

- If you want to create new flow, add a `Screen` in `RightModalNavigator.js` and make new modal in `ModalStackNavigators.js` with chosen pages.
- If you want to create new flow, add a `Screen` in `RightModalNavigator.tsx` and make new modal in `ModalStackNavigators.tsx` with chosen pages.

When creating RHP flows, you have to remember a couple things:

Expand Down Expand Up @@ -196,4 +196,4 @@ The action for the first step created with `getMinimalAction` looks like this:
```

### Deeplinking
There is no minimal action for deeplinking directly to the `Profile` screen. But because the `Settings_root` is not on the stack, pressing UP will reset the params for navigators to the correct ones.
There is no minimal action for deeplinking directly to the `Profile` screen. But because the `Settings_root` is not on the stack, pressing UP will reset the params for navigators to the correct ones.
2 changes: 1 addition & 1 deletion contributingGuides/REVIEWER_CHECKLIST.md
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@
- [ ] The file has a description of what it does and/or why is needed at the top of the file if the code is not self explanatory
- [ ] If a new CSS style is added I verified that:
- [ ] A similar style doesn't already exist
- [ ] The style can't be created with an existing [StyleUtils](https://github.com/Expensify/App/blob/main/src/styles/StyleUtils.js) function (i.e. `StyleUtils.getBackgroundAndBorderStyle(themeColors.componentBG`)
- [ ] The style can't be created with an existing [StyleUtils](https://github.com/Expensify/App/blob/main/src/styles/StyleUtils.js) function (i.e. `StyleUtils.getBackgroundAndBorderStyle(theme.componentBG`)
- [ ] If the PR modifies code that runs when editing or sending messages, I tested and verified there is no unexpected behavior for all supported markdown - URLs, single line code, code blocks, quotes, headings, bold, strikethrough, and italic.
- [ ] If the PR modifies a generic component, I tested and verified that those changes do not break usages of that component in the rest of the App (i.e. if a shared library or component like `Avatar` is modified, I verified that `Avatar` is working as expected in all cases)
- [ ] If the PR modifies a component related to any of the existing Storybook stories, I tested and verified all stories for that component are still working as expected.
Expand Down
10 changes: 0 additions & 10 deletions docs/_data/_routes.yml
Original file line number Diff line number Diff line change
Expand Up @@ -112,21 +112,11 @@ platforms:
title: Expensify Card
icon: /assets/images/hand-card.svg
description: Explore how the Expensify Card combines convenience and security to enhance everyday business transactions. Discover how to apply for, oversee, and maximize your card perks here.

- href: expensify-partner-program
title: Expensify Partner Program
icon: /assets/images/handshake.svg
description: Discover how to get the most out of Expensify as an ExpensifyApproved! accountant partner. Learn how to set up your clients, receive CPE credits, and take advantage of your partner discount.

- href: get-paid-back
title: Get Paid Back
icon: /assets/images/money-into-wallet.svg
description: Whether you submit an expense report or an invoice, find out here how to ensure a smooth and timely payback process every time.

- href: send-payments
title: Send Payments
icon: /assets/images/money-wings.svg
description: Uncover step-by-step guidance on sending direct reimbursements to employees, paying an invoice to a vendor, and utilizing third-party payment options.

- href: workspace-and-domain-settings
title: Workspace & Domain Settings
Expand Down
21 changes: 12 additions & 9 deletions docs/articles/expensify-classic/account-settings/Merge-Accounts.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,29 +5,32 @@ description: How to merge two Expensify accounts and why this is useful.

# Overview

Merging accounts allows you to combine two accounts. When you combine two accounts, all receipts, expenses, expense reports, invoices, bills, imported cards, secondary logins, co-pilots, and group policy settings will be combined into one account.
Merging accounts allows you to combine two accounts. When you combine two accounts, all receipts, expenses, expense reports, invoices, bills, imported cards, secondary logins, co-pilots, and group workspace settings will be combined into one account.
This can be useful if you start off with an account of your own but your organization creates a separate account for you. You can then track both personal and business expenses via one account.

# How to merge accounts
Merging two accounts together is fairly straightforward. Let’s go over how to do that below:
1. Navigate to [expensify.com](https://www.expensify.com)
2. Log into the account you want to set as the Primary account
3. Navigate to Settings > Account > Account Details
4. Scroll down to the Merge Accounts section and fill in the fields. Once you click Merge, a magic code link will be sent to you via email and you'll be prompted to enter the magic code
5. Copy the magic code, switch back to the expensify.com page, and paste the code into the required field
3. Navigate to **Settings > Account > Account Details**
4. Scroll down to Merge Accounts and fill in the fields
6. Click Merge Accounts
7. Once you click Merge, a magic code is sent to you via email
8. Paste the code into the required field
If you have any questions about this process, feel free to reach out to Concierge for some assistance!

# FAQ
## Can you merge accounts from the mobile app?
No, accounts can only be merged from the full website at expensify.com.
## Can I administratively merge two accounts together?
No, only the account holder (user) can perform account merging.
No, only the account holder (member) can perform account merging.
## Is merging accounts reversible?
No, merging accounts is not reversible. It is a permanent action that cannot be undone.
## I have open expenses in the account I'm merging from. Will those expenses merge into the new account?
All expenses must be reported and submitted for them to merge into the new account. Any open expenses will not merge.
## Are there any restrictions on account merging?
Yes! Please see below:
* If your email address belongs to a verified domain (verified in Expensify), you must start the process from the email account under the verified domain. You cannot merge a verified company email account into a personal account.
* If you have two accounts with two different verified domains, you cannot merge them together.
## What happens to my “personal” Individual policy when merging accounts?
The old “personal” Individual policy will be deleted. If you plan to submit reports under a different policy in the future, ensure that any reports on the Individual policy in the old account are marked as Open before merging the accounts. You can typically do this by selecting “Undo Submit” on any submitted reports.
- If your email address belongs to a verified domain (verified in Expensify), you must start the process from the email account under the verified domain. You cannot merge a verified company email account into a personal account.
- If you have two accounts with two different verified domains, you cannot merge them together.
## What happens to my “personal” Individual workspace when merging accounts?
The old “personal” Individual workspace is deleted. If you plan to submit reports under a different workspace in the future, ensure that any reports on the Individual workspace in the old account are marked as Open before merging the accounts. You can typically do this by selecting “Undo Submit” on any submitted reports.
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
---
title: Company-Card-Settings.md
description: Company card settings
description: Once you connect your cards, customize the configuration using company card settings.
---
# Overview
Once you’ve imported your company cards via commercial card feed, direct bank feed, or CSV import, the next step is to configure the cards’ settings.
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
---
title: Cardholder Settings and Features
description: Expensify Card Settings for Employees
---

# How to use your Expensify Card
Once you receive your card, you can start using it right away.

First, you'll want to take note of the Smart Limit tied to your card – this is listed in your card settings via **Settings > Account > Credit Card Import**. This limit represents the total amount of unapproved expenses you can have on the card.

It's crucial to continuously submit your expenses promptly, as that'll ensure they can be approved and restore your full limit. You can always chat with your admin if you need your limit adjusted.

You can swipe your Expensify Card like you would with any other card. As you make purchases, you'll get instant alerts on your phone letting you know if you need to SmartScan receipts. Any SmartScanned receipts should merge with the card expense automatically.

If your organization doesn't require itemized receipts, you can rely on eReceipts instead. As long as the expense isn't lodging-related, Expensify will automatically generate an IRS-compliant eReceipt for every transaction.

You can report and submit Expensify Card expenses just like any other expenses. As they're approved, your Smart Limit will be refreshed accordingly, allowing you to keep making purchases.

## Enable Notifications
Download the Expensify mobile app and enable push notifications to stay current on your spending activity. Your card is connected to your Expensify account, so each transaction on your card will trigger a push notification. We'll also send you a push notification if we detect potentially fraudulent activity and allow you to confirm your purchase.

Follow the steps below to enable real-time alerts on your mobile device.

**If you have an iPhone**:
1. Open the Expensify app and tap the three-bar icon in the upper-left corner
2. Tap **Settings** and enable **Receive realtime alerts**
3. Accept the confirmation dialogue to go to your iPhone's notification settings for Expensify. Turn on Allow Notifications, and choose the notification types you’d like!

**If you have an Android**:
1. Go to Settings and open 'Apps and Notifications'.
2. Find and open Expensify and enable notifications.
3. Customize your alerts. Depending on your phone model, you may have extra options to customize the types of notifications you receive.

## Your virtual card
Once you're assigned a limit, you'll be able to use your virtual card immediately. You can view your virtual card details via **Settings > Account > Credit Card Import > Show Details**. Keep in mind that your virtual card and physical card share a limit.

The virtual Expensify Card includes a card number, expiration date, and security code (CVC). You can use the virtual card for online purchases, in-app transactions, and in-person payments once it's linked to a mobile wallet (Apple Pay or Google Pay).

## How to access your virtual card details
Here's how to access your virtual card details via the Expensify mobile app:
1. Tap the three-bar icon in the upper-left corner
2. Tap **Settings > Connected Cards**
3. Under **Virtual Card**, tap **Show Details**

From there, you can view your virtual card's number, CVV, expiration date, and billing address.

Here's how to access your virtual card details via the Expensify web app:
1. Head to **Settings > Account > Credit Card Import**
2. Under **Virtual Card**, click **Show Details**

From there, you can view your virtual card's card number, CVV, expiration date, and billing address.

## How to add your virtual card to a digital wallet (Apple Pay or Google Pay)

To use the Expensify Card for contactless payment, add it to your digital wallet from the mobile app:
1. Tap the three-bar icon in the upper-left corner
2. Tap **Settings > Connected Cards**
3. Depending on your device, tap **Add to Apple Wallet** or **Add to Gpay**
4. Complete the remaining steps

## Expensify Card declines
As long as you've enabled 'Receive real-time alerts', you'll get a notification explaining the reason for each decline. You can enable alerts in the mobile app by clicking on the three-bar icon in the upper-left corner > **Settings** > toggle **Receive real-time alerts**.

Here are some reasons an Expensify Card transaction might be declined:

- You have an insufficient card limit
- If a transaction exceeds your Expensify Card's available limit, the transaction will be declined. You can see the remaining limit in the mobile app under **Settings > Connected Cards** or in the web app under **Settings > Account > Credit Card Import**.
- Submitting expenses and getting them approved will free up your limit for more spending.

- Your card isn't active yet or it was disabled by your Domain Admin
- Your card information was entered incorrectly with the merchant. Entering incorrect card information, such as the CVC, ZIP, or expiration date, will also lead to declines.
There was suspicious activity
- If Expensify detects unusual or suspicious activity, we may block transactions as a security measure
- This could happen due to irregular spending patterns, attempted purchases from risky vendors, or multiple rapid transactions.
- Check your Expensify Home page to approve unusual merchants and try again.
- If the spending looks suspicious, we may complete a manual due diligence check, and our team will do this as quickly as possible - your cards will all be locked while this happens.
- The merchant is located in a restricted country

# FAQ
## Can I use Smart Limits with a free Expensify account?
If you're on the Free plan, you won't have the option to use Smart Limits. Your card limit will simply reset at the end of each calendar month.

## I still haven't received my Expensify Card. What should I do?
For more information on why your card hasn't arrived, you can check out this resource on [Requesting a Card](https://help.expensify.com/articles/expensify-classic/expensify-card/Request-the-Card#what-if-i-havent-received-my-card-after-multiple-weeks).
Loading

0 comments on commit 8f7c76b

Please sign in to comment.