Skip to content

Commit 7936c1e

Browse files
committed
Merge remote-tracking branch 'origin' into fix/62703
2 parents 641dd3b + e20d305 commit 7936c1e

27 files changed

Lines changed: 290 additions & 125 deletions

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 1009017803
118-
versionName "9.1.78-3"
117+
versionCode 1009017804
118+
versionName "9.1.78-4"
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"
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
---
2+
title: Merge Accounts
3+
description: Learn how to merge multiple Expensify accounts to consolidate data and simplify logging in.
4+
keywords: [merge accounts, New Expensify, account consolidation, personal account, company account, merge data]
5+
---
6+
7+
<div id="new-expensify" markdown="1">
8+
9+
If you have multiple Expensify accounts, you can merge them into a single login. This combines all of your receipts, expenses, reports, invoices, imported cards, Copilots, and workspace access into one account for easier management.
10+
11+
---
12+
13+
# Important Notes About Merging
14+
15+
- **Merging accounts is permanent and cannot be undone.**
16+
- You must log in to the **company account** and merge the **personal account** into it.
17+
- You **cannot merge**:
18+
- A company account into a personal account.
19+
- Two company accounts on private domains.
20+
21+
**Note:** If your company uses **SAML authentication**, a domain admin must approve the request. In that case, you’ll be prompted to **Switch to Classic** to initiate this.
22+
23+
---
24+
25+
# How to Merge Accounts
26+
27+
1. Log in to the account you want to keep as your primary account.
28+
2. In the left-hand menu, go to **Account > Security**.
29+
3. Click **Merge Accounts**.
30+
4. Enter the **email address or phone number** for the account you want to merge into this one.
31+
5. Check the box that says **"Yes, I understand this is not reversible"**.
32+
6. Click **Merge Accounts**.
33+
7. Check your email for the magic code sent by Expensify.
34+
8. Enter the code into the prompt and click **Merge**.
35+
36+
---
37+
38+
# FAQ
39+
40+
## What happens to my data when I merge accounts?
41+
42+
The following items from the merged account will be transferred to your primary account:
43+
44+
- Receipts and expenses
45+
- Expense reports
46+
- Invoices and bills
47+
- Imported cards
48+
- Secondary logins
49+
- Co-pilots
50+
- Group workspace settings
51+
52+
</div>

ios/NewExpensify/Info.plist

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@
4444
</dict>
4545
</array>
4646
<key>CFBundleVersion</key>
47-
<string>9.1.78.3</string>
47+
<string>9.1.78.4</string>
4848
<key>FullStory</key>
4949
<dict>
5050
<key>OrgId</key>

ios/NotificationServiceExtension/Info.plist

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
<key>CFBundleShortVersionString</key>
1414
<string>9.1.78</string>
1515
<key>CFBundleVersion</key>
16-
<string>9.1.78.3</string>
16+
<string>9.1.78.4</string>
1717
<key>NSExtension</key>
1818
<dict>
1919
<key>NSExtensionPointIdentifier</key>

ios/ShareViewController/Info.plist

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
<key>CFBundleShortVersionString</key>
1414
<string>9.1.78</string>
1515
<key>CFBundleVersion</key>
16-
<string>9.1.78.3</string>
16+
<string>9.1.78.4</string>
1717
<key>NSExtension</key>
1818
<dict>
1919
<key>NSExtensionAttributes</key>

package-lock.json

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

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "new.expensify",
3-
"version": "9.1.78-3",
3+
"version": "9.1.78-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.",

src/components/Search/FilterDropdowns/UserSelectPopup.tsx

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,11 @@
11
import isEmpty from 'lodash/isEmpty';
2-
import React, {memo, useCallback, useEffect, useMemo, useState} from 'react';
2+
import React, {memo, useCallback, useMemo, useState} from 'react';
33
import {View} from 'react-native';
44
import Button from '@components/Button';
55
import {usePersonalDetails} from '@components/OnyxProvider';
66
import {useOptionsList} from '@components/OptionListContextProvider';
77
import SelectionList from '@components/SelectionList';
88
import UserSelectionListItem from '@components/SelectionList/Search/UserSelectionListItem';
9-
import useDebouncedState from '@hooks/useDebouncedState';
109
import useLocalize from '@hooks/useLocalize';
1110
import useOnyx from '@hooks/useOnyx';
1211
import useResponsiveLayout from '@hooks/useResponsiveLayout';
@@ -16,7 +15,6 @@ import canFocusInputOnScreenFocus from '@libs/canFocusInputOnScreenFocus';
1615
import type {Option, Section} from '@libs/OptionsListUtils';
1716
import {filterAndOrderOptions, getValidOptions} from '@libs/OptionsListUtils';
1817
import type {OptionData} from '@libs/ReportUtils';
19-
import {searchInServer} from '@userActions/Report';
2018
import CONST from '@src/CONST';
2119
import ONYXKEYS from '@src/ONYXKEYS';
2220

