Use same lock values as mobile clients
[ProtonMail-WebClient.git] / packages / shared / lib / api / messages.ts
blob826495b00bca09e6c58050ac0763b2d4c24113af
1 import type { SPAM_ACTION } from '@proton/shared/lib/mail/mailSettings';
3 import type { SimpleMap } from '../interfaces';
4 import type { Message } from '../interfaces/mail/Message';
5 import type { PackageDirect } from '../interfaces/mail/crypto';
6 import type { CREATE_DRAFT_MESSAGE_ACTION, SEND_MESSAGE_DIRECT_ACTION } from '../interfaces/message';
7 import { getAppropriateSort } from './helpers/snoozeSort';
8 import type { MailboxItemsQueryParams } from './mailbox';
10 type BaseMessage = Pick<
11     Message,
12     'ToList' | 'CCList' | 'BCCList' | 'Subject' | 'Sender' | 'Body' | 'MIMEType' | 'Attachments' | 'Flags'
15 export interface MailSearchContext {
16     LabelID: string;
19 export const queryMessageMetadata = ({
20     Location,
21     Page,
22     PageSize,
23     Limit,
24     LabelID,
25     Sort = 'Time',
26     Desc = 1,
27     Begin,
28     End,
29     BeginID,
30     EndID,
31     Keyword,
32     To,
33     From,
34     Subject,
35     Attachments,
36     Starred,
37     Unread,
38     AddressID,
39     ID,
40     AutoWildcard,
41     Anchor,
42     AnchorID,
43 }: MailboxItemsQueryParams) => ({
44     method: 'get',
45     url: 'mail/v4/messages',
46     params: {
47         Location,
48         Page,
49         PageSize,
50         Limit,
51         LabelID,
52         Sort: getAppropriateSort(LabelID, Sort),
53         Desc,
54         Begin,
55         End,
56         BeginID,
57         EndID,
58         Keyword,
59         Recipients: To,
60         From,
61         Subject,
62         Attachments,
63         Starred,
64         Unread,
65         AddressID,
66         ID,
67         AutoWildcard,
68         Anchor,
69         AnchorID,
70     },
71 });
73 export const queryMessageCount = (AddressID?: string) => ({
74     method: 'get',
75     url: 'mail/v4/messages/count',
76     params: { AddressID },
77 });
79 export const getMessage = (messageID: string) => ({
80     method: 'get',
81     url: `mail/v4/messages/${messageID}`,
82 });
84 interface SendMessageData {
85     AutoSaveContacts: number;
86     DelaySeconds?: number;
87     DeliveryTime?: number;
88     ExpirationTime?: number;
89     ExpiresIn?: number;
90     Packages: PackageDirect[];
93 export const sendMessage = (
94     messageID: string,
95     { ExpirationTime, ExpiresIn, AutoSaveContacts, Packages, DelaySeconds = 0, DeliveryTime }: SendMessageData
96 ) => ({
97     method: 'post',
98     url: `mail/v4/messages/${messageID}`,
99     data: { ExpirationTime, ExpiresIn, AutoSaveContacts, Packages, DelaySeconds, DeliveryTime },
102 export const sendMessageForm = (messageID: string, data: any, sendingFrom?: string) => ({
103     method: 'post',
104     url: `mail/v4/messages/${messageID}`,
105     input: 'form',
106     data,
107     params: {
108         Source: sendingFrom,
109     },
112 interface SendMessageDirectData {
113     Message: BaseMessage;
114     ParentID?: number;
115     Action?: SEND_MESSAGE_DIRECT_ACTION;
116     AttachmentKeys: SimpleMap<string>;
117     ExpirationTime?: number;
118     ExpiresIn?: number;
119     AutoSaveContacts: number;
120     Packages: PackageDirect[];
123 export const sendMessageDirect = ({
124     Message,
125     ParentID,
126     Action,
127     AttachmentKeys,
128     ExpirationTime,
129     ExpiresIn,
130     AutoSaveContacts,
131     Packages,
132 }: SendMessageDirectData) => ({
133     method: 'post',
134     url: `mail/v4/messages/send/direct`,
135     data: { Message, ParentID, Action, AttachmentKeys, ExpirationTime, ExpiresIn, AutoSaveContacts, Packages },
138 interface UpdateDraftData {
139     Message: BaseMessage;
140     AttachmentKeyPackets: SimpleMap<string>;
143 interface CreateDraftData extends UpdateDraftData {
144     ParentID?: string;
145     Action?: CREATE_DRAFT_MESSAGE_ACTION;
148 export const createDraft = ({ Message, ParentID, Action, AttachmentKeyPackets }: CreateDraftData) => ({
149     method: 'post',
150     url: 'mail/v4/messages',
151     data: { Message, ParentID, Action, AttachmentKeyPackets },
154 export const updateDraft = (messageID: string, { Message, AttachmentKeyPackets }: UpdateDraftData) => ({
155     method: 'put',
156     url: `mail/v4/messages/${messageID}`,
157     data: { Message, AttachmentKeyPackets },
160 export const updateBody = (messageID: string, data: { Body: string }) => ({
161     method: 'post',
162     url: `mail/v4/messages/${messageID}/body`,
163     data,
166 export const markAsBroken = (messageID: string) => ({
167     method: 'put',
168     url: `mail/v4/messages/${messageID}/mark/broken`,
171 export const readReceipt = (messageID: string) => ({
172     method: 'post',
173     url: `mail/v4/messages/${messageID}/receipt`,
176 export const markAsHam = (messageID: string) => ({
177     method: 'put',
178     url: `mail/v4/messages/${messageID}/mark/ham`,
181 export const oneClickUnsubscribe = (ID: string) => ({
182     method: 'post',
183     url: `mail/v4/messages/${ID}/unsubscribe`,
186 export const markAsUnsubscribed = (IDs: string[]) => ({
187     method: 'put',
188     url: `mail/v4/messages/mark/unsubscribed`,
189     data: { IDs },
192 export const markMessageAsRead = (IDs: string[]) => ({
193     method: 'put',
194     url: 'mail/v4/messages/read',
195     data: { IDs },
198 export const markMessageAsUnread = (IDs: string[]) => ({
199     method: 'put',
200     url: 'mail/v4/messages/unread',
201     data: { IDs },
204 export const markAllMessagesAsRead = ({ SearchContext }: { SearchContext: MailSearchContext }) => ({
205     method: 'post',
206     url: 'mail/v4/messages/batch/read',
207     data: { SearchContext },
210 export const markAllMessagesAsUnread = ({ SearchContext }: { SearchContext: MailSearchContext }) => ({
211     method: 'post',
212     url: 'mail/v4/messages/batch/unread',
213     data: { SearchContext },
216 export const deleteMessages = (IDs: string[], CurrentLabelID?: string) => ({
217     method: 'put',
218     url: 'mail/v4/messages/delete',
219     data: { IDs, CurrentLabelID },
222 export const undeleteMessages = (IDs: string[]) => ({
223     method: 'put',
224     url: 'mail/v4/messages/undelete',
225     data: { IDs },
228 export const labelMessages = ({
229     LabelID,
230     IDs,
231     SpamAction,
232 }: {
233     LabelID: string;
234     IDs: string[];
235     SpamAction?: SPAM_ACTION;
236 }) => ({
237     method: 'put',
238     url: 'mail/v4/messages/label',
239     data: { LabelID, IDs, SpamAction },
242 export const unlabelMessages = ({ LabelID, IDs }: { LabelID: string; IDs: string[] }) => ({
243     method: 'put',
244     url: 'mail/v4/messages/unlabel',
245     data: { LabelID, IDs },
248 export const emptyLabel = ({ LabelID, AddressID }: { LabelID: string; AddressID: string | undefined }) => ({
249     method: 'delete',
250     url: 'mail/v4/messages/empty',
251     params: { LabelID, AddressID },
254 export const labelAll = ({
255     SearchContext,
256     AddLabelIDs,
257     RemoveLabelIDs,
258 }: {
259     SearchContext: MailSearchContext;
260     AddLabelIDs: string[];
261     RemoveLabelIDs: string[];
262 }) => ({
263     method: 'post',
264     url: 'mail/v4/messages/batch/label',
265     data: { SearchContext, AddLabelIDs, RemoveLabelIDs },
268 export const moveAllBatch = ({
269     SearchContext,
270     DestinationLabelID,
271 }: {
272     SearchContext: MailSearchContext;
273     DestinationLabelID: string;
274 }) => ({
275     method: 'post',
276     url: 'mail/v4/messages/batch/move',
277     data: { SearchContext, DestinationLabelID },
280 export const cancelSend = (messageID: string) => ({
281     method: 'post',
282     url: `mail/v4/messages/${messageID}/cancel_send`,
285 export const forceSend = (messageID: string) => ({
286     method: 'post',
287     url: `mail/v4/messages/${messageID}/force_send`,
290 export const unsubscribeMessages = (IDs: string[]) => ({
291     method: 'post',
292     url: 'mail/v4/messages/unsubscribe',
293     data: { IDs },
296 export const setExpiration = (IDs: string[], ExpirationTime: number | null) => ({
297     method: 'put',
298     url: 'mail/v4/messages/expire',
299     data: { IDs, ExpirationTime },