Remove payments API routing initialization
[ProtonMail-WebClient.git] / packages / components / containers / recovery / getSentinelRecoveryProps.ts
blob5d9e7968c4596e480dbc9dbc6ea126dd4a35cc3e
1 import { c } from 'ttag';
3 import type { UserSettings } from '@proton/shared/lib/interfaces';
4 import isTruthy from '@proton/utils/isTruthy';
6 import type { RecoveryCardStatusProps } from './RecoveryCardStatus';
8 export type EmailSettings = Pick<UserSettings['Email'], 'Value' | 'Status' | 'Notify' | 'Reset'>;
9 export type PhoneSettings = Pick<UserSettings['Phone'], 'Value' | 'Status' | 'Notify' | 'Reset'>;
10 interface Ids {
11     account: string;
12     data: string;
15 interface CallToAction {
16     text: string;
17     path: string;
19 export const populateCallToActions = (
20     type: 'phone number' | 'email address' | `recovery phrase`,
21     ids: Ids,
22     set?: boolean,
23     verified?: boolean,
24     enabled?: boolean,
25     hasMnemonic?: boolean
26 ): CallToAction => {
27     if (type === 'recovery phrase') {
28         return {
29             text: c('Info').t`Set recovery phrase`,
30             path: `/recovery#${ids.data}`,
31         };
32     }
34     let text = '';
36     if (!set) {
37         if (type === 'phone number') {
38             text = c('Info').t`Add a recovery phone number`;
39         } else if (type === 'email address') {
40             text = c('Info').t`Add a recovery email address`;
41         }
42     } else if (hasMnemonic && enabled) {
43         if (type === 'phone number') {
44             text = c('Info').t`Disable recovery by phone number`;
45         } else if (type === 'email address') {
46             text = c('Info').t`Disable recovery by email address`;
47         }
48     } else {
49         if (type === 'phone number') {
50             text = c('Info').t`Verify phone number`;
51         } else if (type === 'email address') {
52             text = c('Info').t`Verify email address`;
53         }
54     }
55     return {
56         text: text,
57         path: `/recovery#${ids.account}`,
58     };
61 const sortActionTypes = (a: CallToAction, b: CallToAction) => {
62     if (a.text.startsWith('Disable') && !b.text.startsWith('Disable')) {
63         return -1;
64     } else if (!a.text.startsWith('Disable') && b.text.startsWith('Disable')) {
65         return 1;
66     } else {
67         return 0;
68     }
71 const getSentinelRecoveryProps = (
72     email: EmailSettings,
73     phone: PhoneSettings,
74     hasMnemonic: boolean,
75     ids: Ids
76 ): RecoveryCardStatusProps => {
77     const hasEmail = !!email.Value;
78     const hasEmailVerified = !!email.Status;
79     const hasEmailEnabled = !!email.Reset;
80     const hasPhone = !!phone.Value;
81     const hasPhoneVerified = !!phone.Status;
82     const hasPhoneEnabled = !!phone.Reset;
84     const hasVerifiedandDisabledEmail = hasEmail && hasEmailVerified && !hasEmailEnabled;
85     const hasVerifiedandDisabledPhone = hasPhone && hasPhoneVerified && !hasPhoneEnabled;
87     // case 10
88     if (hasMnemonic && hasVerifiedandDisabledEmail && hasVerifiedandDisabledPhone) {
89         return {
90             type: 'success',
91             statusText: c('Info').t`Your account recovery method is set`,
92             callToActions: [],
93         };
94     }
96     const emailCTA = populateCallToActions(
97         'email address',
98         ids,
99         hasEmail,
100         hasEmailVerified,
101         hasEmailEnabled,
102         hasMnemonic
103     );
104     const phoneCTA = populateCallToActions(
105         'phone number',
106         ids,
107         hasPhone,
108         hasPhoneVerified,
109         hasPhoneEnabled,
110         hasMnemonic
111     );
112     const recoveryCTA = populateCallToActions('recovery phrase', ids);
113     // case 2,7,8,9
114     if (hasMnemonic) {
115         return {
116             type: 'warning',
117             statusText: c('Info').t`To ensure highest possible security of your account`,
118             callToActions: [!hasVerifiedandDisabledEmail && emailCTA, !hasVerifiedandDisabledPhone && phoneCTA]
119                 .filter(isTruthy)
120                 .sort(sortActionTypes),
121         };
122     }
123     // case 6
124     if (!hasMnemonic && ((hasEmailVerified && hasEmailEnabled) || (hasPhoneVerified && hasPhoneEnabled))) {
125         return {
126             type: 'warning',
127             statusText: c('Info').t`To ensure highest possible security of your account`,
128             callToActions: [recoveryCTA, !hasEmailVerified && emailCTA, !hasPhoneVerified && phoneCTA].filter(isTruthy),
129         };
130     }
131     //case 5
132     if (
133         !hasMnemonic &&
134         ((hasEmail && hasEmailEnabled && !hasEmailVerified) || (hasPhone && hasPhoneEnabled && !hasPhoneVerified))
135     ) {
136         return {
137             type: 'warning',
138             statusText: c('Info').t`To ensure continuous access to your account, set an account recovery method`,
139             callToActions: [
140                 recoveryCTA,
141                 !hasVerifiedandDisabledEmail && emailCTA,
142                 !hasVerifiedandDisabledPhone && phoneCTA,
143             ].filter(isTruthy),
144         };
145     }
147     // case 1, 3, 4
148     return {
149         type: 'danger',
150         statusText: c('Info').t`No account recovery method set; you are at risk of losing access to your account`,
151         callToActions: [
152             !hasMnemonic && recoveryCTA,
153             !hasVerifiedandDisabledEmail && emailCTA,
154             !hasVerifiedandDisabledPhone && phoneCTA,
155         ].filter(isTruthy),
156     };
159 export default getSentinelRecoveryProps;