Skip to content

Commit d2ecc33

Browse files
authored
Merge pull request Expensify#78355 from aimane-chnaif/revert-76032-add-overlimitforwardsto-approval-workflow
Revert "Bring overLimitForwardsTo configuration into New Expensify"
2 parents 42ae60a + e8f1f87 commit d2ecc33

35 files changed

Lines changed: 170 additions & 1245 deletions

src/ROUTES.ts

Lines changed: 6 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1734,23 +1734,15 @@ const ROUTES = {
17341734
},
17351735
WORKSPACE_WORKFLOWS_APPROVALS_EXPENSES_FROM: {
17361736
route: 'workspaces/:policyID/workflows/approvals/expenses-from',
1737-
getRoute: (policyID: string) => `workspaces/${policyID}/workflows/approvals/expenses-from` as const,
1737+
1738+
// eslint-disable-next-line no-restricted-syntax -- Legacy route generation
1739+
getRoute: (policyID: string, backTo?: string) => getUrlWithBackToParam(`workspaces/${policyID}/workflows/approvals/expenses-from` as const, backTo),
17381740
},
17391741
WORKSPACE_WORKFLOWS_APPROVALS_APPROVER: {
17401742
route: 'workspaces/:policyID/workflows/approvals/approver',
1741-
getRoute: (policyID: string, approverIndex: number) => `workspaces/${policyID}/workflows/approvals/approver?approverIndex=${approverIndex}` as const,
1742-
},
1743-
WORKSPACE_WORKFLOWS_APPROVALS_APPROVER_CHANGE: {
1744-
route: 'workspaces/:policyID/workflows/approvals/approver-change',
1745-
getRoute: (policyID: string, approverIndex: number) => `workspaces/${policyID}/workflows/approvals/approver-change?approverIndex=${approverIndex}` as const,
1746-
},
1747-
WORKSPACE_WORKFLOWS_APPROVALS_APPROVAL_LIMIT: {
1748-
route: 'workspaces/:policyID/workflows/approvals/approval-limit',
1749-
getRoute: (policyID: string, approverIndex: number) => `workspaces/${policyID}/workflows/approvals/approval-limit?approverIndex=${approverIndex}` as const,
1750-
},
1751-
WORKSPACE_WORKFLOWS_APPROVALS_OVER_LIMIT_APPROVER: {
1752-
route: 'workspaces/:policyID/workflows/approvals/over-limit-approver',
1753-
getRoute: (policyID: string, approverIndex: number) => `workspaces/${policyID}/workflows/approvals/over-limit-approver?approverIndex=${approverIndex}` as const,
1743+
getRoute: (policyID: string, approverIndex: number, backTo?: string) =>
1744+
// eslint-disable-next-line no-restricted-syntax -- Legacy route generation
1745+
getUrlWithBackToParam(`workspaces/${policyID}/workflows/approvals/approver?approverIndex=${approverIndex}` as const, backTo),
17541746
},
17551747
WORKSPACE_WORKFLOWS_PAYER: {
17561748
route: 'workspaces/:policyID/workflows/payer',

src/SCREENS.ts

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -666,9 +666,6 @@ const SCREENS = {
666666
WORKFLOWS_APPROVALS_EDIT: 'Workspace_Approvals_Edit',
667667
WORKFLOWS_APPROVALS_EXPENSES_FROM: 'Workspace_Workflows_Approvals_Expenses_From',
668668
WORKFLOWS_APPROVALS_APPROVER: 'Workspace_Workflows_Approvals_Approver',
669-
WORKFLOWS_APPROVALS_APPROVER_CHANGE: 'Workspace_Workflows_Approvals_Approver_Change',
670-
WORKFLOWS_APPROVALS_APPROVAL_LIMIT: 'Workspace_Workflows_Approvals_Approval_Limit',
671-
WORKFLOWS_APPROVALS_OVER_LIMIT_APPROVER: 'Workspace_Workflows_Approvals_Over_Limit_Approver',
672669
WORKFLOWS_AUTO_REPORTING_FREQUENCY: 'Workspace_Workflows_Auto_Reporting_Frequency',
673670
WORKFLOWS_AUTO_REPORTING_MONTHLY_OFFSET: 'Workspace_Workflows_Auto_Reporting_Monthly_Offset',
674671
WORKFLOWS_CONNECT_EXISTING_BANK_ACCOUNT: 'Workspace_Workflows_Connect_Existing_Bank_Account',

src/components/AmountForm.tsx

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -43,14 +43,8 @@ type AmountFormProps = {
4343
/** Whether to hide the currency symbol */
4444
hideCurrencySymbol?: boolean;
4545

46-
/** Whether the input should be disabled */
47-
disabled?: boolean;
48-
4946
/** Reference to the outer element */
5047
ref?: ForwardedRef<BaseTextInputRef>;
51-
52-
/** Callback when the user presses the submit key (Enter) */
53-
onSubmitEditing?: () => void;
5448
} & Pick<BaseTextInputProps, 'autoFocus' | 'autoGrowExtraSpace' | 'autoGrowMarginSide'>;
5549

5650
/**
@@ -68,11 +62,9 @@ function AmountForm({
6862
label,
6963
decimals: decimalsProp,
7064
hideCurrencySymbol = false,
71-
disabled = false,
7265
autoFocus,
7366
autoGrowExtraSpace,
7467
autoGrowMarginSide,
75-
onSubmitEditing,
7668
ref,
7769
}: AmountFormProps) {
7870
const styles = useThemeStyles();
@@ -107,8 +99,6 @@ function AmountForm({
10799
autoFocus={autoFocus}
108100
autoGrowExtraSpace={autoGrowExtraSpace}
109101
autoGrowMarginSide={autoGrowMarginSide}
110-
onSubmitEditing={onSubmitEditing}
111-
disabled={disabled}
112102
/>
113103
);
114104
}

src/components/ApprovalWorkflowSection.tsx

Lines changed: 16 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,12 @@
11
import {Str} from 'expensify-common';
2-
import React from 'react';
2+
import React, {useCallback, useMemo} from 'react';
33
import {View} from 'react-native';
44
import {useMemoizedLazyExpensifyIcons} from '@hooks/useLazyAsset';
55
import useLocalize from '@hooks/useLocalize';
6-
import useOnyx from '@hooks/useOnyx';
76
import useResponsiveLayout from '@hooks/useResponsiveLayout';
87
import useTheme from '@hooks/useTheme';
98
import useThemeStyles from '@hooks/useThemeStyles';
109
import {sortAlphabetically} from '@libs/OptionsListUtils';
11-
import {getApprovalLimitDescription} from '@libs/WorkflowUtils';
12-
import CONST from '@src/CONST';
13-
import ONYXKEYS from '@src/ONYXKEYS';
14-
import {personalDetailsByEmailSelector} from '@src/selectors/PersonalDetails';
1510
import type ApprovalWorkflow from '@src/types/onyx/ApprovalWorkflow';
1611
import Icon from './Icon';
1712
import MenuItem from './MenuItem';
@@ -24,30 +19,30 @@ type ApprovalWorkflowSectionProps = {
2419

2520
/** A function that is called when the section is pressed */
2621
onPress: () => void;
27-
28-
/** Currency used for formatting approval limits */
29-
currency?: string;
3022
};
3123

32-
function ApprovalWorkflowSection({approvalWorkflow, onPress, currency = CONST.CURRENCY.USD}: ApprovalWorkflowSectionProps) {
24+
function ApprovalWorkflowSection({approvalWorkflow, onPress}: ApprovalWorkflowSectionProps) {
3325
const icons = useMemoizedLazyExpensifyIcons(['ArrowRight', 'Lightbulb', 'Users', 'UserCheck']);
3426
const styles = useThemeStyles();
3527
const theme = useTheme();
3628
const {translate, toLocaleOrdinal, localeCompare} = useLocalize();
3729
const {shouldUseNarrowLayout} = useResponsiveLayout();
38-
const [personalDetailsByEmail] = useOnyx(ONYXKEYS.PERSONAL_DETAILS_LIST, {
39-
canBeMissing: true,
40-
selector: personalDetailsByEmailSelector,
41-
});
4230

43-
const approverTitle = (index: number) =>
44-
approvalWorkflow.approvers.length > 1 ? `${toLocaleOrdinal(index + 1, true)} ${translate('workflowsPage.approver').toLowerCase()}` : `${translate('workflowsPage.approver')}`;
31+
const approverTitle = useCallback(
32+
(index: number) =>
33+
approvalWorkflow.approvers.length > 1 ? `${toLocaleOrdinal(index + 1, true)} ${translate('workflowsPage.approver').toLowerCase()}` : `${translate('workflowsPage.approver')}`,
34+
[approvalWorkflow.approvers.length, toLocaleOrdinal, translate],
35+
);
36+
37+
const members = useMemo(() => {
38+
if (approvalWorkflow.isDefault) {
39+
return translate('workspace.common.everyone');
40+
}
4541

46-
const members = approvalWorkflow.isDefault
47-
? translate('workspace.common.everyone')
48-
: sortAlphabetically(approvalWorkflow.members, 'displayName', localeCompare)
49-
.map((m) => Str.removeSMSDomain(m.displayName))
50-
.join(', ');
42+
return sortAlphabetically(approvalWorkflow.members, 'displayName', localeCompare)
43+
.map((m) => Str.removeSMSDomain(m.displayName))
44+
.join(', ');
45+
}, [approvalWorkflow.isDefault, approvalWorkflow.members, translate, localeCompare]);
5146

5247
return (
5348
<PressableWithoutFeedback
@@ -105,8 +100,6 @@ function ApprovalWorkflowSection({approvalWorkflow, onPress, currency = CONST.CU
105100
iconFill={theme.icon}
106101
onPress={onPress}
107102
shouldRemoveBackground
108-
helperText={getApprovalLimitDescription({approver, currency, translate, personalDetailsByEmail})}
109-
helperTextStyle={styles.workflowApprovalLimitText}
110103
/>
111104
</View>
112105
))}

src/components/Icon/chunks/expensify-icons.chunk.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -169,7 +169,6 @@ import Phone from '@assets/images/phone.svg';
169169
import Pin from '@assets/images/pin.svg';
170170
import Plane from '@assets/images/plane.svg';
171171
import Play from '@assets/images/play.svg';
172-
import PlusMinus from '@assets/images/plus-minus.svg';
173172
import Plus from '@assets/images/plus.svg';
174173
import Printer from '@assets/images/printer.svg';
175174
import Profile from '@assets/images/profile.svg';
@@ -372,7 +371,6 @@ const Expensicons = {
372371
Pin,
373372
Play,
374373
Plus,
375-
PlusMinus,
376374
Printer,
377375
Profile,
378376
QBOSquare,

src/components/NumberWithSymbolForm.tsx

Lines changed: 59 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,8 @@
11
import {useIsFocused} from '@react-navigation/native';
22
import type {ForwardedRef} from 'react';
3-
import React, {useEffect, useImperativeHandle, useRef, useState} from 'react';
3+
import React, {useCallback, useEffect, useImperativeHandle, useRef, useState} from 'react';
44
import type {NativeSyntheticEvent} from 'react-native';
55
import {View} from 'react-native';
6-
import {useMemoizedLazyExpensifyIcons} from '@hooks/useLazyAsset';
76
import useLocalize from '@hooks/useLocalize';
87
import {useMouseContext} from '@hooks/useMouseContext';
98
import usePrevious from '@hooks/usePrevious';
@@ -26,6 +25,7 @@ import CONST from '@src/CONST';
2625
import BigNumberPad from './BigNumberPad';
2726
import Button from './Button';
2827
import FormHelpMessage from './FormHelpMessage';
28+
import * as Expensicons from './Icon/Expensicons';
2929
import ScrollView from './ScrollView';
3030
import TextInput from './TextInput';
3131
import isTextInputFocused from './TextInput/BaseTextInput/isTextInputFocused';
@@ -84,9 +84,6 @@ type NumberWithSymbolFormProps = {
8484

8585
/** Reference to the outer element */
8686
ref?: ForwardedRef<BaseTextInputRef>;
87-
88-
/** Callback when the user presses the submit key (Enter) */
89-
onSubmitEditing?: () => void;
9087
} & Omit<TextInputWithSymbolProps, 'formattedAmount' | 'onAmountChange' | 'placeholder' | 'onSelectionChange' | 'onKeyPress' | 'onMouseDown' | 'onMouseUp'>;
9188

9289
type NumberWithSymbolFormRef = {
@@ -148,29 +145,15 @@ function NumberWithSymbolForm({
148145
clearNegative,
149146
ref,
150147
disabled,
151-
onSubmitEditing,
152148
...props
153149
}: NumberWithSymbolFormProps) {
154150
const styles = useThemeStyles();
155151
const {toLocaleDigit, numberFormat, translate} = useLocalize();
156-
const icons = useMemoizedLazyExpensifyIcons(['DownArrow', 'PlusMinus'] as const);
157152

158153
const textInput = useRef<BaseTextInputRef | null>(null);
159154
const numberRef = useRef<string | undefined>(undefined);
160155
const [currentNumber, setCurrentNumber] = useState(typeof number === 'string' ? number : '');
161156

162-
// sync currentNumber with number prop when it changes externally
163-
useEffect(() => {
164-
const newNumber = typeof number === 'string' ? number : '';
165-
166-
if (newNumber === currentNumber || (newNumber && currentNumber && Number(newNumber) === Number(currentNumber))) {
167-
return;
168-
}
169-
170-
setCurrentNumber(newNumber);
171-
// eslint-disable-next-line react-compiler/react-compiler, react-hooks/exhaustive-deps
172-
}, [number]);
173-
174157
const [shouldUpdateSelection, setShouldUpdateSelection] = useState(true);
175158

176159
const isFocused = useIsFocused();
@@ -195,9 +178,9 @@ function NumberWithSymbolForm({
195178
setMouseUp();
196179
};
197180

198-
const clearSelection = () => {
181+
const clearSelection = useCallback(() => {
199182
setSelection({start: selection.end, end: selection.end});
200-
};
183+
}, [selection.end]);
201184

202185
/**
203186
* Event occurs when a user presses a mouse button over an DOM element.
@@ -223,36 +206,39 @@ function NumberWithSymbolForm({
223206
* Sets the selection and the number accordingly to the number passed to the input
224207
* @param newNumber - Changed number from user input
225208
*/
226-
const setNewNumber = (newNumber: string) => {
227-
// Remove spaces from the newNumber number because Safari on iOS adds spaces when pasting a copied number
228-
// More info: https://github.com/Expensify/App/issues/16974
229-
const newNumberWithoutSpaces = stripSpacesFromAmount(newNumber);
230-
const rawFinalNumber = newNumberWithoutSpaces.includes('.') ? stripCommaFromAmount(newNumberWithoutSpaces) : replaceCommasWithPeriod(newNumberWithoutSpaces);
231-
232-
const finalNumber = handleNegativeAmountFlipping(rawFinalNumber, allowFlippingAmount, toggleNegative);
233-
234-
// Use a shallow copy of selection to trigger setSelection
235-
// More info: https://github.com/Expensify/App/issues/16385
236-
if (!validateAmount(finalNumber, decimals, maxLength)) {
237-
setSelection((prevSelection) => ({...prevSelection}));
238-
return;
239-
}
240-
241-
willSelectionBeUpdatedManually.current = true;
242-
let hasSelectionBeenSet = false;
243-
const strippedNumber = stripCommaFromAmount(finalNumber);
244-
numberRef.current = strippedNumber;
245-
setCurrentNumber((prevNumber) => {
246-
const isForwardDelete = prevNumber.length > strippedNumber.length && forwardDeletePressedRef.current;
247-
if (!hasSelectionBeenSet) {
248-
hasSelectionBeenSet = true;
249-
setSelection((prevSelection) => getNewSelection(prevSelection, isForwardDelete ? strippedNumber.length : prevNumber.length, strippedNumber.length));
250-
willSelectionBeUpdatedManually.current = false;
209+
const setNewNumber = useCallback(
210+
(newNumber: string) => {
211+
// Remove spaces from the newNumber number because Safari on iOS adds spaces when pasting a copied number
212+
// More info: https://github.com/Expensify/App/issues/16974
213+
const newNumberWithoutSpaces = stripSpacesFromAmount(newNumber);
214+
const rawFinalNumber = newNumberWithoutSpaces.includes('.') ? stripCommaFromAmount(newNumberWithoutSpaces) : replaceCommasWithPeriod(newNumberWithoutSpaces);
215+
216+
const finalNumber = handleNegativeAmountFlipping(rawFinalNumber, allowFlippingAmount, toggleNegative);
217+
218+
// Use a shallow copy of selection to trigger setSelection
219+
// More info: https://github.com/Expensify/App/issues/16385
220+
if (!validateAmount(finalNumber, decimals, maxLength)) {
221+
setSelection((prevSelection) => ({...prevSelection}));
222+
return;
251223
}
252-
return strippedNumber;
253-
});
254-
onInputChange?.(strippedNumber);
255-
};
224+
225+
willSelectionBeUpdatedManually.current = true;
226+
let hasSelectionBeenSet = false;
227+
const strippedNumber = stripCommaFromAmount(finalNumber);
228+
numberRef.current = strippedNumber;
229+
setCurrentNumber((prevNumber) => {
230+
const isForwardDelete = prevNumber.length > strippedNumber.length && forwardDeletePressedRef.current;
231+
if (!hasSelectionBeenSet) {
232+
hasSelectionBeenSet = true;
233+
setSelection((prevSelection) => getNewSelection(prevSelection, isForwardDelete ? strippedNumber.length : prevNumber.length, strippedNumber.length));
234+
willSelectionBeUpdatedManually.current = false;
235+
}
236+
return strippedNumber;
237+
});
238+
onInputChange?.(strippedNumber);
239+
},
240+
[decimals, maxLength, onInputChange, allowFlippingAmount, toggleNegative],
241+
);
256242

257243
/**
258244
* Set a new number number properly formatted, used for the TextInput
@@ -304,34 +290,37 @@ function NumberWithSymbolForm({
304290
* Update number with number or Backspace pressed for BigNumberPad.
305291
* Validate new number with decimal number regex up to 6 digits and 2 decimal digit to enable Next button
306292
*/
307-
const updateValueNumberPad = (key: string) => {
308-
if (shouldUpdateSelection && !isTextInputFocused(textInput)) {
309-
textInput.current?.focus();
310-
}
311-
// Backspace button is pressed
312-
if (key === '<' || key === 'Backspace') {
313-
if (currentNumber.length > 0) {
314-
const selectionStart = selection.start === selection.end ? selection.start - 1 : selection.start;
315-
const newNumber = `${currentNumber.substring(0, selectionStart)}${currentNumber.substring(selection.end)}`;
316-
setNewNumber(addLeadingZero(newNumber));
293+
const updateValueNumberPad = useCallback(
294+
(key: string) => {
295+
if (shouldUpdateSelection && !isTextInputFocused(textInput)) {
296+
textInput.current?.focus();
317297
}
318-
return;
319-
}
320-
const newNumber = addLeadingZero(`${currentNumber.substring(0, selection.start)}${key}${currentNumber.substring(selection.end)}`);
321-
setNewNumber(newNumber);
322-
};
298+
// Backspace button is pressed
299+
if (key === '<' || key === 'Backspace') {
300+
if (currentNumber.length > 0) {
301+
const selectionStart = selection.start === selection.end ? selection.start - 1 : selection.start;
302+
const newNumber = `${currentNumber.substring(0, selectionStart)}${currentNumber.substring(selection.end)}`;
303+
setNewNumber(addLeadingZero(newNumber));
304+
}
305+
return;
306+
}
307+
const newNumber = addLeadingZero(`${currentNumber.substring(0, selection.start)}${key}${currentNumber.substring(selection.end)}`);
308+
setNewNumber(newNumber);
309+
},
310+
[currentNumber, selection.start, selection.end, shouldUpdateSelection, setNewNumber],
311+
);
323312

324313
/**
325314
* Update long press number, to remove items pressing on <
326315
*
327316
* @param value - Changed text from user input
328317
*/
329-
const updateLongPressHandlerState = (value: boolean) => {
318+
const updateLongPressHandlerState = useCallback((value: boolean) => {
330319
setShouldUpdateSelection(!value);
331320
if (!value && !isTextInputFocused(textInput)) {
332321
textInput.current?.focus();
333322
}
334-
};
323+
}, []);
335324

336325
/**
337326
* Input handler to check for a forward-delete key (or keyboard shortcut) press.
@@ -397,7 +386,6 @@ function NumberWithSymbolForm({
397386
autoFocus={props.autoFocus}
398387
autoGrowExtraSpace={props.autoGrowExtraSpace}
399388
autoGrowMarginSide={props.autoGrowMarginSide}
400-
onSubmitEditing={onSubmitEditing}
401389
/>
402390
);
403391
}
@@ -484,7 +472,7 @@ function NumberWithSymbolForm({
484472
<Button
485473
shouldShowRightIcon
486474
small
487-
iconRight={icons.DownArrow}
475+
iconRight={Expensicons.DownArrow}
488476
onPress={onSymbolButtonPress}
489477
style={styles.minWidth18}
490478
isContentCentered
@@ -509,7 +497,7 @@ function NumberWithSymbolForm({
509497
<Button
510498
shouldShowRightIcon
511499
small
512-
iconRight={icons.DownArrow}
500+
iconRight={Expensicons.DownArrow}
513501
onPress={onSymbolButtonPress}
514502
style={styles.minWidth18}
515503
isContentCentered
@@ -520,7 +508,7 @@ function NumberWithSymbolForm({
520508
<Button
521509
shouldShowRightIcon
522510
small
523-
iconRight={icons.PlusMinus}
511+
iconRight={Expensicons.PlusMinus}
524512
onPress={toggleNegative}
525513
style={styles.minWidth18}
526514
isContentCentered

0 commit comments

Comments
 (0)