@@ -45,7 +43,7 @@ function UserSelectPopup({value, closeOverlay, onChange}: UserSelectPopupProps)
4543
const [accountID] = useOnyx(ONYXKEYS.SESSION, {canBeMissing: true, selector: (onyxSession) => onyxSession?.accountID});
4644
const shouldFocusInputOnScreenFocus = canFocusInputOnScreenFocus();
4745

48-
const [searchTerm, debouncedSearchTerm, setSearchTerm] = useDebouncedState('');
46+
const [searchTerm, setSearchTerm] = useState('');
4947
const [isSearchingForReports] = useOnyx(ONYXKEYS.IS_SEARCHING_FOR_REPORTS, {initWithStoredValues: false, canBeMissing: true});
5048
const [selectedOptions, setSelectedOptions] = useState<Option[]>(() => {
5149
return value.reduce<OptionData[]>((acc, id) => {
@@ -83,6 +81,7 @@ function UserSelectPopup({value, closeOverlay, onChange}: UserSelectPopupProps)
8381
const {personalDetails: filteredOptionsList, recentReports} = filterAndOrderOptions(optionsList, cleanSearchTerm, {
8482
excludeLogins: CONST.EXPENSIFY_EMAILS_OBJECT,
8583
maxRecentReportsToShow: CONST.IOU.MAX_RECENT_REPORTS_TO_SHOW,
84+
canInviteUser: false,
8685
});
8786

8887
const personalDetailList = filteredOptionsList
@@ -154,10 +153,6 @@ function UserSelectPopup({value, closeOverlay, onChange}: UserSelectPopupProps)
154153
closeOverlay();
155154
}, [closeOverlay, onChange]);
156155

157-
useEffect(() => {
158-
searchInServer(debouncedSearchTerm.trim());
159-
}, [debouncedSearchTerm]);
160-
161156
const isLoadingNewOptions = !!isSearchingForReports;
162157
const dataLength = sections.flatMap((section) => section.data).length;
163158

src/components/Search/SearchFiltersParticipantsSelector.tsx

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ import {usePersonalDetails} from '@components/OnyxProvider';
33
import {useOptionsList} from '@components/OptionListContextProvider';
44
import SelectionList from '@components/SelectionList';
55
import UserSelectionListItem from '@components/SelectionList/Search/UserSelectionListItem';
6-
import useDebouncedState from '@hooks/useDebouncedState';
76
import useLocalize from '@hooks/useLocalize';
87
import useOnyx from '@hooks/useOnyx';
98
import useScreenWrapperTransitionStatus from '@hooks/useScreenWrapperTransitionStatus';
@@ -13,7 +12,6 @@ import type {Option, Section} from '@libs/OptionsListUtils';
1312
import type {OptionData} from '@libs/ReportUtils';
1413
import {getDisplayNameForParticipant} from '@libs/ReportUtils';
1514
import Navigation from '@navigation/Navigation';
16-
import {searchInServer} from '@userActions/Report';
1715
import CONST from '@src/CONST';
1816
import ONYXKEYS from '@src/ONYXKEYS';
1917
import ROUTES from '@src/ROUTES';
@@ -47,7 +45,7 @@ function SearchFiltersParticipantsSelector({initialAccountIDs, onFiltersUpdate}:
4745

4846
const [isSearchingForReports] = useOnyx(ONYXKEYS.IS_SEARCHING_FOR_REPORTS, {canBeMissing: false, initWithStoredValues: false});
4947
const [selectedOptions, setSelectedOptions] = useState<OptionData[]>([]);
50-
const [searchTerm, debouncedSearchTerm, setSearchTerm] = useDebouncedState('');
48+
const [searchTerm, setSearchTerm] = useState('');
5149
const cleanSearchTerm = useMemo(() => searchTerm.trim().toLowerCase(), [searchTerm]);
5250

5351
const defaultOptions = useMemo(() => {
@@ -72,6 +70,7 @@ function SearchFiltersParticipantsSelector({initialAccountIDs, onFiltersUpdate}:
7270
selectedOptions,
7371
excludeLogins: CONST.EXPENSIFY_EMAILS_OBJECT,
7472
maxRecentReportsToShow: CONST.IOU.MAX_RECENT_REPORTS_TO_SHOW,
73+
canInviteUser: false,
7574
});
7675
}, [defaultOptions, cleanSearchTerm, selectedOptions]);
7776

@@ -156,10 +155,6 @@ function SearchFiltersParticipantsSelector({initialAccountIDs, onFiltersUpdate}:
156155
// eslint-disable-next-line react-compiler/react-compiler, react-hooks/exhaustive-deps -- this should react only to changes in form data
157156
}, [initialAccountIDs, personalDetails]);
158157

159-
useEffect(() => {
160-
searchInServer(debouncedSearchTerm.trim());
161-
}, [debouncedSearchTerm]);
162-
163158
const handleParticipantSelection = useCallback(
164159
(option: Option) => {
165160
const foundOptionIndex = selectedOptions.findIndex((selectedOption: Option) => {

0 commit comments

Comments
 (0)