]`. Cross-link the migration PR and the created GH issue. On the same line as `@ts-expect-error`, put down the GH issue number prefixed with `TODO:`.
-
- > The `@ts-expect-error` annotation tells the TS compiler to ignore any errors in the line that follows it. However, if there's no error in the line, TypeScript will also raise an error.
-
- ```ts
- // @ts-expect-error TODO: #21647
- const x: number = "123"; // No TS error raised
-
- // @ts-expect-error
- const y: number = 123; // TS error: Unused '@ts-expect-error' directive.
- ```
-
-- The TS issue I'm working on is blocked by another TS issue because of type errors. What should I do?
-
- In order to proceed with the migration faster, we are now allowing the use of `@ts-expect-error` annotation to temporally suppress those errors and help you unblock your issues. The only requirements is that you MUST add the annotation with a comment explaining that it must be removed when the blocking issue is migrated, e.g.:
-
- ```tsx
- return (
-
- );
- ```
-
- **You will also need to reference the blocking issue in your PR.** You can find all the TS issues [here](https://github.com/orgs/Expensify/projects/46).
-
-## Learning Resources
-
-### Quickest way to learn TypeScript
-
-- Get up to speed quickly
- - [TypeScript playground](https://www.typescriptlang.org/play?q=231#example)
- - Go though all examples on the playground. Click on "Example" tab on the top
-- Handy Reference
- - [TypeScript CheatSheet](https://www.typescriptlang.org/cheatsheets)
- - [Type](https://www.typescriptlang.org/static/TypeScript%20Types-ae199d69aeecf7d4a2704a528d0fd3f9.png)
- - [Control Flow Analysis](https://www.typescriptlang.org/static/TypeScript%20Control%20Flow%20Analysis-8a549253ad8470850b77c4c5c351d457.png)
-- TypeScript with React
- - [React TypeScript CheatSheet](https://react-typescript-cheatsheet.netlify.app/)
- - [List of built-in utility types](https://react-typescript-cheatsheet.netlify.app/docs/basic/troubleshooting/utilities)
- - [HOC CheatSheet](https://react-typescript-cheatsheet.netlify.app/docs/hoc/)
diff --git a/docs/articles/new-expensify/connections/Set-up-QuickBooks-Online-connection.md b/docs/articles/new-expensify/connections/Set-up-QuickBooks-Online-connection.md
new file mode 100644
index 000000000000..6bc3b0896912
--- /dev/null
+++ b/docs/articles/new-expensify/connections/Set-up-QuickBooks-Online-connection.md
@@ -0,0 +1,126 @@
+---
+title: Set up QuickBooks Online connection
+description: Integrate QuickBooks Online with Expensify
+---
+
+
+{% include info.html %}
+To use the QuickBooks Online connection, you must have a QuickBooks Online account and an Expensify Collect plan. The QuickBooks Self-employed subscription is not supported.
+{% include end-info.html %}
+
+The features available for the Expensify connection with QuickBooks Online vary based on your QuickBooks subscription. The features may still be visible in Expensify even if you don’t have access, but you will receive an error if the feature isn't available with your subscription.
+
+Here is a list of the features supported by each QuickBooks Online subscription:
+
+| Feature | Simple Start | Essentials | Essentials Plus |
+|----------------------------|--------------|------------|-----------------|
+| Expense Reports | ✔ | ✔ | ✔ |
+| GL Accounts as Categories | ✔ | ✔ | ✔ |
+| Credit Card Transactions | ✔ | ✔ | ✔ |
+| Debit Card Transaction | | ✔ | ✔ |
+| Classes | | ✔ | ✔ |
+| Customers | | ✔ | ✔ |
+| Projects | | ✔ | ✔ |
+| Vendor Bills | | ✔ | ✔ |
+| Journal Entries | | ✔ | ✔ |
+| Tax | | ✔ | ✔ |
+| Billable | | | ✔ |
+| Location | | | ✔ |
+
+To set up your QuickBooks Online connection, complete the 5 steps below.
+
+# Step 1: Set up employees in QuickBooks Online
+
+Log in to QuickBooks Online and ensure all of your employees are setup as either Vendors or Employees using the same email address that they are listed under in Expensify. This process may vary by country, but you can go to **Payroll** and select **Employees** in QuickBooks Online to add new employees or edit existing ones.
+
+# Step 2: Connect Expensify to QuickBooks Online
+
+
+ Click your profile image or icon in the bottom left menu.
+ Scroll down and click Workspaces in the left menu.
+ Select the workspace you want to connect to QuickBooks Online.
+ Click More features in the left menu.
+ Scroll down to the Integrate section and enable the Accounting toggle.
+ Click Accounting in the left menu.
+ Click Set up to the right of QuickBooks Online.
+ Enter your Intuit login details to import your settings from QuickBooks Online to Expensify.
+
+
+# Step 3: Configure import settings
+
+The following steps help you determine how data will be imported from QuickBooks Online to Expensify.
+
+
+ Under the Accounting settings for your workspace, click Import under the QuickBooks Online connection.
+ Review each of the following import settings:
+
+ Chart of accounts : The chart of accounts are automatically imported from QuickBooks Online as categories. This cannot be amended.
+ Classes : Choose whether to import classes, which will be shown in Expensify as tags for expense-level coding.
+ Customers/projects : Choose whether to import customers/projects, which will be shown in Expensify as tags for expense-level coding.
+ Locations : Choose whether to import locations, which will be shown in Expensify as tags for expense-level coding.
+{% include info.html %}
+As Locations are only configurable as tags, you cannot export expense reports as vendor bills or checks to QuickBooks Online. To unlock these export options, either disable locations import or upgrade to the Control Plan to export locations encoded as a report field.
+{% include end-info.html %}
+ Taxes : Choose whether to import tax rates and defaults.
+
+
+
+# Step 4: Configure export settings
+
+The following steps help you determine how data will be exported from Expensify to QuickBooks Online.
+
+
+ Under the Accounting settings for your workspace, click Export under the QuickBooks Online connection.
+ Review each of the following export settings:
+
+ Preferred Exporter : Choose whether to assign a Workspace Admin as the Preferred Exporter. Once selected, the Preferred Exporter automatically receives reports for export in their account to help automate the exporting process.
+
+{% include info.html %}
+* Other Workspace Admins will still be able to export to QuickBooks Online.
+* If you set different export accounts for individual company cards under your domain settings, then your Preferred Exporter must be a Domain Admin.
+{% include end-info.html %}
+
+ Date : Choose whether to use the date of last expense, export date, or submitted date.
+ Export Out-of-Pocket Expenses as : Select whether out-of-pocket expenses will be exported as a check, journal entry, or vendor bill.
+
+{% include info.html %}
+These settings may vary based on whether tax is enabled for your workspace.
+* If tax is not enabled on the workspace, you’ll also select the Accounts Payable/AP.
+* If tax is enabled on the workspace, journal entry will not be available as an option. If you select the journal entries option first and later enable tax on the workspace, you will see a red dot and an error message under the “Export Out-of-Pocket Expenses as” options. To resolve this error, you must change your export option to vendor bill or check to successfully code and export expense reports.
+{% include end-info.html %}
+
+ Invoices : Select the QuickBooks Online invoice account that invoices will be exported to.
+ Export as : Select whether company cards export to QuickBooks Online as a credit card (the default), debit card, or vendor bill. Then select the account they will export to.
+ If you select vendor bill, you’ll also select the accounts payable account that vendor bills will be created from, as well as whether to set a default vendor for credit card transactions upon export. If this option is enabled, you will select the vendor that all credit card transactions will be applied to.
+
+
+
+# Step 5: Configure advanced settings
+
+The following steps help you determine the advanced settings for your connection, like auto-sync and employee invitation settings.
+
+
+ Under the Accounting settings for your workspace, click Advanced under the QuickBooks Online connection.
+ Select an option for each of the following settings:
+
+ Auto-sync : Choose whether to enable QuickBooks Online to automatically communicate changes with Expensify to ensure that the data shared between the two systems is up-to-date. New report approvals/reimbursements will be synced during the next auto-sync period.
+ Invite Employees : Choose whether to enable Expensify to import employee records from QuickBooks Online and invite them to this workspace.
+ Automatically Create Entities : Choose whether to enable Expensify to automatically create vendors and customers in QuickBooks Online if a matching vendor or customer does not exist.
+ Sync Reimbursed Reports : Choose whether to enable report syncing for reimbursed expenses. If enabled, all reports that are marked as Paid in QuickBooks Online will also show in Expensify as Paid. If enabled, you must also select the QuickBooks Online account that reimbursements are coming out of, and Expensify will automatically create the payment in QuickBooks Online.
+ Invoice Collection Account : Select the invoice collection account that you want invoices to appear under once the invoice is marked as paid.
+
+
+
+{% include faq-begin.md %}
+
+**Why do I see a red dot next to my connection?**
+If there is an error with your connection, you’ll see a red dot next to Accounting in the left menu. When you click Accounting, you’ll also see a red dot displayed next to the QuickBooks Online connection card.
+
+This may occur if you incorrectly enter your QuickBooks Online login information when trying to establish the connection. To resubmit your login details,
+1. Click the three-dot menu to the right of the QuickBooks Online connection.
+2. Click **Enter credentials**.
+3. Enter your Intuit login details (the login information you use for QuickBooks Online) to establish the connection.
+
+{% include faq-end.md %}
+
+
diff --git a/docs/articles/new-expensify/expenses/Track-expenses.md b/docs/articles/new-expensify/expenses/Track-expenses.md
new file mode 100644
index 000000000000..f4eeea09ecec
--- /dev/null
+++ b/docs/articles/new-expensify/expenses/Track-expenses.md
@@ -0,0 +1,43 @@
+---
+title: Track Expenses
+description: Create, store, or share non-reimbursable expenses
+---
+
+
+Create, store, or share non-reimbursable expenses with the Track Expenses feature.
+
+{% include selector.html values="desktop, mobile" %}
+
+{% include option.html value="desktop" %}
+1. Click the + icon in the bottom left menu and select **Track Expense**.
+2. Create the expense manually, scan the receipt, or add a distance expense.
+
+{% include info.html %}
+For an in-depth walkthrough on how to create an expense, check out the
create an expense article.
+{% include end-info.html %}
+
+3. Choose the next steps for the expense:
+ - **Submit it to someone**: Select this option to request payment from other members of your Expensify workspace.
+ - **Categorize it**: Select this option to choose a category and additional details to code the expense for a specific workspace. The expense will then be placed on a report and can be submitted to the workspace for approval.
+ - **Share it with my accountant**: Select this option to share the expense with your accountant. The expense will then be placed on a report under the workspace for your accountant to review.
+ - **Nothing for now**: Select this option to store the expense. Expensify will keep the expense until you are ready to take action on it—it won’t expire. When you’re ready, you can then select one of the above options for the expense at a later time.
+{% include end-option.html %}
+
+{% include option.html value="mobile" %}
+1. Tap the + icon in the bottom menu and select **Track Expense**.
+2. Create the expense manually, scan the receipt, or add a distance expense.
+
+{% include info.html %}
+For an in-depth walkthrough on how to create an expense, check out the
create an expense article.
+{% include end-info.html %}
+
+3. Choose the next steps for the expense:
+ - **Submit it to someone**: Select this option to request payment from a contact in your phone’s contact list or from other members of your Expensify workspace.
+ - **Categorize it**: Select this option to choose a category and additional details to code the expense for a specific workspace. The expense will then be placed on a report and can be submitted to the workspace for approval.
+ - **Share it with my accountant**: Select this option to share the expense with your accountant. The expense will then be placed on a report under the workspace for your accountant to review.
+ - **Nothing for now**: Select this option to store the expense. Expensify will keep the expense until you are ready to take action on it—it won’t expire. When you’re ready, you can then select one of the above options for the expense at a later time.
+{% include end-option.html %}
+
+{% include end-selector.html %}
+
+
diff --git a/docs/articles/new-expensify/expensify-card/Upgrade-to-the-new-Expensify-Card-from-Visa.md b/docs/articles/new-expensify/expensify-card/Upgrade-to-the-new-Expensify-Card-from-Visa.md
new file mode 100644
index 000000000000..24f178db9f12
--- /dev/null
+++ b/docs/articles/new-expensify/expensify-card/Upgrade-to-the-new-Expensify-Card-from-Visa.md
@@ -0,0 +1,54 @@
+---
+title: Upgrade to the new Expensify Card from Visa
+description: Get the new Expensify Visa® Commercial Card
+---
+
+
+If your company is already using Expensify Cards, you can upgrade your cards for free to the new Expensify Visa® Commercial Card to get even more tools to manage employee spending, including:
+- Unlimited
virtual cards
+- Controlled spending amounts on virtual cards to manage subscriptions
+- Tighter controls for managing spend across employees and merchants
+- Fixed or monthly spend limits for each card
+- Unique naming for each virtual card for simplified expense categorization
+
+# Upgrade your company’s Expensify Cards
+
+{% include info.html %}
+This process must be completed by a Domain Admin. Although the process is available for all Domain Admins, only one admin needs to complete these steps.
+
+Before completing this process, you’ll want to:
+
+- Have your employees update their address if needed so that they receive their new Expensify Card in the mail before completing the steps below.
+- Ensure that existing cardholders have a limit greater than $0 if you want them to receive a new Expensify Card. If their limit is $0, increase the limit.
+{% include end-info.html %}
+
+1. On your Home page, click the task titled “Upgrade to the new and improved Expensify Card.”
+2. Review and agree to the Terms of Service.
+3. Click **Get the new card**. All existing cardholders with a limit greater than $0 will be automatically mailed a new physical card to the address they have on file. Virtual cards will be automatically issued and available for immediate use.
+4. If you have Positive Pay enabled for your settlement account, contact your bank as soon as possible to whitelist the new ACH ID: 2270239450.
+5. Remind your employees to update their payment information for recurring charges to their virtual card information.
+
+New cards will have the same limit as the existing cards. Each cardholder’s current physical and virtual cards will remain active until a Domain Admin or the cardholder deactivates it.
+
+{% include info.html %}
+Cards won’t be issued to any employees who don’t currently have them. In this case, you’ll need to
issue a new card .
+{% include end-info.html %}
+
+{% include faq-begin.md %}
+
+**Why don’t I see the task to agree to new terms on my Home page?**
+
+There are a few reasons why you might not see the task on your Home page:
+- You may not be a Domain Admin
+- Another domain admin has already accepted the terms
+- The task may be hidden. To find hidden tasks, scroll to the bottom of the Home page and click **Show Hidden Tasks** to see all of your available tasks.
+
+**Will this affect the continuous reconciliation process?**
+
+No. During the transition period, you may have some employees with old cards and some with new cards, so you’ll have two different debits (settlements) made to your settlement account for each settlement period. Once all spending has transitioned to the new cards, you’ll only see one debit/settlement.
+
+**Do I have to upgrade to the new Expensify Visa® Commercial Card?**
+
+Yes. We’ll provide a deadline soon. But don’t worry—you’ll have plenty of time to upgrade.
+{% include faq-end.md %}
+
diff --git a/docs/articles/new-expensify/settings/Close-account.md b/docs/articles/new-expensify/settings/Close-account.md
new file mode 100644
index 000000000000..e0d8fba2f452
--- /dev/null
+++ b/docs/articles/new-expensify/settings/Close-account.md
@@ -0,0 +1,44 @@
+---
+title: Close account
+description: Close an Expensify account
+---
+
+
+Closing your account will delete the data associated with the account. However, transactions shared with other accounts, including approved and reimbursed company expenses, will still be visible under those accounts. We may also be required to retain certain transaction records in compliance with laws in various jurisdictions.
+
+{% include selector.html values="desktop, mobile" %}
+
+{% include option.html value="desktop" %}
+1. Click your profile image or icon in the bottom left menu.
+2. Click **Security** in the left menu.
+3. Click **Close account**.
+4. Provide answers to the question prompts, then click **Close Account**.
+{% include end-option.html %}
+
+{% include option.html value="mobile" %}
+1. Tap your profile image or icon in the bottom menu.
+2. Tap **Security**.
+3. Tap **Close account**.
+4. Provide answers to the question prompts, then tap **Close Account**.
+{% include end-option.html %}
+
+{% include end-selector.html %}
+
+{% include faq-begin.md %}
+
+**I’m unable to close my account.**
+
+If your account has an outstanding balance or if you have been assigned a role under a company’s Expensify workspace, you may encounter an error message during the account closure process, or the Close Account button may not be available. Here are the steps to follow for each scenario:
+
+- **Account Under a Validated Domain**: A Domain Admin must remove your account from the domain. Then you will be able to successfully close your account.
+- **Sole Domain Admin**: If you are the only Domain Admin for a company’s domain, you must assign a new Domain Admin before you can close your account.
+- **Workspace Billing Owner with an annual subscription**: You must downgrade from the annual subscription before closing the account. Alternatively, you can have another user take over billing for your workspaces.
+- **Company Workspace Owner**: You must assign a new workspace owner before you can close your account.
+- **Account has an outstanding balance**: You must make a payment to resolve the outstanding balance before you can close your account.
+- **Preferred Exporter for a workspace integration**: You must assign a new Preferred Exporter before closing your account.
+- **Verified Business Account that is locked**: You must unlock the account.
+- **Verified Business Account that has an outstanding balance**: You must make a payment to settle any outstanding balances before the account can be closed.
+- **Unverified account**: You must first verify your account before it can be closed.
+{% include faq-end.md %}
+
+
diff --git a/docs/articles/new-expensify/settings/Switch-to-light-or-dark-mode.md b/docs/articles/new-expensify/settings/Switch-to-light-or-dark-mode.md
new file mode 100644
index 000000000000..34f96f9f5f7d
--- /dev/null
+++ b/docs/articles/new-expensify/settings/Switch-to-light-or-dark-mode.md
@@ -0,0 +1,30 @@
+---
+title: Switch to light or dark mode
+description: Change the appearance of Expensify
+---
+
+
+Expensify has three theme options that determine how the app looks:
+- **Dark mode**: The app appears with a dark background
+- **Light mode**: The app appears with a light background
+- **Use Device settings**: Expensify will automatically use your device’s default theme
+
+To change your Expensify theme,
+
+{% include selector.html values="desktop, mobile" %}
+
+{% include option.html value="desktop" %}
+1. Click your profile image or icon in the bottom left menu.
+2. Click **Preferences** in the left menu.
+3. Click the **Theme** option and select the desired theme.
+{% include end-option.html %}
+
+{% include option.html value="mobile" %}
+1. Tap your profile image or icon in the bottom menu.
+2. Tap **Preferences**.
+3. Tap the **Theme** option and select the desired theme.
+{% include end-option.html %}
+
+{% include end-selector.html %}
+
+
diff --git a/docs/articles/new-expensify/workspaces/Require-tags-and-categories-for-expenses.md b/docs/articles/new-expensify/workspaces/Require-tags-and-categories-for-expenses.md
new file mode 100644
index 000000000000..294dcfc57a23
--- /dev/null
+++ b/docs/articles/new-expensify/workspaces/Require-tags-and-categories-for-expenses.md
@@ -0,0 +1,39 @@
+---
+title: Require tags and categories for expenses
+description: Make tags and/or categories required for all expenses
+---
+
+
+To require workspace members to add tags and/or categories to their expenses,
+
+{% include selector.html values="desktop, mobile" %}
+
+{% include option.html value="desktop" %}
+1. Click your profile image or icon in the bottom left menu.
+2. Scroll down and click **Workspaces** in the left menu.
+3. Select a workspace.
+4. Click **Tags** or **Categories** in the left menu.
+5. Click **Settings** at the top right of the page.
+6. Enable the “Members must tag/categorize all spend” toggle.
+7. If desired, repeat steps 4-6 for tags or categories (whichever you haven’t done yet).
+{% include end-option.html %}
+
+{% include option.html value="mobile" %}
+1. Tap your profile image or icon in the bottom menu.
+2. Tap **Workspaces**.
+3. Select a workspace.
+4. Tap **Tags** or **Categories**.
+5. Tap **Settings** at the top right of the page.
+6. Enable the “Members must tag/categorize all spend” toggle.
+7. If desired, repeat steps 4-6 for tags or categories (whichever you haven’t done yet).
+{% include end-option.html %}
+
+{% include end-selector.html %}
+
+This will highlight the tag and/or category field as required on all expenses.
+
+{% include info.html %}
+Expenses will still be able to be submitted without a tag and/or category even if they are set as required. The submitter and approver will see an orange dot on the expense details alerting them that the tag/category is missing.
+{% include end-info.html %}
+
+
diff --git a/docs/redirects.csv b/docs/redirects.csv
index f775d2f97094..c3d6020bbc83 100644
--- a/docs/redirects.csv
+++ b/docs/redirects.csv
@@ -170,3 +170,4 @@ https://help.expensify.com/articles/expensify-classic/reports/Report-Audit-Log-a
https://help.expensify.com/articles/expensify-classic/reports/The-Reports-Page,https://help.expensify.com/articles/expensify-classic/reports/Report-statuses
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
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
+https://help.expensify.com/articles/new-expensify/settings/Profile,https://help.expensify.com/new-expensify/hubs/settings/
diff --git a/ios/NewApp_AdHoc.mobileprovision.gpg b/ios/NewApp_AdHoc.mobileprovision.gpg
index 440309f63c6e..29d379151525 100644
Binary files a/ios/NewApp_AdHoc.mobileprovision.gpg and b/ios/NewApp_AdHoc.mobileprovision.gpg differ
diff --git a/ios/NewApp_AdHoc_Notification_Service.mobileprovision.gpg b/ios/NewApp_AdHoc_Notification_Service.mobileprovision.gpg
index 2de81ee85018..cf14d27d7d87 100644
Binary files a/ios/NewApp_AdHoc_Notification_Service.mobileprovision.gpg and b/ios/NewApp_AdHoc_Notification_Service.mobileprovision.gpg differ
diff --git a/ios/NewExpensify/Info.plist b/ios/NewExpensify/Info.plist
index 14bf7ffba924..4120e6accb86 100644
--- a/ios/NewExpensify/Info.plist
+++ b/ios/NewExpensify/Info.plist
@@ -19,7 +19,7 @@
CFBundlePackageType
APPL
CFBundleShortVersionString
- 1.4.71
+ 1.4.72
CFBundleSignature
????
CFBundleURLTypes
@@ -40,7 +40,7 @@
CFBundleVersion
- 1.4.71.0
+ 1.4.72.1
FullStory
OrgId
diff --git a/ios/NewExpensifyTests/Info.plist b/ios/NewExpensifyTests/Info.plist
index 6af8bb6ddc16..11edf545cea4 100644
--- a/ios/NewExpensifyTests/Info.plist
+++ b/ios/NewExpensifyTests/Info.plist
@@ -15,10 +15,10 @@
CFBundlePackageType
BNDL
CFBundleShortVersionString
- 1.4.71
+ 1.4.72
CFBundleSignature
????
CFBundleVersion
- 1.4.71.0
+ 1.4.72.1
diff --git a/ios/NotificationServiceExtension/Info.plist b/ios/NotificationServiceExtension/Info.plist
index da2d70d0e859..1f777d1739e4 100644
--- a/ios/NotificationServiceExtension/Info.plist
+++ b/ios/NotificationServiceExtension/Info.plist
@@ -11,9 +11,9 @@
CFBundleName
$(PRODUCT_NAME)
CFBundleShortVersionString
- 1.4.71
+ 1.4.72
CFBundleVersion
- 1.4.71.0
+ 1.4.72.1
NSExtension
NSExtensionPointIdentifier
diff --git a/package-lock.json b/package-lock.json
index cdc8a6c1b04b..e2d9b6d2988b 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,12 +1,12 @@
{
"name": "new.expensify",
- "version": "1.4.71-0",
+ "version": "1.4.72-1",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "new.expensify",
- "version": "1.4.71-0",
+ "version": "1.4.72-1",
"hasInstallScript": true,
"license": "MIT",
"dependencies": {
diff --git a/package.json b/package.json
index 1aabe53b5480..c91a7a6acc4c 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "new.expensify",
- "version": "1.4.71-0",
+ "version": "1.4.72-1",
"author": "Expensify, Inc.",
"homepage": "https://new.expensify.com",
"description": "New Expensify is the next generation of Expensify: a reimagination of payments based atop a foundation of chat.",
diff --git a/src/CONST.ts b/src/CONST.ts
index 19720c05a93c..edceb11edd85 100755
--- a/src/CONST.ts
+++ b/src/CONST.ts
@@ -1301,6 +1301,17 @@ const CONST = {
SYNC: 'sync',
IMPORT_CUSTOMERS: 'importCustomers',
IMPORT_TAX_RATES: 'importTaxRates',
+ IMPORT_TRACKING_CATEGORIES: 'importTrackingCategories',
+ MAPPINGS: 'mappings',
+ TRACKING_CATEGORY_PREFIX: 'trackingCategory_',
+ TRACKING_CATEGORY_FIELDS: {
+ COST_CENTERS: 'cost centers',
+ REGION: 'region',
+ },
+ TRACKING_CATEGORY_OPTIONS: {
+ DEFAULT: 'DEFAULT',
+ TAG: 'TAG',
+ },
},
QUICKBOOKS_REIMBURSABLE_ACCOUNT_TYPE: {
@@ -2055,6 +2066,7 @@ const CONST = {
INFO: 'info',
},
REPORT_DETAILS_MENU_ITEM: {
+ SHARE_CODE: 'shareCode',
MEMBERS: 'member',
INVITE: 'invite',
SETTINGS: 'settings',
@@ -4734,13 +4746,18 @@ const CONST = {
CARD: 'card',
DISTANCE: 'distance',
},
+
+ SEARCH_DATA_TYPES: {
+ TRANSACTION: 'transaction',
+ },
} as const;
type Country = keyof typeof CONST.ALL_COUNTRIES;
type IOUType = ValueOf;
type IOUAction = ValueOf;
+type IOURequestType = ValueOf;
-export type {Country, IOUAction, IOUType, RateAndUnit, OnboardingPurposeType};
+export type {Country, IOUAction, IOUType, RateAndUnit, OnboardingPurposeType, IOURequestType};
export default CONST;
diff --git a/src/ROUTES.ts b/src/ROUTES.ts
index 9f84b3db0de1..afe806c193aa 100644
--- a/src/ROUTES.ts
+++ b/src/ROUTES.ts
@@ -780,6 +780,18 @@ const ROUTES = {
route: 'settings/workspaces/:policyID/accounting/xero/organization/:currentOrganizationID',
getRoute: (policyID: string, currentOrganizationID: string) => `settings/workspaces/${policyID}/accounting/xero/organization/${currentOrganizationID}` as const,
},
+ POLICY_ACCOUNTING_XERO_TRACKING_CATEGORIES: {
+ route: 'settings/workspaces/:policyID/accounting/xero/import/tracking-categories',
+ getRoute: (policyID: string) => `settings/workspaces/${policyID}/accounting/xero/import/tracking-categories` as const,
+ },
+ POLICY_ACCOUNTING_XERO_TRACKING_CATEGORIES_MAP_COST_CENTERS: {
+ route: 'settings/workspaces/:policyID/accounting/xero/import/tracking-categories/cost-centers',
+ getRoute: (policyID: string) => `settings/workspaces/${policyID}/accounting/xero/import/tracking-categories/cost-centers` as const,
+ },
+ POLICY_ACCOUNTING_XERO_TRACKING_CATEGORIES_MAP_REGION: {
+ route: 'settings/workspaces/:policyID/accounting/xero/import/tracking-categories/region',
+ getRoute: (policyID: string) => `settings/workspaces/${policyID}/accounting/xero/import/tracking-categories/region` as const,
+ },
POLICY_ACCOUNTING_XERO_CUSTOMER: {
route: '/settings/workspaces/:policyID/accounting/xero/import/customers',
getRoute: (policyID: string) => `/settings/workspaces/${policyID}/accounting/xero/import/customers` as const,
diff --git a/src/SCREENS.ts b/src/SCREENS.ts
index d4057c37b3dd..b76df331fe74 100644
--- a/src/SCREENS.ts
+++ b/src/SCREENS.ts
@@ -244,6 +244,9 @@ const SCREENS = {
XERO_ORGANIZATION: 'Policy_Accounting_Xero_Customers',
XERO_CUSTOMER: 'Policy_Acounting_Xero_Import_Customer',
XERO_TAXES: 'Policy_Accounting_Xero_Taxes',
+ XERO_TRACKING_CATEGORIES: 'Policy_Accounting_Xero_Tracking_Categories',
+ XERO_MAP_COST_CENTERS: 'Policy_Accounting_Xero_Map_Cost_Centers',
+ XERO_MAP_REGION: 'Policy_Accounting_Xero_Map_Region',
XERO_EXPORT: 'Policy_Accounting_Xero_Export',
XERO_ADVANCED: 'Policy_Accounting_Xero_Advanced',
XERO_INVOICE_ACCOUNT_SELECTOR: 'Policy_Accounting_Xero_Invoice_Account_Selector',
diff --git a/src/components/AmountTextInput.tsx b/src/components/AmountTextInput.tsx
index e5980a397d37..52c32ce1f584 100644
--- a/src/components/AmountTextInput.tsx
+++ b/src/components/AmountTextInput.tsx
@@ -36,6 +36,9 @@ type AmountTextInputProps = {
/** Style for the TextInput container */
containerStyle?: StyleProp;
+
+ /** Hide the focus styles on TextInput */
+ hideFocusedState?: boolean;
} & Pick;
function AmountTextInput(
@@ -50,6 +53,7 @@ function AmountTextInput(
onKeyPress,
containerStyle,
disableKeyboard = true,
+ hideFocusedState = true,
...rest
}: AmountTextInputProps,
ref: ForwardedRef,
@@ -57,7 +61,7 @@ function AmountTextInput(
return (
+ {
+ setIsLastMemberLeavingGroupModalVisible(false);
+ Report.leaveGroupChat(report.reportID);
+ }}
+ onCancel={() => setIsLastMemberLeavingGroupModalVisible(false)}
+ prompt={translate('groupChat.lastMemberWarning')}
+ confirmText={translate('common.leave')}
+ cancelText={translate('common.cancel')}
+ />
Report.togglePinnedState(report.reportID, isPinned)}
- icon={Expensicons.Pin}
+ onPress={() => {
+ if (Object.keys(report?.participants ?? {}).length === 1) {
+ setIsLastMemberLeavingGroupModalVisible(true);
+ return;
+ }
+
+ Report.leaveGroupChat(report.reportID);
+ }}
+ icon={Expensicons.Exit}
style={styles.flex1}
- text={isPinned ? translate('common.unPin') : translate('common.pin')}
+ text={translate('common.leave')}
/>
{
- Navigation.navigate(ROUTES.REPORT_WITH_ID_DETAILS_SHARE_CODE.getRoute(report?.reportID ?? ''));
- }}
- icon={Expensicons.QrCode}
+ onPress={() => Report.togglePinnedState(report.reportID, isPinned)}
+ icon={Expensicons.Pin}
style={styles.flex1}
- text={translate('common.share')}
+ text={isPinned ? translate('common.unPin') : translate('common.pin')}
/>