Merge branch 'INDA-330-pii-update' into 'main'
[ProtonMail-WebClient.git] / applications / mail / src / app / hooks / useDraft.tsx
blobdf81623c25b3f970f61a9842b40b58596fd23f75
1 import { useCallback, useEffect } from 'react';
3 import { useAddresses, useGetAddresses } from '@proton/account/addresses/hooks';
4 import { useGetUser } from '@proton/account/user/hooks';
5 import { useUserSettings } from '@proton/account/userSettings/hooks';
6 import { useCache } from '@proton/components';
7 import { useModalTwo } from '@proton/components/components/modalTwo/useModalTwo';
8 import { useGetMailSettings } from '@proton/mail/mailSettings/hooks';
9 import { isPaid } from '@proton/shared/lib/user/helpers';
10 import generateUID from '@proton/utils/generateUID';
12 import useMailModel from 'proton-mail/hooks/useMailModel';
13 import { useMailDispatch } from 'proton-mail/store/hooks';
15 import SendingFromDefaultAddressModal from '../components/composer/modals/SendingFromDefaultAddressModal';
16 import { MESSAGE_ACTIONS } from '../constants';
17 import { cloneDraft, createNewDraft } from '../helpers/message/messageDraft';
18 import { findSender } from '../helpers/message/messageRecipients';
19 import { createDraft as createDraftAction } from '../store/messages/draft/messagesDraftActions';
20 import type { MessageState, MessageStateWithData, PartialMessageState } from '../store/messages/messagesTypes';
21 import { useGetAttachment } from './attachments/useAttachment';
23 const CACHE_KEY = 'Draft';
25 export const useDraftVerifications = () => {
26     const getAddresses = useGetAddresses();
27     const getUser = useGetUser();
28     const [sendingFromDefaultAddressModal, handleShowModal] = useModalTwo(SendingFromDefaultAddressModal);
30     const handleDraftVerifications = useCallback(
31         async (action: MESSAGE_ACTIONS, referenceMessage?: PartialMessageState) => {
32             const [user, addresses] = await Promise.all([getUser(), getAddresses()]);
34             if (!isPaid(user) && findSender(addresses, referenceMessage?.data)?.Email.endsWith('@pm.me')) {
35                 const email = findSender(addresses, referenceMessage?.data, true)?.Email;
36                 if (email) {
37                     await handleShowModal({ email });
38                 }
39             }
40         },
41         [getUser, getAddresses]
42     );
44     return { handleDraftVerifications, sendingFromDefaultAddressModal };
47 /**
48  * Hooks to create new draft messages.
49  * It will prepare an empty draft to be quickly reused and create other drafts with helpers
50  */
51 export const useDraft = () => {
52     const cache = useCache();
53     const getMailSettings = useGetMailSettings();
54     const getAddresses = useGetAddresses();
55     const dispatch = useMailDispatch();
56     const { handleDraftVerifications: draftVerifications, sendingFromDefaultAddressModal } = useDraftVerifications();
57     const [addresses] = useAddresses();
58     const mailSettings = useMailModel('MailSettings');
59     const [userSettings] = useUserSettings();
60     const getAttachment = useGetAttachment();
62     useEffect(() => {
63         const run = async () => {
64             if (!mailSettings || !addresses) {
65                 return;
66             }
67             const message = createNewDraft(
68                 MESSAGE_ACTIONS.NEW,
69                 undefined,
70                 mailSettings,
71                 userSettings,
72                 addresses,
73                 getAttachment
74             );
75             cache.set(CACHE_KEY, message);
76         };
77         void run();
78     }, [cache, addresses, mailSettings]);
80     const createDraft = useCallback(
81         async (action: MESSAGE_ACTIONS, referenceMessage?: PartialMessageState, isQuickReply?: boolean) => {
82             const [mailSettings, addresses] = await Promise.all([getMailSettings(), getAddresses()]);
84             await draftVerifications(action, referenceMessage);
86             let message: MessageState;
87             if (action === MESSAGE_ACTIONS.NEW && cache.has(CACHE_KEY) && referenceMessage === undefined) {
88                 message = cloneDraft(cache.get(CACHE_KEY) as MessageStateWithData);
89             } else {
90                 // This cast is quite dangerous but hard to remove
91                 message = createNewDraft(
92                     action,
93                     referenceMessage,
94                     mailSettings,
95                     userSettings,
96                     addresses,
97                     getAttachment,
98                     false,
99                     isQuickReply
100                 ) as MessageState;
101             }
103             message.localID = generateUID('draft');
104             dispatch(createDraftAction(message));
105             return message.localID;
106         },
107         [cache, getMailSettings, getAddresses, draftVerifications]
108     );
110     return { createDraft, sendingFromDefaultAddressModal };