Skip to content

Commit 00a1f20

Browse files
author
MargeBot
committed
Merge branch 'chore/clean_enums_destructuring' into 'main'
Add more enum destructuring protection See merge request web/clients!18754
2 parents 3b65590 + 613425a commit 00a1f20

25 files changed

+350
-351
lines changed

applications/mail/.eslintrc.js

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,9 @@ module.exports = {
1313
'no-restricted-syntax': [
1414
'error',
1515
{
16-
selector: "VariableDeclarator[id.type='ObjectPattern'][init.name='MAILBOX_LABEL_IDS']",
17-
message: 'Destructuring MAILBOX_LABEL_IDS is not allowed. Use MAILBOX_LABEL_IDS.PROPERTY instead.',
16+
selector: "VariableDeclarator[id.type='ObjectPattern'][init.name=/^[A-Z_]+$/]",
17+
message:
18+
'Destructuring of enum-like constants is not allowed. Use CONSTANT.PROPERTY instead to maintain code readability.',
1819
},
1920
],
2021
},

applications/mail/src/app/components/composer/actions/MoreActionsExtension.tsx

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,6 @@ import { exportPlainText, plainTextToHTML, setDocumentContent } from '../../../h
2323
import type { MessageChange, MessageChangeFlag } from '../Composer';
2424
import type { ExternalEditorActions } from '../editor/EditorWrapper';
2525

26-
const { FLAG_PUBLIC_KEY, FLAG_RECEIPT_REQUEST } = MESSAGE_FLAGS;
27-
2826
const getClassname = (status: boolean) => (status ? undefined : 'visibility-hidden');
2927

