Skip to content

Commit 0c95aa6

Browse files
authored
Merge pull request Expensify#83794 from ShridharGoel/freezeCard9
[NoQA] Implement frozen-by-admin info and ask-to-unfreeze functionality
2 parents d78cd9b + c224e07 commit 0c95aa6

15 files changed

Lines changed: 299 additions & 128 deletions

File tree

src/components/FrozenCardHeader.tsx

Lines changed: 51 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
1-
import {cardByIdSelector} from '@selectors/Card';
2-
import React, {useMemo} from 'react';
1+
import React from 'react';
32
import {View} from 'react-native';
43
import {useMemoizedLazyExpensifyIcons} from '@hooks/useLazyAsset';
54
import useLocalize from '@hooks/useLocalize';
@@ -9,41 +8,77 @@ import useTheme from '@hooks/useTheme';
98
import useThemeStyles from '@hooks/useThemeStyles';
109
import DateUtils from '@libs/DateUtils';
1110
import {getDisplayNameOrDefault} from '@libs/PersonalDetailsUtils';
11+
import Navigation from '@navigation/Navigation';
1212
import CONST from '@src/CONST';
1313
import ONYXKEYS from '@src/ONYXKEYS';
14+
import ROUTES from '@src/ROUTES';
1415
import Button from './Button';
1516
import Icon from './Icon';
1617
import Text from './Text';
18+
import TextLink from './TextLink';
1719

1820
type FrozenCardHeaderProps = {
19-
cardID: string;
2021
cardPreview: React.ReactNode;
2122
onUnfreezePress: () => void;
23+
onAskToUnfreezePress: () => void;
24+
canUnfreezeCard: boolean;
25+
isWorkspaceAdmin: boolean;
26+
frozenByAccountID?: number;
27+
frozenDate?: string;
2228
};
2329

