Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 0 additions & 3 deletions src/CONST/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -777,7 +777,6 @@ const CONST = {
UBER_FOR_BUSINESS: 'uberForBusiness',
NEW_DOT_DEW: 'newDotDEW',
ODOMETER_EXPENSES: 'odometerExpenses',
SINGLE_USE_AND_EXPIRE_BY_CARDS: 'singleUseAndExpireByCards',
PAY_INVOICE_VIA_EXPENSIFY: 'payInvoiceViaExpensify',
PERSONAL_CARD_IMPORT: 'personalCardImport',
SUGGESTED_FOLLOWUPS: 'suggestedFollowups',
Expand Down Expand Up @@ -3807,8 +3806,6 @@ const CONST = {
LIMIT_VALUE: 21474836,
STEP_NAMES: ['1', '2', '3', '4', '5'],
ASSIGNEE_EXCLUDED_STEP_NAMES: ['1', '2', '3', '4'],
SINGLE_USE_DISABLED_STEP_NAMES: ['1', '2', '3', '4'],
SINGLE_USE_AND_ASSIGNEE_EXCLUDED_STEP_NAMES: ['1', '2', '3'],
STEP: {
ASSIGNEE: 'Assignee',
CARD_TYPE: 'CardType',
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -199,7 +199,7 @@
});
}

if (card?.nameValuePairs?.isVirtual && isBetaEnabled(CONST.BETAS.SINGLE_USE_AND_EXPIRE_BY_CARDS)) {
if (card?.nameValuePairs?.isVirtual) {
options.push({
value: CONST.EXPENSIFY_CARD.LIMIT_TYPES.SINGLE_USE,
label: translate('workspace.card.issueNewCard.singleUse'),
Expand All @@ -209,7 +209,7 @@
});
}
return options;
}, [areApprovalsConfigured, translate, typeSelected, shouldShowFixedOption, card?.nameValuePairs?.isVirtual, isBetaEnabled]);

Check warning on line 212 in src/pages/workspace/expensifyCard/WorkspaceEditCardLimitTypePage.tsx

View workflow job for this annotation

GitHub Actions / Changed files ESLint check

React Hook useMemo has an unnecessary dependency: 'isBetaEnabled'. Either exclude it or remove the dependency array

const validate = (values: FormOnyxValues<typeof ONYXKEYS.FORMS.EDIT_EXPENSIFY_CARD_LIMIT_TYPE_FORM>) => {
if (!expirationToggle) {
Expand Down Expand Up @@ -278,7 +278,7 @@
alternateNumberOfSupportedLines={2}
/>

{!!card?.nameValuePairs?.isVirtual && isBetaEnabled(CONST.BETAS.SINGLE_USE_AND_EXPIRE_BY_CARDS) && (
{!!card?.nameValuePairs?.isVirtual && (
<>
<View style={[styles.threadDividerLine, styles.flexGrow0, styles.ml5, styles.mr5, styles.mv3]} />
<View style={[styles.ph5]}>
Expand Down
6 changes: 2 additions & 4 deletions src/pages/workspace/expensifyCard/issueNew/CardNameStep.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@ import TextInput from '@components/TextInput';
import useAutoFocusInput from '@hooks/useAutoFocusInput';
import useLocalize from '@hooks/useLocalize';
import useOnyx from '@hooks/useOnyx';
import usePermissions from '@hooks/usePermissions';
import useThemeStyles from '@hooks/useThemeStyles';
import {getDefaultCardName} from '@libs/CardUtils';
import {addErrorMessage} from '@libs/ErrorUtils';
Expand Down Expand Up @@ -36,7 +35,6 @@ function CardNameStep({policyID, stepNames, startStepIndex}: CardNameStepProps)
const styles = useThemeStyles();
const {inputCallbackRef} = useAutoFocusInput();
const [issueNewCard] = useOnyx(`${ONYXKEYS.COLLECTION.ISSUE_NEW_EXPENSIFY_CARD}${policyID}`);
const {isBetaEnabled} = usePermissions();

const isEditing = issueNewCard?.isEditing;
const data = issueNewCard?.data;
Expand Down Expand Up @@ -79,11 +77,11 @@ function CardNameStep({policyID, stepNames, startStepIndex}: CardNameStepProps)
return;
}
setIssueNewCardStepAndData({
step: isBetaEnabled(CONST.BETAS.SINGLE_USE_AND_EXPIRE_BY_CARDS) && isVirtualCard ? CONST.EXPENSIFY_CARD.STEP.EXPIRY_OPTIONS : CONST.EXPENSIFY_CARD.STEP.LIMIT_TYPE,
step: isVirtualCard ? CONST.EXPENSIFY_CARD.STEP.EXPIRY_OPTIONS : CONST.EXPENSIFY_CARD.STEP.LIMIT_TYPE,
policyID,
});
});
}, [isEditing, isBetaEnabled, isVirtualCard, policyID]);
}, [isEditing, isVirtualCard, policyID]);