3028
interface Props {
@@ -44,11 +42,12 @@ const MoreActionsExtension = ({ message, onChangeFlag, editorActionsRef, editorM
4442
const isReceiptRequest = testIsRequestReadReceipt(message?.data);
4543

4644
const handleTogglePublicKey = async () => {
47-
const changes = new Map([[FLAG_PUBLIC_KEY, !isAttachPublicKey]]);
45+
const changes = new Map([[MESSAGE_FLAGS.FLAG_PUBLIC_KEY, !isAttachPublicKey]]);
4846
onChangeFlag(changes);
4947
};
5048

51-
const handleToggleReceiptRequest = () => onChangeFlag(new Map([[FLAG_RECEIPT_REQUEST, !isReceiptRequest]]));
49+
const handleToggleReceiptRequest = () =>
50+
onChangeFlag(new Map([[MESSAGE_FLAGS.FLAG_RECEIPT_REQUEST, !isReceiptRequest]]));
5251

5352
const handleChangeMetadata = useCallback(
5453
(change: Partial<EditorMetadata>) => {

applications/mail/src/app/components/composer/modals/ComposerAssistantSettingModal.tsx

Lines changed: 13 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,6 @@ import clsx from '@proton/utils/clsx';
2525
import { useComposerAssistantProvider } from 'proton-mail/components/assistant/provider/ComposerAssistantProvider';
2626
import ComposerInnerModal from 'proton-mail/components/composer/modals/ComposerInnerModal';
2727

28-
const { SERVER_ONLY, CLIENT_ONLY, UNSET } = AI_ASSISTANT_ACCESS;
29-
3028
interface Props {
3129
composerID: string;
3230
onClose: () => void;
@@ -50,7 +48,7 @@ const ComposerAssistantSettingModal = ({ composerID, onClose: closeSettingModal,
5048

5149
// Default to server only if unset
5250
const [inputValue, setInputValue] = useState<AI_ASSISTANT_ACCESS>(
53-
UNSET === AIAssistantFlags ? SERVER_ONLY : AIAssistantFlags
51+
AI_ASSISTANT_ACCESS.UNSET === AIAssistantFlags ? AI_ASSISTANT_ACCESS.SERVER_ONLY : AIAssistantFlags
5452
);
5553

5654
const handleSubmit = async () => {
@@ -69,14 +67,14 @@ const ComposerAssistantSettingModal = ({ composerID, onClose: closeSettingModal,
6967

7068
await updateSetting();
7169

72-
if (inputValue === SERVER_ONLY) {
70+
if (inputValue === AI_ASSISTANT_ACCESS.SERVER_ONLY) {
7371
await closeModal();
7472
onToggleAssistant(inputValue);
7573
createNotification({ text: notificationText });
7674
return;
7775
}
7876

79-
if (inputValue === CLIENT_ONLY) {
77+
if (inputValue === AI_ASSISTANT_ACCESS.CLIENT_ONLY) {
8078
const { hasCompatibleHardware, hasCompatibleBrowser } = await handleCheckHardwareCompatibility();
8179
const canRunLocally = hasCompatibleHardware && hasCompatibleBrowser;
8280
if (canRunLocally) {
@@ -141,13 +139,13 @@ const ComposerAssistantSettingModal = ({ composerID, onClose: closeSettingModal,
141139
<Button
142140
className={clsx(
143141
'flex flex-row flex-nowrap rounded-xl',
144-
inputValue === CLIENT_ONLY && 'display-focus-visible'
142+
inputValue === AI_ASSISTANT_ACCESS.CLIENT_ONLY && 'display-focus-visible'
145143
)}
146144
disabled={loading}
147-
aria-pressed={inputValue === CLIENT_ONLY}
145+
aria-pressed={inputValue === AI_ASSISTANT_ACCESS.CLIENT_ONLY}
148146
shape="outline"
149-
color={inputValue === CLIENT_ONLY ? 'norm' : 'weak'}
150-
onClick={() => setInputValue(CLIENT_ONLY)}
147+
color={inputValue === AI_ASSISTANT_ACCESS.CLIENT_ONLY ? 'norm' : 'weak'}
148+
onClick={() => setInputValue(AI_ASSISTANT_ACCESS.CLIENT_ONLY)}
151149
id={`assistant-setting-${composerID}`}
152150
>
153151
<span className="shrink-0 flex my-auto">
@@ -163,7 +161,7 @@ const ComposerAssistantSettingModal = ({ composerID, onClose: closeSettingModal,
163161
<span
164162
className={clsx(
165163
'shrink-0 my-auto',
166-
inputValue === CLIENT_ONLY ? 'color-primary' : 'visibility-hidden'
164+
inputValue === AI_ASSISTANT_ACCESS.CLIENT_ONLY ? 'color-primary' : 'visibility-hidden'
167165
)}
168166
>
169167
<Icon name="checkmark" />
@@ -172,13 +170,13 @@ const ComposerAssistantSettingModal = ({ composerID, onClose: closeSettingModal,
172170
<Button
173171
className={clsx(
174172
'flex flex-row flex-nowrap rounded-xl',
175-
inputValue === SERVER_ONLY && 'display-focus-visible'
173+
inputValue === AI_ASSISTANT_ACCESS.SERVER_ONLY && 'display-focus-visible'
176174
)}
177175
disabled={loading}
178-
aria-pressed={inputValue === SERVER_ONLY}
176+
aria-pressed={inputValue === AI_ASSISTANT_ACCESS.SERVER_ONLY}
179177
shape="outline"
180-
color={inputValue === SERVER_ONLY ? 'norm' : 'weak'}
181-
onClick={() => setInputValue(SERVER_ONLY)}
178+
color={inputValue === AI_ASSISTANT_ACCESS.SERVER_ONLY ? 'norm' : 'weak'}
179+
onClick={() => setInputValue(AI_ASSISTANT_ACCESS.SERVER_ONLY)}
182180
id={`assistant-setting-${composerID}`}
183181
>
184182
<span className="shrink-0 flex my-auto">
@@ -192,7 +190,7 @@ const ComposerAssistantSettingModal = ({ composerID, onClose: closeSettingModal,
192190
<span
193191
className={clsx(
194192
'shrink-0 my-auto',
195-
inputValue === SERVER_ONLY ? 'color-primary' : 'visibility-hidden'
193+
inputValue === AI_ASSISTANT_ACCESS.SERVER_ONLY ? 'color-primary' : 'visibility-hidden'
196194
)}
197195
>
198196
<Icon name="checkmark" />

applications/mail/src/app/components/drawer/MailQuickSettings.tsx

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -64,8 +64,6 @@ import useMailModel from 'proton-mail/hooks/useMailModel';
6464
import ClearBrowserDataModal from '../header/ClearBrowserDataModal';
6565
import MailDefaultHandlerModal from '../header/MailDefaultHandlerModal';
6666

67-
const { OFF, UNSET, SERVER_ONLY } = AI_ASSISTANT_ACCESS;
68-
6967
interface QuickSettingsSelectOption {
7068
value: any;
7169
text: string;
@@ -224,7 +222,7 @@ const MailQuickSettings = () => {
224222
}
225223
};
226224

227-
const aiFlag = AIAssistantFlags === UNSET ? SERVER_ONLY : AIAssistantFlags;
225+
const aiFlag = AIAssistantFlags === AI_ASSISTANT_ACCESS.UNSET ? AI_ASSISTANT_ACCESS.SERVER_ONLY : AIAssistantFlags;
228226

229227
const showOnboardingModalTrigger = useCanReplayOnboarding();
230228
const {
@@ -377,7 +375,7 @@ const MailQuickSettings = () => {
377375
<QuickSettingsSectionRow
378376
label={c('Label').t`Writing assistant`}
379377
labelInfo={
380-
aiFlag === OFF ? (
378+
aiFlag === AI_ASSISTANT_ACCESS.OFF ? (
381379
<Info
382380
title={c('Info').t`Learn more`}
383381
onClick={() => openNewTab(getKnowledgeBaseUrl('/proton-scribe-writing-assistant'))}
@@ -394,7 +392,7 @@ const MailQuickSettings = () => {
394392
}
395393
/>
396394
{/* Need to use handleSettingChange because at this stage we're still on the server mode, so we need to start the local init process*/}
397-
{aiFlag !== OFF && (
395+
{aiFlag !== AI_ASSISTANT_ACCESS.OFF && (
398396
<ToggleAssistantEnvironment
399397
aiFlag={AIAssistantFlags}
400398
onEnableLocal={handleEnableAssistantLocal}

applications/mail/src/app/components/list/ItemHoverButtons.tsx

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,6 @@ import { folderLocation } from './list-telemetry/listTelemetryHelper';
2525
import { SOURCE_ACTION } from './list-telemetry/useListTelemetry';
2626
import SnoozeDropdown from './snooze/containers/SnoozeDropdown';
2727

28-
const { READ, UNREAD } = MARK_AS_STATUS;
29-
3028
interface Props {
3129
element: Element; // Element of the current line
3230
labelID: string;
@@ -75,7 +73,7 @@ const ItemHoverButtons = ({
7573
void markAs({
7674
elements: [element],
7775
labelID,
78-
status: isUnread ? READ : UNREAD,
76+
status: isUnread ? MARK_AS_STATUS.READ : MARK_AS_STATUS.UNREAD,
7977
sourceAction: SOURCE_ACTION.HOVER_BUTTONS,
8078
silent: true,
8179
});

applications/mail/src/app/components/list/banners/mail-upsell/useMailUpsellOption.tsx

Lines changed: 16 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,6 @@ export interface MessageOption {
3030
}
3131

3232
const linkClasses = 'text-bold link align-baseline';
33-
const { plansSelection, vpn, protonBusiness, drive, securityAndPrivacy } = MAIL_UPSELL_BANNERS_OPTIONS_URLS;
3433

3534
const useMailUpsellOption = ({ setMailShortcutsModalOpen, setThemesModalOpen }: Props) => {
3635
const theme = useTheme();
@@ -48,7 +47,7 @@ const useMailUpsellOption = ({ setMailShortcutsModalOpen, setThemesModalOpen }:
4847
text: c('Info').t`Upgrade to send email from @pm.me addresses.`,
4948
cta: (
5049
<MailUpsellOptionCTA
51-
url={plansSelection}
50+
url={MAIL_UPSELL_BANNERS_OPTIONS_URLS.plansSelection}
5251
optionID={MAIL_UPSELL_BANNER_LINK_ID_REF_PATH.SEND_FROM_PM_ADDRESS}
5352
/>
5453
),
@@ -58,7 +57,7 @@ const useMailUpsellOption = ({ setMailShortcutsModalOpen, setThemesModalOpen }:
5857
text: c('Info').t`Upgrade to create more folders, filters, and addresses.`,
5958
cta: (
6059
<MailUpsellOptionCTA
61-
url={plansSelection}
60+
url={MAIL_UPSELL_BANNERS_OPTIONS_URLS.plansSelection}
6261
optionID={MAIL_UPSELL_BANNER_LINK_ID_REF_PATH.GET_MORE_FOLDERS_FILTERS_AND_ADDRESSES}
6362
/>
6463
),
@@ -68,7 +67,7 @@ const useMailUpsellOption = ({ setMailShortcutsModalOpen, setThemesModalOpen }:
6867
text: c('Info').t`Upgrade to use auto-reply when you're away.`,
6968
cta: (
7069
<MailUpsellOptionCTA
71-
url={plansSelection}
70+
url={MAIL_UPSELL_BANNERS_OPTIONS_URLS.plansSelection}
7271
optionID={MAIL_UPSELL_BANNER_LINK_ID_REF_PATH.AUTO_REPLY}
7372
/>
7473
),
@@ -78,7 +77,7 @@ const useMailUpsellOption = ({ setMailShortcutsModalOpen, setThemesModalOpen }:
7877
text: c('Info').t`Upgrade to use ${MAIL_APP_NAME} with Apple Mail, Outlook or Thunderbird.`,
7978
cta: (
8079
<MailUpsellOptionCTA
81-
url={plansSelection}
80+
url={MAIL_UPSELL_BANNERS_OPTIONS_URLS.plansSelection}
8281
optionID={MAIL_UPSELL_BANNER_LINK_ID_REF_PATH.THIRD_PARTY_CLIENTS}
8382
/>
8483
),
@@ -88,7 +87,7 @@ const useMailUpsellOption = ({ setMailShortcutsModalOpen, setThemesModalOpen }:
8887
text: c('Info').t`Upgrade to support privacy and get more features.`,
8988
cta: (
9089
<MailUpsellOptionCTA
91-
url={plansSelection}
90+
url={MAIL_UPSELL_BANNERS_OPTIONS_URLS.plansSelection}
9291
optionID={MAIL_UPSELL_BANNER_LINK_ID_REF_PATH.GET_MORE_FEATURES}
9392
/>
9493
),
@@ -116,7 +115,7 @@ const useMailUpsellOption = ({ setMailShortcutsModalOpen, setThemesModalOpen }:
116115
text: c('Info').t`Upgrade to send emails from your custom email domain.`,
117116
cta: (
118117
<MailUpsellOptionCTA
119-
url={plansSelection}
118+
url={MAIL_UPSELL_BANNERS_OPTIONS_URLS.plansSelection}
120119
optionID={MAIL_UPSELL_BANNER_LINK_ID_REF_PATH.HOST_EMAILS_FROM_YOUR_DOMAINS}
121120
/>
122121
),
@@ -126,7 +125,7 @@ const useMailUpsellOption = ({ setMailShortcutsModalOpen, setThemesModalOpen }:
126125
text: c('Info').t`${MAIL_APP_NAME} can protect your business as well.`,
127126
cta: (
128127
<MailUpsellOptionCTA
129-
url={protonBusiness}
128+
url={MAIL_UPSELL_BANNERS_OPTIONS_URLS.plansSelection}
130129
optionID={MAIL_UPSELL_BANNER_LINK_ID_REF_PATH.PROTECT_YOUR_BUSINESS}
131130
/>
132131
),
@@ -136,7 +135,7 @@ const useMailUpsellOption = ({ setMailShortcutsModalOpen, setThemesModalOpen }:
136135
text: c('Info').t`Upgrade to add more addresses to your account.`,
137136
cta: (
138137
<MailUpsellOptionCTA
139-
url={plansSelection}
138+
url={MAIL_UPSELL_BANNERS_OPTIONS_URLS.plansSelection}
140139
optionID={MAIL_UPSELL_BANNER_LINK_ID_REF_PATH.ADD_MORE_ADDRESSES}
141140
/>
142141
),
@@ -146,7 +145,7 @@ const useMailUpsellOption = ({ setMailShortcutsModalOpen, setThemesModalOpen }:
146145
text: c('Info').t`Upgrade to send emails to contact groups easily.`,
147146
cta: (
148147
<MailUpsellOptionCTA
149-
url={plansSelection}
148+
url={MAIL_UPSELL_BANNERS_OPTIONS_URLS.plansSelection}
150149
optionID={MAIL_UPSELL_BANNER_LINK_ID_REF_PATH.CONTACT_GROUPS}
151150
/>
152151
),
@@ -156,7 +155,7 @@ const useMailUpsellOption = ({ setMailShortcutsModalOpen, setThemesModalOpen }:
156155
text: c('Info').t`Upgrade to support a privacy-first internet.`,
157156
cta: (
158157
<MailUpsellOptionCTA
159-
url={plansSelection}
158+
url={MAIL_UPSELL_BANNERS_OPTIONS_URLS.plansSelection}
160159
optionID={MAIL_UPSELL_BANNER_LINK_ID_REF_PATH.PRIVACY_FIRST_INTERNET}
161160
/>
162161
),
@@ -166,7 +165,7 @@ const useMailUpsellOption = ({ setMailShortcutsModalOpen, setThemesModalOpen }:
166165
text: c('Info').t`Upgrade to support our mission of privacy for all.`,
167166
cta: (
168167
<MailUpsellOptionCTA
169-
url={plansSelection}
168+
url={MAIL_UPSELL_BANNERS_OPTIONS_URLS.plansSelection}
170169
optionID={MAIL_UPSELL_BANNER_LINK_ID_REF_PATH.PRIVACY_FOR_ALL}
171170
/>
172171
),
@@ -175,7 +174,7 @@ const useMailUpsellOption = ({ setMailShortcutsModalOpen, setThemesModalOpen }:
175174
id: 19,
176175
text: c('Info').t`Secure your files with encrypted cloud storage for free, today.`,
177176
cta: (
178-
<Href href={drive} className={linkClasses} tabIndex={0}>
177+
<Href href={MAIL_UPSELL_BANNERS_OPTIONS_URLS.drive} className={linkClasses} tabIndex={0}>
179178
{callToActionTexts.learnMore}
180179
</Href>
181180
),
@@ -184,7 +183,7 @@ const useMailUpsellOption = ({ setMailShortcutsModalOpen, setThemesModalOpen }:
184183
id: 20,
185184
text: c('Info').t`You can use ${VPN_APP_NAME} for free, today.`,
186185
cta: (
187-
<Href href={vpn} className={linkClasses} tabIndex={0}>
186+
<Href href={MAIL_UPSELL_BANNERS_OPTIONS_URLS.vpn} className={linkClasses} tabIndex={0}>
188187
{callToActionTexts.learnMore}
189188
</Href>
190189
),
@@ -194,7 +193,7 @@ const useMailUpsellOption = ({ setMailShortcutsModalOpen, setThemesModalOpen }:
194193
text: c('Info').t`Upgrade to unlock premium features.`,
195194
cta: (
196195
<MailUpsellOptionCTA
197-
url={plansSelection}
196+
url={MAIL_UPSELL_BANNERS_OPTIONS_URLS.plansSelection}
198197
optionID={MAIL_UPSELL_BANNER_LINK_ID_REF_PATH.PREMIUM_FEATURES}
199198
/>
200199
),
@@ -204,7 +203,7 @@ const useMailUpsellOption = ({ setMailShortcutsModalOpen, setThemesModalOpen }:
204203
text: c('Info').t`Upgrade to level up your privacy.`,
205204
cta: (
206205
<MailUpsellOptionCTA
207-
url={plansSelection}
206+
url={MAIL_UPSELL_BANNERS_OPTIONS_URLS.plansSelection}
208207
optionID={MAIL_UPSELL_BANNER_LINK_ID_REF_PATH.LVL_UP_PRIVACY}
209208
/>
210209
),
@@ -216,7 +215,7 @@ const useMailUpsellOption = ({ setMailShortcutsModalOpen, setThemesModalOpen }:
216215
.t`Join ${PROTON_SENTINEL_NAME} program for our highest level of account security and support.`,
217216
cta: (
218217
<MailUpsellOptionCTA
219-
url={securityAndPrivacy}
218+
url={MAIL_UPSELL_BANNERS_OPTIONS_URLS.securityAndPrivacy}
220219
optionID={MAIL_UPSELL_BANNER_LINK_ID_REF_PATH.PROTON_SENTINEL}
221220
/>
222221
),

applications/mail/src/app/components/list/tip/useTips.tsx

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -49,8 +49,6 @@ const suggestedFolderName = 'Receipts';
4949
const suggestedLabelName = 'To pay';
5050
const suggestedPaidLabelName = 'Paid';
5151

52-
const { vpn, drive, pass } = MAIL_UPSELL_BANNERS_OPTIONS_URLS;
53-
5452
const TIP_HIDDEN = -1 as const;
5553

5654
const useTips = () => {
@@ -255,7 +253,7 @@ const useTips = () => {
255253
// translator: Open Proton Drive
256254
cta: (
257255
<Href
258-
href={drive}
256+
href={MAIL_UPSELL_BANNERS_OPTIONS_URLS.drive}
259257
className="link align-baseline"
260258
tabIndex={0}
261259
onClick={() => sendCTAButtonClickedReport(TipActionType.OpenProtonDrive)}
@@ -273,7 +271,7 @@ const useTips = () => {
273271
// translator: Open Proton Pass
274272
cta: (
275273
<Href
276-
href={pass}
274+
href={MAIL_UPSELL_BANNERS_OPTIONS_URLS.pass}
277275
className="link align-baseline"
278276
tabIndex={0}
279277
onClick={() => sendCTAButtonClickedReport(TipActionType.OpenProtonPass)}
@@ -291,7 +289,7 @@ const useTips = () => {
291289
// translator: Download Proton VPN
292290
cta: (
293291
<Href
294-
href={vpn}
292+
href={MAIL_UPSELL_BANNERS_OPTIONS_URLS.vpn}
295293
className="link align-baseline"
296294
tabIndex={0}
297295
onClick={() => sendCTAButtonClickedReport(TipActionType.DownloadProtonVPN)}

0 commit comments

Comments
 (0)