Skip to content

Commit 5701c46

Browse files
committed
Merge branch 'main' into perf/native-stack-v2
2 parents ce4f8c6 + e84dab7 commit 5701c46

Some content is hidden

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

52 files changed

+1136
-620
lines changed

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 1009004102
114-
versionName "9.0.41-2"
113+
versionCode 1009004104
114+
versionName "9.0.41-4"
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"

assets/images/table.svg

+2-2
Loading

docs/articles/expensify-classic/domains/Add-Domain-Members-and-Admins.md

-4
Original file line numberDiff line numberDiff line change
@@ -36,10 +36,6 @@ Once the member verifies their email address, all Domain Admins will be notified
3636
3. Click the **Domain Members** tab on the left.
3737
4. Under the Domain Members section, enter the first part of the member’s email address and click **Invite**.
3838

39-
{% include info.html %}
40-
This can be any email address—it does not have to be an email address under the domain. If someone who is not a Domain Admin invites a new member to a workspace, that member must validate their account via email before they will have access to it.
41-
{% include end-info.html %}
42-
4339
# Add Domain Admin
4440

4541
1. Hover over Settings, then click **Domains**.

ios/NewExpensify/Info.plist

+1-1
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@
4040
</dict>
4141
</array>
4242
<key>CFBundleVersion</key>
43-
<string>9.0.41.2</string>
43+
<string>9.0.41.4</string>
4444
<key>FullStory</key>
4545
<dict>
4646
<key>OrgId</key>

ios/NewExpensifyTests/Info.plist

+1-1
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,6 @@
1919
<key>CFBundleSignature</key>
2020
<string>????</string>
2121
<key>CFBundleVersion</key>
22-
<string>9.0.41.2</string>
22+
<string>9.0.41.4</string>
2323
</dict>
2424
</plist>

ios/NotificationServiceExtension/Info.plist

+1-1
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
<key>CFBundleShortVersionString</key>
1414
<string>9.0.41</string>
1515
<key>CFBundleVersion</key>
16-
<string>9.0.41.2</string>
16+
<string>9.0.41.4</string>
1717
<key>NSExtension</key>
1818
<dict>
1919
<key>NSExtensionPointIdentifier</key>

package-lock.json

+9-10
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "new.expensify",
3-
"version": "9.0.41-2",
3+
"version": "9.0.41-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.",
@@ -108,7 +108,7 @@
108108
"date-fns-tz": "^2.0.0",
109109
"dom-serializer": "^0.2.2",
110110
"domhandler": "^4.3.0",
111-
"expensify-common": "2.0.88",
111+
"expensify-common": "2.0.94",
112112
"expo": "51.0.31",
113113
"expo-av": "14.0.7",
114114
"expo-image": "1.12.15",
@@ -170,7 +170,7 @@
170170
"react-native-svg": "15.6.0",
171171
"react-native-tab-view": "^3.5.2",
172172
"react-native-url-polyfill": "^2.0.0",
173-
"react-native-view-shot": "4.0.0-alpha.3",
173+
"react-native-view-shot": "3.8.0",
174174
"react-native-vision-camera": "4.0.0-beta.13",
175175
"react-native-web": "^0.19.12",
176176
"react-native-web-sound": "^0.1.3",

src/CONST.ts

+4-4
Original file line numberDiff line numberDiff line change
@@ -4550,12 +4550,12 @@ const CONST = {
45504550
'Here’s how to set up categories:\n' +
45514551
'\n' +
45524552
'1. Click your profile picture.\n' +
4553-
'2. Go to Workspaces.\n' +
4553+
'2. Go to *Workspaces*.\n' +
45544554
'3. Select your workspace.\n' +
45554555
'4. Click *Categories*.\n' +
4556-
'5. Enable and disable default categories.\n' +
4557-
'6. Click *Add categories* to make your own.\n' +
4558-
'7. For more controls like requiring a category for every expense, click *Settings*.\n' +
4556+
'5. Add or import your own categories.\n' +
4557+
"6. Disable any default categories you don't need.\n" +
4558+
'7. Require a category for every expense in *Settings*.\n' +
45594559
'\n' +
45604560
`[Take me to workspace category settings](${workspaceCategoriesLink}).`,
45614561
},

src/components/Search/SearchContext.tsx

+30-3
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,39 @@
11
import React, {useCallback, useContext, useMemo, useState} from 'react';
2+
import type {ReportActionListItemType, ReportListItemType, TransactionListItemType} from '@components/SelectionList/types';
3+
import * as SearchUtils from '@libs/SearchUtils';
24
import type ChildrenProps from '@src/types/utils/ChildrenProps';
35
import type {SearchContext, SelectedTransactions} from './types';
46