return (
<InteractiveStepWrapper
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -121,11 +121,10 @@ function ConfirmationStep({policyID, stepNames, startStepIndex, backTo}: Confirm
const isPhysicalCard = data?.cardType === CONST.EXPENSIFY_CARD.CARD_TYPE.PHYSICAL;
const cardReadyTranslationKey = isPhysicalCard ? 'workspace.card.issueNewCard.willBeReadyToShip' : 'workspace.card.issueNewCard.willBeReadyToUse';

const isSingleUseEnabled = isBetaEnabled(CONST.BETAS.SINGLE_USE_AND_EXPIRE_BY_CARDS);
const expirationDateTitle =
data?.validFrom && data?.validThru ? translate('workspace.card.issueNewCard.validFromToWithoutText', {startDate: data?.validFrom, endDate: data?.validThru}) : '';

const shouldShowExpirationDate = isSingleUseEnabled && !isPhysicalCard;
const shouldShowExpirationDate = !isPhysicalCard;

return (
<InteractiveStepWrapper
Expand Down
17 changes: 7 additions & 10 deletions src/pages/workspace/expensifyCard/issueNew/IssueNewCardPage.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@ import {useDelegateNoAccessState} from '@components/DelegateNoAccessModalProvide
import DelegateNoAccessWrapper from '@components/DelegateNoAccessWrapper';
import ScreenWrapper from '@components/ScreenWrapper';
import useOnyx from '@hooks/useOnyx';
import usePermissions from '@hooks/usePermissions';
import {startIssueNewCardFlow} from '@libs/actions/Card';
import Navigation from '@libs/Navigation/Navigation';
import type {PlatformStackScreenProps} from '@libs/Navigation/PlatformStackNavigation/types';
Expand All @@ -26,7 +25,7 @@ import SetExpiryOptionsStep from './SetExpiryOptionsStep';

type IssueNewCardPageProps = WithPolicyAndFullscreenLoadingProps & PlatformStackScreenProps<SettingsNavigatorParamList, typeof SCREENS.WORKSPACE.EXPENSIFY_CARD_ISSUE_NEW>;

function getStartStepIndex(issueNewCard: OnyxEntry<IssueNewCard>, isSingleUseEnabled: boolean): number {
function getStartStepIndex(issueNewCard: OnyxEntry<IssueNewCard>): number {
if (!issueNewCard) {
return 0;
}
Expand All @@ -37,8 +36,8 @@ function getStartStepIndex(issueNewCard: OnyxEntry<IssueNewCard>, isSingleUseEna
[CONST.EXPENSIFY_CARD.STEP.CARD_TYPE]: 1,
[CONST.EXPENSIFY_CARD.STEP.LIMIT_TYPE]: 2,
[CONST.EXPENSIFY_CARD.STEP.EXPIRY_OPTIONS]: 3,
[CONST.EXPENSIFY_CARD.STEP.CARD_NAME]: isSingleUseEnabled ? 4 : 3,
[CONST.EXPENSIFY_CARD.STEP.CONFIRMATION]: isSingleUseEnabled ? 5 : 4,
[CONST.EXPENSIFY_CARD.STEP.CARD_NAME]: 4,
[CONST.EXPENSIFY_CARD.STEP.CONFIRMATION]: 5,
};

const stepIndex = STEP_INDEXES[issueNewCard.currentStep];
Expand All @@ -51,16 +50,14 @@ function IssueNewCardPage({policy, route}: IssueNewCardPageProps) {
const {currentStep} = issueNewCard ?? {};
const backTo = route?.params?.backTo;
const {isDelegateAccessRestricted} = useDelegateNoAccessState();
const {isBetaEnabled} = usePermissions();
const isSingleUseEnabled = isBetaEnabled(CONST.BETAS.SINGLE_USE_AND_EXPIRE_BY_CARDS);

const stepNames = useMemo(() => {
if (issueNewCard?.isChangeAssigneeDisabled) {
return isSingleUseEnabled ? CONST.EXPENSIFY_CARD.ASSIGNEE_EXCLUDED_STEP_NAMES : CONST.EXPENSIFY_CARD.SINGLE_USE_AND_ASSIGNEE_EXCLUDED_STEP_NAMES;
return CONST.EXPENSIFY_CARD.ASSIGNEE_EXCLUDED_STEP_NAMES;
}
return isSingleUseEnabled ? CONST.EXPENSIFY_CARD.STEP_NAMES : CONST.EXPENSIFY_CARD.SINGLE_USE_DISABLED_STEP_NAMES;
}, [issueNewCard?.isChangeAssigneeDisabled, isSingleUseEnabled]);
const startStepIndex = useMemo(() => getStartStepIndex(issueNewCard, isSingleUseEnabled), [issueNewCard, isSingleUseEnabled]);
return CONST.EXPENSIFY_CARD.STEP_NAMES;
Comment on lines 54 to +58

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Restore the 4-step indicator for physical-card flows

stepNames is now always built with the expiry step, but LimitTypeStep still routes physical cards directly to CARD_NAME instead of EXPIRY_OPTIONS. Because getStartStepIndex() in this file also assumes EXPIRY_OPTIONS exists, the progress header for physical-card issuance flows jumps from limit type to the last step (or shows all steps complete on confirmation), which is a visible regression for every physical-card path.

Useful? React with 👍 / 👎.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It's expected, not a bug.

}, [issueNewCard?.isChangeAssigneeDisabled]);
const startStepIndex = useMemo(() => getStartStepIndex(issueNewCard), [issueNewCard]);

useEffect(() => {
startIssueNewCardFlow(policyID);
Expand Down
10 changes: 4 additions & 6 deletions src/pages/workspace/expensifyCard/issueNew/LimitTypeStep.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@ import Text from '@components/Text';
import ValuePicker from '@components/ValuePicker';
import useLocalize from '@hooks/useLocalize';
import useOnyx from '@hooks/useOnyx';
import usePermissions from '@hooks/usePermissions';
import useThemeStyles from '@hooks/useThemeStyles';
import {setIssueNewCardStepAndData} from '@libs/actions/Card';
import {getDefaultExpensifyCardLimitType} from '@libs/CardUtils';
Expand Down Expand Up @@ -40,7 +39,6 @@ function LimitTypeStep({policy, stepNames, startStepIndex}: LimitTypeStepProps)
const styles = useThemeStyles();
const policyID = policy?.id;
const [issueNewCard] = useOnyx(`${ONYXKEYS.COLLECTION.ISSUE_NEW_EXPENSIFY_CARD}${policyID}`);
const {isBetaEnabled} = usePermissions();
const formRef = useRef<FormRef | null>(null);

const areApprovalsConfigured = getApprovalWorkflow(policy) !== CONST.POLICY.APPROVAL_MODE.OPTIONAL;
Expand All @@ -53,11 +51,11 @@ function LimitTypeStep({policy, stepNames, startStepIndex}: LimitTypeStepProps)
if (isEditing) {
return CONST.EXPENSIFY_CARD.STEP.CONFIRMATION;
}
if (issueNewCard?.data?.cardType === CONST.EXPENSIFY_CARD.CARD_TYPE.VIRTUAL && isBetaEnabled(CONST.BETAS.SINGLE_USE_AND_EXPIRE_BY_CARDS)) {
if (issueNewCard?.data?.cardType === CONST.EXPENSIFY_CARD.CARD_TYPE.VIRTUAL) {
return CONST.EXPENSIFY_CARD.STEP.EXPIRY_OPTIONS;
}
return CONST.EXPENSIFY_CARD.STEP.CARD_NAME;
}, [isBetaEnabled, isEditing, issueNewCard?.data?.cardType]);
}, [isEditing, issueNewCard?.data?.cardType]);

const onInputFocus = useCallback(() => {
formRef.current?.scrollToEnd();
Expand Down Expand Up @@ -116,7 +114,7 @@ function LimitTypeStep({policy, stepNames, startStepIndex}: LimitTypeStepProps)
},
);

if (issueNewCard?.data?.cardType === CONST.EXPENSIFY_CARD.CARD_TYPE.VIRTUAL && isBetaEnabled(CONST.BETAS.SINGLE_USE_AND_EXPIRE_BY_CARDS)) {
if (issueNewCard?.data?.cardType === CONST.EXPENSIFY_CARD.CARD_TYPE.VIRTUAL) {
options.push({
value: CONST.EXPENSIFY_CARD.LIMIT_TYPES.SINGLE_USE,
label: translate('workspace.card.issueNewCard.singleUse'),
Expand All @@ -126,7 +124,7 @@ function LimitTypeStep({policy, stepNames, startStepIndex}: LimitTypeStepProps)
});
}
return options;
}, [areApprovalsConfigured, isBetaEnabled, issueNewCard?.data?.cardType, translate, typeSelected]);
}, [areApprovalsConfigured, issueNewCard?.data?.cardType, translate, typeSelected]);

const validate = useCallback(
(values: FormOnyxValues<typeof ONYXKEYS.FORMS.ISSUE_NEW_EXPENSIFY_CARD_FORM>): FormInputErrors<typeof ONYXKEYS.FORMS.ISSUE_NEW_EXPENSIFY_CARD_FORM> => {
Expand Down
Loading