1 import { defaultESContext } from '@proton/encrypted-search';
2 import { getAppHref } from '@proton/shared/lib/apps/helper';
3 import { APPS, DEFAULT_MAIL_PAGE_SIZE, MAILBOX_LABEL_IDS } from '@proton/shared/lib/constants';
4 import { getKnowledgeBaseUrl } from '@proton/shared/lib/helpers/url';
6 import type { ESDBStatusMail, EncryptedSearchFunctionsMail } from './models/encryptedSearch';
8 export const MAIN_ROUTE_PATH = '/:labelID?/:elementID?/:messageID?';
9 export const EXPIRATION_CHECK_FREQUENCY = 10000; // each 10 seconds
10 export const MAX_EXPIRATION_TIME = 672; // hours
11 export const DEFAULT_EO_EXPIRATION_DAYS = 28;
12 export const DEFAULT_PLACEHOLDERS_COUNT = DEFAULT_MAIL_PAGE_SIZE;
13 export const ATTACHMENT_MAX_SIZE = 25000000; // bytes -> 25MB
14 export const LARGE_KEY_SIZE = 50 * 1024;
15 export const LOAD_RETRY_COUNT = 3;
16 export const LOAD_RETRY_DELAY = 3000; // in ms => 3s
17 export const PREVENT_CANCEL_SEND_INTERVAL = 30000; // Prevent form cancelling a message about to be sent 30s before
19 export const ADVANCED_SEARCH_OVERLAY_CLOSE_EVENT = 'advancedsearchclose';
21 export const UNDO_SEND_DELAY = 5000;
23 export const SCHEDULED_MESSAGES_LIMIT = 100;
24 export const SCHEDULED_MAX_DATE_DAYS = 90;
25 export const EXPIRATION_TIME_MAX_DAYS = 730; // 2 years
27 * We can't schedule a message before this 120sec buffer
28 * This can be applied to snoozed message and schedule send
30 export const FUTURE_MESSAGES_BUFFER = 120;
32 export const MIN_DELAY_SENT_NOTIFICATION = 2500;
34 export const MAIL_ACTION_DEFAULT_CHUNK_SIZE = 10;
36 export const ELEMENT_TYPES = {
38 CONVERSATION: 'conversation',
41 export const LABEL_IDS_TO_HUMAN = {
42 [MAILBOX_LABEL_IDS.INBOX]: 'inbox',
43 [MAILBOX_LABEL_IDS.ALL_DRAFTS]: 'all-drafts',
44 [MAILBOX_LABEL_IDS.ALL_SENT]: 'all-sent',
45 [MAILBOX_LABEL_IDS.TRASH]: 'trash',
46 [MAILBOX_LABEL_IDS.SPAM]: 'spam',
47 [MAILBOX_LABEL_IDS.ALL_MAIL]: 'all-mail',
48 [MAILBOX_LABEL_IDS.ALMOST_ALL_MAIL]: 'almost-all-mail',
49 [MAILBOX_LABEL_IDS.ARCHIVE]: 'archive',
50 [MAILBOX_LABEL_IDS.SENT]: 'sent',
51 [MAILBOX_LABEL_IDS.DRAFTS]: 'drafts',
52 [MAILBOX_LABEL_IDS.STARRED]: 'starred',
53 [MAILBOX_LABEL_IDS.OUTBOX]: 'outbox',
54 [MAILBOX_LABEL_IDS.SCHEDULED]: 'scheduled',
55 [MAILBOX_LABEL_IDS.SNOOZED]: 'snoozed',
58 export const HUMAN_TO_LABEL_IDS = Object.entries(LABEL_IDS_TO_HUMAN).reduce((acc, [key, value]) => {
61 }, Object.create(null));
63 // List of location where messages are marked automatically as read after moving by the API
64 export const LABELS_AUTO_READ = [MAILBOX_LABEL_IDS.TRASH];
66 // List of location that cannot be change by user interaction
67 export const LABELS_UNMODIFIABLE_BY_USER = [
68 MAILBOX_LABEL_IDS.ALL_MAIL,
69 MAILBOX_LABEL_IDS.ALMOST_ALL_MAIL,
70 MAILBOX_LABEL_IDS.ALL_SENT,
71 MAILBOX_LABEL_IDS.ALL_DRAFTS,
72 MAILBOX_LABEL_IDS.OUTBOX,
73 MAILBOX_LABEL_IDS.SCHEDULED,
74 MAILBOX_LABEL_IDS.SNOOZED,
77 export enum ENCRYPTED_STATUS {
78 PGP_MIME = 8, // Used for attachment
81 export enum LINK_TYPES {
87 export enum MESSAGE_ACTIONS {
94 export const MAILTO_PROTOCOL_HANDLER_SEARCH_PARAM = `mailto`;
95 // Path: /inbox/#mailto=%s
96 export const MAILTO_PROTOCOL_HANDLER_PATH = `/${
97 LABEL_IDS_TO_HUMAN[MAILBOX_LABEL_IDS.INBOX]
98 }/#${MAILTO_PROTOCOL_HANDLER_SEARCH_PARAM}=%s`;
100 export enum SAVE_DRAFT_ERROR_CODES {
101 MESSAGE_ALREADY_SENT = 15034,
102 DRAFT_DOES_NOT_EXIST = 15033,
105 export enum SEND_EMAIL_ERROR_CODES {
106 MESSAGE_ALREADY_SENT = 2500,
109 export enum UPLOAD_ATTACHMENT_ERROR_CODES {
110 MESSAGE_ALREADY_SENT = 11114,
111 STORAGE_QUOTA_EXCEEDED = 11100,
114 export const MESSAGE_ALREADY_SENT_INTERNAL_ERROR = 'Message already sent';
115 export const STORAGE_QUOTA_EXCEEDED_INTERNAL_ERROR = 'Storage quota exceeded';
117 export const DRAG_ELEMENT_KEY = 'drag-element';
118 export const DRAG_ELEMENT_ID_KEY = 'drag-element-id';
119 export const DRAG_ADDRESS_KEY = 'drag-address';
120 export const DRAG_ADDRESS_SIZE_KEY = 'drag-address-size';
122 export const MAX_ELEMENT_LIST_LOAD_RETRIES = 3;
125 export const defaultESMailStatus: ESDBStatusMail = {
126 dropdownOpened: false,
127 temporaryToggleOff: false,
130 export const defaultESContextMail: EncryptedSearchFunctionsMail = {
132 openDropdown: () => {},
133 closeDropdown: () => {},
134 setTemporaryToggleOff: () => {},
135 esStatus: { ...defaultESContext.esStatus, ...defaultESMailStatus },
137 export const MAIL_EVENTLOOP_NAME = 'core';
139 export const MAIL_UPSELL_BANNERS_OPTIONS_URLS = {
140 plansSelection: '/upgrade',
141 protonBusiness: '/upgrade?business',
142 vpn: getAppHref('/vpn/vpn-apps', APPS.PROTONACCOUNT),
143 drive: getAppHref('/', APPS.PROTONDRIVE),
144 pass: getAppHref('/', APPS.PROTONPASS),
145 securityAndPrivacy: '/security',
148 export const restoringEncryptedMessagesURL = getKnowledgeBaseUrl('/recover-encrypted-messages-files');
149 export const reActivateKeySettingsURL = '/encryption-keys';
151 export const emailTrackerProtectionURL = getKnowledgeBaseUrl('/email-tracker-protection');
153 // Used for main action such as "label as", "move to" and "mark as read/unread"
154 export const SUCCESS_NOTIFICATION_EXPIRATION = 7500;
156 export const EO_REDIRECT_PATH = '/eo';
157 export const EO_MESSAGE_REDIRECT_PATH = `${EO_REDIRECT_PATH}/message`;
158 export const EO_REPLY_REDIRECT_PATH = `${EO_REDIRECT_PATH}/reply`;
160 export const EO_MAX_REPLIES_NUMBER = 5;
162 // Keys used for secure session storage
163 export const EO_TOKEN_KEY = 'proton:eo_token';
164 export const EO_DECRYPTED_TOKEN_KEY = 'proton:eo_decrypted_token';
165 export const EO_PASSWORD_KEY = 'proton:eo_password';
167 export const MAX_ROW_ATTACHMENT_THUMBNAILS = 3;
168 export const MAX_COLUMN_ATTACHMENT_THUMBNAILS = 2;
170 export const NO_REPLY_EMAIL_DONT_SHOW_AGAIN_KEY = 'no-reply-email-dont-show-again';