57
const defaultSearchContext = {
68
currentSearchHash: -1,
79
selectedTransactions: {},
10+
selectedReports: [],
811
setCurrentSearchHash: () => {},
912
setSelectedTransactions: () => {},
1013
clearSelectedTransactions: () => {},
14+
shouldShowStatusBarLoading: false,
15+
setShouldShowStatusBarLoading: () => {},
1116
};
1217

1318
const Context = React.createContext<SearchContext>(defaultSearchContext);
1419

20+
function getReportsFromSelectedTransactions(data: TransactionListItemType[] | ReportListItemType[] | ReportActionListItemType[], selectedTransactions: SelectedTransactions) {
21+
return (data ?? [])
22+
.filter(
23+
(item) =>
24+
!SearchUtils.isTransactionListItemType(item) &&
25+
!SearchUtils.isReportActionListItemType(item) &&
26+
item.reportID &&
27+
item?.transactions?.every((transaction: {keyForList: string | number}) => selectedTransactions[transaction.keyForList]?.isSelected),
28+
)
29+
.map((item) => item.reportID);
30+
}
31+
1532
function SearchContextProvider({children}: ChildrenProps) {
16-
const [searchContextData, setSearchContextData] = useState<Pick<SearchContext, 'currentSearchHash' | 'selectedTransactions'>>({
33+
const [searchContextData, setSearchContextData] = useState<Pick<SearchContext, 'currentSearchHash' | 'selectedTransactions' | 'selectedReports'>>({
1734
currentSearchHash: defaultSearchContext.currentSearchHash,
1835
selectedTransactions: defaultSearchContext.selectedTransactions,
36+
selectedReports: defaultSearchContext.selectedReports,
1937
});
2038

2139
const setCurrentSearchHash = useCallback((searchHash: number) => {
@@ -25,10 +43,14 @@ function SearchContextProvider({children}: ChildrenProps) {
2543
}));
2644
}, []);
2745

28-
const setSelectedTransactions = useCallback((selectedTransactions: SelectedTransactions) => {
46+
const setSelectedTransactions = useCallback((selectedTransactions: SelectedTransactions, data: TransactionListItemType[] | ReportListItemType[] | ReportActionListItemType[]) => {
47+
// When selecting transactions, we also need to manage the reports to which these transactions belong. This is done to ensure proper exporting to CSV.
48+
const selectedReports = getReportsFromSelectedTransactions(data, selectedTransactions);
49+
2950
setSearchContextData((prevState) => ({
3051
...prevState,
3152
selectedTransactions,
53+
selectedReports,
3254
}));
3355
}, []);
3456

@@ -40,19 +62,24 @@ function SearchContextProvider({children}: ChildrenProps) {
4062
setSearchContextData((prevState) => ({
4163
...prevState,
4264
selectedTransactions: {},
65+
selectedReports: [],
4366
}));
4467
},
4568
[searchContextData.currentSearchHash],
4669
);
4770

71+
const [shouldShowStatusBarLoading, setShouldShowStatusBarLoading] = useState(false);
72+
4873
const searchContext = useMemo<SearchContext>(
4974
() => ({
5075
...searchContextData,
5176
setCurrentSearchHash,
5277
setSelectedTransactions,
5378
clearSelectedTransactions,
79+
shouldShowStatusBarLoading,
80+
setShouldShowStatusBarLoading,
5481
}),
55-
[searchContextData, setCurrentSearchHash, setSelectedTransactions, clearSelectedTransactions],
82+
[searchContextData, setCurrentSearchHash, setSelectedTransactions, clearSelectedTransactions, shouldShowStatusBarLoading],
5683
);
5784

5885
return <Context.Provider value={searchContext}>{children}</Context.Provider>;

src/components/Search/SearchFiltersChatsSelector.tsx

+2-2
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ function SearchFiltersChatsSelector({initialReportIDs, onFiltersUpdate, isScreen
5656
const selectedOptions = useMemo<OptionData[]>(() => {
5757
return selectedReportIDs.map((id) => {
5858
const report = getSelectedOptionData(OptionsListUtils.createOptionFromReport({...reports?.[`${ONYXKEYS.COLLECTION.REPORT}${id}`], reportID: id}, personalDetails));
59-
const alternateText = OptionsListUtils.getAlternateText(report, {showChatPreviewLine: true});
59+
const alternateText = OptionsListUtils.getAlternateText(report, {});
6060
return {...report, alternateText};
6161
});
6262
}, [personalDetails, reports, selectedReportIDs]);
@@ -65,7 +65,7 @@ function SearchFiltersChatsSelector({initialReportIDs, onFiltersUpdate, isScreen
6565
if (!areOptionsInitialized || !isScreenTransitionEnd) {
6666
return defaultListOptions;
6767
}
68-
return OptionsListUtils.getSearchOptions(options);
68+
return OptionsListUtils.getSearchOptions(options, '', undefined, false);
6969
}, [areOptionsInitialized, isScreenTransitionEnd, options]);
7070

7171
const chatOptions = useMemo(() => {

0 commit comments

Comments
 (0)