24-
function FrozenCardHeader({cardID, cardPreview, onUnfreezePress}: FrozenCardHeaderProps) {
30+
function FrozenCardHeader({cardPreview, onUnfreezePress, onAskToUnfreezePress, canUnfreezeCard, isWorkspaceAdmin, frozenByAccountID, frozenDate}: FrozenCardHeaderProps) {
2531
const styles = useThemeStyles();
2632
const theme = useTheme();
2733
const {translate} = useLocalize();
2834
const {isOffline} = useNetwork();
2935
const icons = useMemoizedLazyExpensifyIcons(['FreezeCard'] as const);
3036
const [personalDetails] = useOnyx(ONYXKEYS.PERSONAL_DETAILS_LIST);
3137
const [session] = useOnyx(ONYXKEYS.SESSION);
32-
const [card] = useOnyx(ONYXKEYS.CARD_LIST, {selector: cardByIdSelector(cardID)});
33-
34-
const frozenByAccountID = card?.nameValuePairs?.frozen?.byAccountID;
35-
const frozenDate = card?.nameValuePairs?.frozen?.date;
3638
const isCurrentUser = frozenByAccountID === session?.accountID;
3739

3840
const frozenByName = frozenByAccountID ? getDisplayNameOrDefault(personalDetails?.[frozenByAccountID]) : '';
3941
const formattedDate = frozenDate ? DateUtils.formatWithUTCTimeZone(frozenDate, CONST.DATE.MONTH_DAY_YEAR_ABBR_FORMAT) : '';
42+
const adminFrozenTextPrefix = translate('cardPage.frozenByAdminPrefix', {date: formattedDate});
43+
const frozenNeedsUnfreezePrefix = translate('cardPage.frozenByAdminNeedsUnfreezePrefix');
44+
const frozenNeedsUnfreezeSuffix = translate('cardPage.frozenByAdminNeedsUnfreezeSuffix');
45+
46+
let statusText: React.ReactNode;
4047

41-
const statusText = useMemo(() => {
42-
if (isCurrentUser) {
43-
return translate('cardPage.youFroze', {date: formattedDate});
48+
if (isCurrentUser) {
49+
statusText = translate('cardPage.youFroze', {date: formattedDate});
50+
} else if (isWorkspaceAdmin) {
51+
if (!frozenByAccountID || !frozenByName) {
52+
statusText = `${adminFrozenTextPrefix}${translate('common.someone')}`;
53+
} else {
54+
statusText = (
55+
<>
56+
{adminFrozenTextPrefix}
57+
<TextLink
58+
onPress={() => Navigation.navigate(ROUTES.PROFILE.getRoute(Number(frozenByAccountID), Navigation.getActiveRoute()))}
59+
style={styles.link}
60+
>
61+
{frozenByName}
62+
</TextLink>
63+
</>
64+
);
4465
}
45-
return translate('cardPage.frozenBy', {date: formattedDate, person: frozenByName});
46-
}, [formattedDate, frozenByName, isCurrentUser, translate]);
66+
} else if (!frozenByAccountID || !frozenByName) {
67+
statusText = translate('cardPage.frozenByAdminNeedsUnfreeze', {person: frozenByName || translate('common.someone')});
68+
} else {
69+
statusText = (
70+
<>
71+
{frozenNeedsUnfreezePrefix}
72+
<TextLink
73+
onPress={() => Navigation.navigate(ROUTES.PROFILE.getRoute(Number(frozenByAccountID), Navigation.getActiveRoute()))}
74+
style={styles.link}
75+
>
76+
{frozenByName}
77+
</TextLink>
78+
{frozenNeedsUnfreezeSuffix}
79+
</>
80+
);
81+
}
4782

4883
return (
4984
<View style={[styles.ph5, styles.pb5]}>
@@ -58,9 +93,9 @@ function FrozenCardHeader({cardID, cardPreview, onUnfreezePress}: FrozenCardHead
5893
</View>
5994
<Button
6095
medium
61-
text={translate('cardPage.unfreeze')}
62-
onPress={onUnfreezePress}
63-
isDisabled={isOffline}
96+
text={translate(canUnfreezeCard ? 'cardPage.unfreeze' : 'cardPage.askToUnfreeze')}
97+
onPress={canUnfreezeCard ? onUnfreezePress : onAskToUnfreezePress}
98+
isDisabled={canUnfreezeCard && isOffline}
6499
style={[styles.mt4]}
65100
/>
66101
</View>

src/languages/de.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2367,12 +2367,17 @@ ${amount} für ${merchant} – ${date}`,
23672367
freezeCard: 'Karte sperren',
23682368
unfreeze: 'Entsperren',
23692369
unfreezeCard: 'Karte entsperren',
2370+
askToUnfreeze: 'Entsperrung anfragen',
23702371
freezeDescription: 'Eine gesperrte Karte kann nicht für Käufe und Transaktionen verwendet werden. Du kannst sie jederzeit entsperren.',
23712372
unfreezeDescription:
23722373
'Durch das Entsperren dieser Karte werden Käufe und Transaktionen wieder zugelassen. Fahre nur fort, wenn du sicher bist, dass die Karte sicher verwendet werden kann.',
23732374
frozen: 'Gesperrt',
23742375
youFroze: ({date}: {date: string}) => `Du hast diese Karte am ${date} gesperrt.`,
23752376
frozenBy: ({person, date}: {person: string; date: string}) => `${person} hat diese Karte am ${date} gesperrt.`,
2377+
frozenByAdminPrefix: ({date}: {date: string}) => `Diese Karte wurde am ${date} gesperrt von `,
2378+
frozenByAdminNeedsUnfreezePrefix: 'Diese Karte wurde von ',
2379+
frozenByAdminNeedsUnfreezeSuffix: ' gesperrt. Bitte kontaktiere einen Admin, um sie zu entsperren.',
2380+
frozenByAdminNeedsUnfreeze: ({person}: {person: string}) => `Diese Karte wurde von ${person} gesperrt. Bitte kontaktiere einen Admin, um sie zu entsperren.`,
23762381
},
23772382
workflowsPage: {
23782383
workflowTitle: 'Ausgaben',

src/languages/en.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2419,11 +2419,16 @@ const translations = {
24192419
freezeCard: 'Freeze card',
24202420
unfreeze: 'Unfreeze',
24212421
unfreezeCard: 'Unfreeze card',
2422+
askToUnfreeze: 'Ask to unfreeze',
24222423
freezeDescription: 'A frozen card cannot be used for purchases and transactions. You can unfreeze it at any time.',
24232424
unfreezeDescription: "Unfreezing this card will start allowing purchases and transactions again. Only proceed if you're sure the card is safe to use.",
24242425
frozen: 'Frozen',
24252426
youFroze: ({date}: {date: string}) => `You froze this card on ${date}.`,
24262427
frozenBy: ({person, date}: {person: string; date: string}) => `${person} froze this card on ${date}.`,
2428+
frozenByAdminPrefix: ({date}: {date: string}) => `This card was frozen on ${date} by `,
2429+
frozenByAdminNeedsUnfreezePrefix: 'This card was frozen by ',
2430+
frozenByAdminNeedsUnfreezeSuffix: '. Please contact an admin to unfreeze it.',
2431+
frozenByAdminNeedsUnfreeze: ({person}: {person: string}) => `This card was frozen by ${person}. Please contact an admin to unfreeze it.`,
24272432
},
24282433
workflowsPage: {
24292434
workflowTitle: 'Spend',

src/languages/es.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2277,11 +2277,16 @@ ${amount} para ${merchant} - ${date}`,
22772277
freezeCard: 'Congelar tarjeta',
22782278
unfreeze: 'Descongelar',
22792279
unfreezeCard: 'Descongelar tarjeta',
2280+
askToUnfreeze: 'Solicitar descongelación',
22802281
freezeDescription: 'Una tarjeta congelada no se puede usar para compras ni transacciones. Puedes descongelarla en cualquier momento.',
22812282
unfreezeDescription: 'Al descongelar esta tarjeta se volverán a permitir compras y transacciones. Continúa solo si estás seguro de que la tarjeta es segura para usar.',
22822283
frozen: 'Congelada',
22832284
youFroze: ({date}: {date: string}) => `Congelaste esta tarjeta el ${date}.`,
22842285
frozenBy: ({person, date}: {person: string; date: string}) => `${person} congeló esta tarjeta el ${date}.`,
2286+
frozenByAdminPrefix: ({date}: {date: string}) => `Esta tarjeta fue congelada el ${date} por `,
2287+
frozenByAdminNeedsUnfreezePrefix: 'Esta tarjeta fue congelada por ',
2288+
frozenByAdminNeedsUnfreezeSuffix: '. Ponte en contacto con un administrador para descongelarla.',
2289+
frozenByAdminNeedsUnfreeze: ({person}: {person: string}) => `Esta tarjeta fue congelada por ${person}. Ponte en contacto con un administrador para descongelarla.`,
22852290
},
22862291
workflowsPage: {
22872292
workflowTitle: 'Gasto',

src/languages/fr.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2374,12 +2374,17 @@ ${amount} pour ${merchant} - ${date}`,
23742374
freezeCard: 'Geler la carte',
23752375
unfreeze: 'Dégeler',
23762376
unfreezeCard: 'Dégeler la carte',
2377+
askToUnfreeze: 'Demander le dégel',
23772378
freezeDescription: 'Une carte gelée ne peut pas être utilisée pour des achats ni des transactions. Vous pouvez la dégeler à tout moment.',
23782379
unfreezeDescription:
23792380
'Dégeler cette carte permettra à nouveau les achats et les transactions. Continuez uniquement si vous êtes sûr(e) que la carte peut être utilisée en toute sécurité.',
23802381
frozen: 'Gelée',
23812382
youFroze: ({date}: {date: string}) => `Vous avez gelé cette carte le ${date}.`,
23822383
frozenBy: ({person, date}: {person: string; date: string}) => `${person} a gelé cette carte le ${date}.`,
2384+
frozenByAdminPrefix: ({date}: {date: string}) => `Cette carte a été gelée le ${date} par `,
2385+
frozenByAdminNeedsUnfreezePrefix: 'Cette carte a été gelée par ',
2386+
frozenByAdminNeedsUnfreezeSuffix: '. Veuillez contacter un administrateur pour la dégeler.',
2387+
frozenByAdminNeedsUnfreeze: ({person}: {person: string}) => `Cette carte a été gelée par ${person}. Veuillez contacter un administrateur pour la dégeler.`,
23832388
},
23842389
workflowsPage: {
23852390
workflowTitle: 'Dépense',

src/languages/it.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2364,11 +2364,16 @@ ${amount} per ${merchant} - ${date}`,
23642364
freezeCard: 'Blocca carta',
23652365
unfreeze: 'Sblocca',
23662366
unfreezeCard: 'Sblocca carta',
2367+
askToUnfreeze: 'Richiedi sblocco',
23672368
freezeDescription: 'Una carta bloccata non può essere usata per acquisti e transazioni. Puoi sbloccarla in qualsiasi momento.',
23682369
unfreezeDescription: 'Sbloccando questa carta torneranno ad essere consentiti acquisti e transazioni. Procedi solo se sei sicuro che la carta sia sicura da usare.',
23692370
frozen: 'Bloccata',
23702371
youFroze: ({date}: {date: string}) => `Hai bloccato questa carta il ${date}.`,
23712372
frozenBy: ({person, date}: {person: string; date: string}) => `${person} ha bloccato questa carta il ${date}.`,
2373+
frozenByAdminPrefix: ({date}: {date: string}) => `Questa carta è stata bloccata il ${date} da `,
2374+
frozenByAdminNeedsUnfreezePrefix: 'Questa carta è stata bloccata da ',
2375+
frozenByAdminNeedsUnfreezeSuffix: '. Contatta un amministratore per sbloccarla.',
2376+
frozenByAdminNeedsUnfreeze: ({person}: {person: string}) => `Questa carta è stata bloccata da ${person}. Contatta un amministratore per sbloccarla.`,
23722377
},
23732378
workflowsPage: {
23742379
workflowTitle: 'Spesa',

src/languages/ja.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2339,11 +2339,16 @@ ${date} の ${merchant} への ${amount}`,
23392339
freezeCard: 'カードを一時停止',
23402340
unfreeze: '再開',
23412341
unfreezeCard: 'カードの一時停止を解除',
2342+
askToUnfreeze: '一時停止解除を依頼',
23422343
freezeDescription: '一時停止したカードは購入や取引に使用できません。いつでも再開できます。',
23432344
unfreezeDescription: 'このカードの一時停止を解除すると、購入と取引が再び可能になります。カードが安全に使用できると確信できる場合にのみ続行してください。',
23442345
frozen: '凍結中',
23452346
youFroze: ({date}: {date: string}) => `${date}にこのカードを一時停止しました。`,
23462347
frozenBy: ({person, date}: {person: string; date: string}) => `${person}が${date}にこのカードを一時停止しました。`,
2348+
frozenByAdminPrefix: ({date}: {date: string}) => `${date}にこのカードを一時停止したのは`,
2349+
frozenByAdminNeedsUnfreezePrefix: 'このカードは',
2350+
frozenByAdminNeedsUnfreezeSuffix: 'によって一時停止されました。解除するには管理者に連絡してください。',
2351+
frozenByAdminNeedsUnfreeze: ({person}: {person: string}) => `このカードは${person}によって一時停止されました。解除するには管理者に連絡してください。`,
23472352
},
23482353
workflowsPage: {
23492354
workflowTitle: '支出',

src/languages/nl.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2362,11 +2362,16 @@ ${amount} voor ${merchant} - ${date}`,
23622362
freezeCard: 'Kaart blokkeren',
23632363
unfreeze: 'Deblokkeren',
23642364
unfreezeCard: 'Kaart deblokkeren',
2365+
askToUnfreeze: 'Vraag om deblokkering',
23652366
freezeDescription: 'Een geblokkeerde kaart kan niet worden gebruikt voor aankopen en transacties. Je kunt deze op elk moment deblokkeren.',
23662367
unfreezeDescription: 'Door deze kaart te deblokkeren worden aankopen en transacties weer toegestaan. Ga alleen verder als je zeker weet dat de kaart veilig is om te gebruiken.',
23672368
frozen: 'Geblokkeerd',
23682369
youFroze: ({date}: {date: string}) => `Je hebt deze kaart op ${date} geblokkeerd.`,
23692370
frozenBy: ({person, date}: {person: string; date: string}) => `${person} heeft deze kaart op ${date} geblokkeerd.`,
2371+
frozenByAdminPrefix: ({date}: {date: string}) => `Deze kaart is op ${date} bevroren door `,
2372+
frozenByAdminNeedsUnfreezePrefix: 'Deze kaart is bevroren door ',
2373+
frozenByAdminNeedsUnfreezeSuffix: '. Neem contact op met een beheerder om deze te deblokkeren.',
2374+
frozenByAdminNeedsUnfreeze: ({person}: {person: string}) => `Deze kaart is bevroren door ${person}. Neem contact op met een beheerder om deze te deblokkeren.`,
23702375
},
23712376
workflowsPage: {
23722377
workflowTitle: 'Uitgaven',

src/languages/pl.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2358,11 +2358,16 @@ ${amount} dla ${merchant} - ${date}`,
23582358
freezeCard: 'Zamroź kartę',
23592359
unfreeze: 'Odmroź',
23602360
unfreezeCard: 'Odmroź kartę',
2361+
askToUnfreeze: 'Poproś o odmrożenie',
23612362
freezeDescription: 'Zamrożonej karty nie można używać do zakupów i transakcji. Możesz ją odmrozić w dowolnym momencie.',
23622363
unfreezeDescription: 'Odmrożenie tej karty ponownie umożliwi zakupy i transakcje. Kontynuuj tylko wtedy, gdy masz pewność, że korzystanie z karty jest bezpieczne.',
23632364
frozen: 'Zamrożona',
23642365
youFroze: ({date}: {date: string}) => `Zamroziłeś tę kartę ${date}.`,
23652366
frozenBy: ({person, date}: {person: string; date: string}) => `${person} zamroził(a) tę kartę ${date}.`,
2367+
frozenByAdminPrefix: ({date}: {date: string}) => `Ta karta została zamrożona ${date} przez `,
2368+
frozenByAdminNeedsUnfreezePrefix: 'Ta karta została zamrożona przez ',
2369+
frozenByAdminNeedsUnfreezeSuffix: '. Skontaktuj się z administratorem, aby ją odmrozić.',
2370+
frozenByAdminNeedsUnfreeze: ({person}: {person: string}) => `Ta karta została zamrożona przez ${person}. Skontaktuj się z administratorem, aby ją odmrozić.`,
23662371
},
23672372
workflowsPage: {
23682373
workflowTitle: 'Wydatki',

src/languages/pt-BR.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2355,11 +2355,16 @@ ${amount} para ${merchant} - ${date}`,
23552355
freezeCard: 'Bloquear cartão',
23562356
unfreeze: 'Desbloquear',
23572357
unfreezeCard: 'Desbloquear cartão',
2358+
askToUnfreeze: 'Pedir desbloqueio',
23582359
freezeDescription: 'Um cartão bloqueado não pode ser usado para compras e transações. Você pode desbloqueá-lo a qualquer momento.',
23592360
unfreezeDescription: 'Ao desbloquear este cartão, compras e transações voltarão a ser permitidas. Continue apenas se tiver certeza de que o cartão é seguro para uso.',
23602361
frozen: 'Congelado',
23612362
youFroze: ({date}: {date: string}) => `Você bloqueou este cartão em ${date}.`,
23622363
frozenBy: ({person, date}: {person: string; date: string}) => `${person} bloqueou este cartão em ${date}.`,
2364+
frozenByAdminPrefix: ({date}: {date: string}) => `Este cartão foi bloqueado em ${date} por `,
2365+
frozenByAdminNeedsUnfreezePrefix: 'Este cartão foi bloqueado por ',
2366+
frozenByAdminNeedsUnfreezeSuffix: '. Entre em contato com um administrador para desbloqueá-lo.',
2367+
frozenByAdminNeedsUnfreeze: ({person}: {person: string}) => `Este cartão foi bloqueado por ${person}. Entre em contato com um administrador para desbloqueá-lo.`,
23632368
},
23642369
workflowsPage: {
23652370
workflowTitle: 'Gastos',

0 commit comments

Comments
 (0)