Skip to content

Commit 3024410

Browse files
committed
fix: conflicts
2 parents a99b7d6 + bc12ce0 commit 3024410

6 files changed

Lines changed: 55 additions & 85 deletions

File tree

src/CONST/index.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3067,6 +3067,13 @@ const CONST = {
30673067
PREVENT_SELF_APPROVAL: 'preventSelfApproval',
30683068
MAX_EXPENSE_AGE: 'maxExpenseAge',
30693069
},
3070+
PROHIBITED_EXPENSES: {
3071+
ALCOHOL: 'alcohol',
3072+
HOTEL_INCIDENTALS: 'hotelIncidentals',
3073+
GAMBLING: 'gambling',
3074+
TOBACCO: 'tobacco',
3075+
ADULT_ENTERTAINMENT: 'adultEntertainment',
3076+
},
30703077
CONNECTIONS: {
30713078
NAME: {
30723079
// Here we will add other connections names when we add support for them

src/hooks/usePaymentOptions.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,10 @@ function usePaymentOptions({
7171
if (typeof paymentMethod?.[policyIDKey] === 'string') {
7272
return paymentMethod?.[policyIDKey];
7373
}
74-
return (paymentMethod?.[policyIDKey] as LastPaymentMethodType)?.lastUsed;
74+
if (typeof (paymentMethod?.[policyIDKey] as LastPaymentMethodType)?.lastUsed === 'string') {
75+
return (paymentMethod?.[policyIDKey] as LastPaymentMethodType).lastUsed;
76+
}
77+
return (paymentMethod?.[policyIDKey] as LastPaymentMethodType)?.lastUsed.name;
7578
},
7679
});
7780
const [userWallet] = useOnyx(ONYXKEYS.USER_WALLET, {canBeMissing: true});

src/libs/actions/Policy/Policy.ts

Lines changed: 21 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4160,22 +4160,29 @@ function setPolicyMaxExpenseAmount(policyID: string, maxExpenseAmount: string) {
41604160
/**
41614161
*
41624162
* @param policyID
4163-
* @param prohibitedExpenses
4163+
* @param prohibitedExpense
41644164
*/
4165-
function setPolicyProhibitedExpenses(policyID: string, prohibitedExpenses: ProhibitedExpenses) {
4165+
function setPolicyProhibitedExpense(policyID: string, prohibitedExpense: keyof ProhibitedExpenses) {
41664166
// This will be fixed as part of https://github.com/Expensify/Expensify/issues/507850
41674167
// eslint-disable-next-line deprecation/deprecation
41684168
const policy = getPolicy(policyID);
41694169
const originalProhibitedExpenses = policy?.prohibitedExpenses;
4170+
const prohibitedExpenses = {
4171+
...originalProhibitedExpenses,
4172+
[prohibitedExpense]: !originalProhibitedExpenses?.[prohibitedExpense],
4173+
};
4174+
41704175
const onyxData: OnyxData = {
41714176
optimisticData: [
41724177
{
41734178
onyxMethod: Onyx.METHOD.MERGE,
41744179
key: `${ONYXKEYS.COLLECTION.POLICY}${policyID}`,
41754180
value: {
4176-
prohibitedExpenses,
4177-
pendingFields: {
4178-
prohibitedExpenses: CONST.RED_BRICK_ROAD_PENDING_ACTION.UPDATE,
4181+
prohibitedExpenses: {
4182+
...prohibitedExpenses,
4183+
pendingFields: {
4184+
[prohibitedExpense]: CONST.RED_BRICK_ROAD_PENDING_ACTION.UPDATE,
4185+
},
41794186
},
41804187
},
41814188
},
@@ -4185,7 +4192,11 @@ function setPolicyProhibitedExpenses(policyID: string, prohibitedExpenses: Prohi
41854192
onyxMethod: Onyx.METHOD.MERGE,
41864193
key: `${ONYXKEYS.COLLECTION.POLICY}${policyID}`,
41874194
value: {
4188-
pendingFields: {prohibitedExpenses: null},
4195+
prohibitedExpenses: {
4196+
pendingFields: {
4197+
[prohibitedExpense]: null,
4198+
},
4199+
},
41894200
errorFields: null,
41904201
},
41914202
},
@@ -4196,16 +4207,17 @@ function setPolicyProhibitedExpenses(policyID: string, prohibitedExpenses: Prohi
41964207
key: `${ONYXKEYS.COLLECTION.POLICY}${policyID}`,
41974208
value: {
41984209
prohibitedExpenses: originalProhibitedExpenses,
4199-
pendingFields: {prohibitedExpenses: null},
42004210
errorFields: {prohibitedExpenses: ErrorUtils.getMicroSecondOnyxErrorWithTranslationKey('common.genericErrorMessage')},
42014211
},
42024212
},
42034213
],
42044214
};
42054215

4216+
// Remove pendingFields before sending to the API
4217+
const {pendingFields, ...prohibitedExpensesWithoutPendingFields} = prohibitedExpenses;
42064218
const parameters: SetPolicyProhibitedExpensesParams = {
42074219
policyID,
4208-
prohibitedExpenses: JSON.stringify(prohibitedExpenses),
4220+
prohibitedExpenses: JSON.stringify(prohibitedExpensesWithoutPendingFields),
42094221
};
42104222

42114223
API.write(WRITE_COMMANDS.SET_POLICY_PROHIBITED_EXPENSES, parameters, onyxData);
@@ -5510,7 +5522,7 @@ export {
55105522
setPolicyMaxExpenseAmount,
55115523
setPolicyMaxExpenseAge,
55125524
updateCustomRules,
5513-
setPolicyProhibitedExpenses,
5525+
setPolicyProhibitedExpense,
55145526
setPolicyBillableMode,
55155527
disableWorkspaceBillableExpenses,
55165528
setWorkspaceEReceiptsEnabled,

src/pages/workspace/rules/IndividualExpenseRulesSection.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import type {TranslationPaths} from '@src/languages/types';
2020
import ROUTES from '@src/ROUTES';
2121
import type {Policy} from '@src/types/onyx';
2222
import type {PendingAction} from '@src/types/onyx/OnyxCommon';
23+
import {isEmptyObject} from '@src/types/utils/EmptyObject';
2324

2425
type IndividualExpenseRulesSectionProps = {
2526
policyID: string;
@@ -175,7 +176,7 @@ function IndividualExpenseRulesSection({policyID}: IndividualExpenseRulesSection
175176
title: prohibitedExpenses,
176177
descriptionTranslationKey: 'workspace.rules.individualExpenseRules.prohibitedExpenses',
177178
action: () => Navigation.navigate(ROUTES.RULES_PROHIBITED_DEFAULT.getRoute(policyID)),
178-
pendingAction: policy?.pendingFields?.prohibitedExpenses,
179+
pendingAction: !isEmptyObject(policy?.prohibitedExpenses?.pendingFields) ? CONST.RED_BRICK_ROAD_PENDING_ACTION.UPDATE : undefined,
179180
});
180181

181182
const areEReceiptsEnabled = policy?.eReceipts ?? false;

src/pages/workspace/rules/RulesProhibitedDefaultPage.tsx

Lines changed: 19 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import React from 'react';
22
import {View} from 'react-native';
33
import HeaderWithBackButton from '@components/HeaderWithBackButton';
4+
import OfflineWithFeedback from '@components/OfflineWithFeedback';
45
import ScreenWrapper from '@components/ScreenWrapper';
56
import ScrollView from '@components/ScrollView';
67
import Switch from '@components/Switch';
@@ -12,10 +13,9 @@ import Navigation from '@libs/Navigation/Navigation';
1213
import type {PlatformStackScreenProps} from '@libs/Navigation/PlatformStackNavigation/types';
1314
import type {SettingsNavigatorParamList} from '@libs/Navigation/types';
1415
import AccessOrNotFoundWrapper from '@pages/workspace/AccessOrNotFoundWrapper';
15-
import {setPolicyProhibitedExpenses} from '@userActions/Policy/Policy';
16+
import {setPolicyProhibitedExpense} from '@userActions/Policy/Policy';
1617
import CONST from '@src/CONST';
1718
import type SCREENS from '@src/SCREENS';
18-
import type {ProhibitedExpenses} from '@src/types/onyx/Policy';
1919

2020
type ProhibitedExpensesProps = PlatformStackScreenProps<SettingsNavigatorParamList, typeof SCREENS.WORKSPACE.RULES_PROHIBITED_DEFAULT>;
2121

@@ -49,76 +49,23 @@ function RulesProhibitedDefaultPage({
4949
<Text style={[styles.textNormal, styles.colorMuted]}>{translate('workspace.rules.individualExpenseRules.prohibitedDefaultDescription')}</Text>
5050
</Text>
5151

52-
<View style={[styles.flexRow, styles.alignItemsCenter, styles.justifyContentBetween, styles.mt3, styles.mh5, styles.mb5]}>
53-
<Text>{translate('workspace.rules.individualExpenseRules.adultEntertainment')}</Text>
54-
<Switch
55-
isOn={policy?.prohibitedExpenses?.adultEntertainment ?? false}
56-
accessibilityLabel={translate('workspace.rules.individualExpenseRules.adultEntertainment')}
57-
onToggle={() => {
58-
const prohibitedExpenses: ProhibitedExpenses = {
59-
...policy?.prohibitedExpenses,
60-
adultEntertainment: !policy?.prohibitedExpenses?.adultEntertainment,
61-
};
62-
setPolicyProhibitedExpenses(policyID, prohibitedExpenses);
63-
}}
64-
/>
65-
</View>
66-
<View style={[styles.flexRow, styles.alignItemsCenter, styles.justifyContentBetween, styles.mt3, styles.mh5, styles.mb5]}>
67-
<Text>{translate('workspace.rules.individualExpenseRules.alcohol')}</Text>
68-
<Switch
69-
isOn={policy?.prohibitedExpenses?.alcohol ?? false}
70-
accessibilityLabel={translate('workspace.rules.individualExpenseRules.alcohol')}
71-
onToggle={() => {
72-
const prohibitedExpenses: ProhibitedExpenses = {
73-
...policy?.prohibitedExpenses,
74-
alcohol: !policy?.prohibitedExpenses?.alcohol,
75-
};
76-
setPolicyProhibitedExpenses(policyID, prohibitedExpenses);
77-
}}
78-
/>
79-
</View>
80-
<View style={[styles.flexRow, styles.alignItemsCenter, styles.justifyContentBetween, styles.mt3, styles.mh5, styles.mb5]}>
81-
<Text>{translate('workspace.rules.individualExpenseRules.gambling')}</Text>
82-
<Switch
83-
isOn={policy?.prohibitedExpenses?.gambling ?? false}
84-
accessibilityLabel={translate('workspace.rules.individualExpenseRules.gambling')}
85-
onToggle={() => {
86-
const prohibitedExpenses: ProhibitedExpenses = {
87-
...policy?.prohibitedExpenses,
88-
gambling: !policy?.prohibitedExpenses?.gambling,
89-
};
90-
setPolicyProhibitedExpenses(policyID, prohibitedExpenses);
91-
}}
92-
/>
93-
</View>
94-
<View style={[styles.flexRow, styles.alignItemsCenter, styles.justifyContentBetween, styles.mt3, styles.mh5, styles.mb5]}>
95-
<Text>{translate('workspace.rules.individualExpenseRules.hotelIncidentals')}</Text>
96-
<Switch
97-
isOn={policy?.prohibitedExpenses?.hotelIncidentals ?? false}
98-
accessibilityLabel={translate('workspace.rules.individualExpenseRules.hotelIncidentals')}
99-
onToggle={() => {
100-
const prohibitedExpenses: ProhibitedExpenses = {
101-
...policy?.prohibitedExpenses,
102-
hotelIncidentals: !policy?.prohibitedExpenses?.hotelIncidentals,
103-
};
104-
setPolicyProhibitedExpenses(policyID, prohibitedExpenses);
105-
}}
106-
/>
107-
</View>
108-
<View style={[styles.flexRow, styles.alignItemsCenter, styles.justifyContentBetween, styles.mt3, styles.mh5, styles.mb5]}>
109-
<Text>{translate('workspace.rules.individualExpenseRules.tobacco')}</Text>
110-
<Switch
111-
isOn={policy?.prohibitedExpenses?.tobacco ?? false}
112-
accessibilityLabel={translate('workspace.rules.individualExpenseRules.tobacco')}
113-
onToggle={() => {
114-
const prohibitedExpenses: ProhibitedExpenses = {
115-
...policy?.prohibitedExpenses,
116-
tobacco: !policy?.prohibitedExpenses?.tobacco,
117-
};
118-
setPolicyProhibitedExpenses(policyID, prohibitedExpenses);
119-
}}
120-
/>
121-
</View>
52+
{Object.values(CONST.POLICY.PROHIBITED_EXPENSES).map((prohibitedExpense) => (
53+
<OfflineWithFeedback
54+
pendingAction={policy?.prohibitedExpenses?.pendingFields?.[prohibitedExpense]}
55+
key={translate(`workspace.rules.individualExpenseRules.${prohibitedExpense}`)}
56+
>
57+
<View style={[styles.flexRow, styles.alignItemsCenter, styles.justifyContentBetween, styles.mt3, styles.mh5, styles.mb5]}>
58+
<Text>{translate(`workspace.rules.individualExpenseRules.${prohibitedExpense}`)}</Text>
59+
<Switch
60+
isOn={policy?.prohibitedExpenses?.[prohibitedExpense] ?? false}
61+
accessibilityLabel={translate(`workspace.rules.individualExpenseRules.${prohibitedExpense}`)}
62+
onToggle={() => {
63+
setPolicyProhibitedExpense(policyID, prohibitedExpense);
64+
}}
65+
/>
66+
</View>
67+
</OfflineWithFeedback>
68+
))}
12269
</ScrollView>
12370
</ScreenWrapper>
12471
</AccessOrNotFoundWrapper>

src/types/onyx/Policy.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1433,7 +1433,7 @@ type ACHAccount = {
14331433
};
14341434

14351435
/** Prohibited expense types */
1436-
type ProhibitedExpenses = {
1436+
type ProhibitedExpenses = OnyxCommon.OnyxValueWithOfflineFeedback<{
14371437
/** Whether the policy prohibits alcohol expenses */
14381438
alcohol?: boolean;
14391439

@@ -1448,7 +1448,7 @@ type ProhibitedExpenses = {
14481448

14491449
/** Whether the policy prohibits adult entertainment expenses */
14501450
adultEntertainment?: boolean;
1451-
};
1451+
}>;
14521452

14531453
/** Day of the month to schedule submission */
14541454
type AutoReportingOffset = number | ValueOf<typeof CONST.POLICY.AUTO_REPORTING_OFFSET>;

0 commit comments

Comments
 (0)