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;
37 await handleShowModal({ email });
41 [getUser, getAddresses]
44 return { handleDraftVerifications, sendingFromDefaultAddressModal };
48 * Hooks to create new draft messages.
49 * It will prepare an empty draft to be quickly reused and create other drafts with helpers
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();
63 const run = async () => {
64 if (!mailSettings || !addresses) {
67 const message = createNewDraft(
75 cache.set(CACHE_KEY, message);
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);
90 // This cast is quite dangerous but hard to remove
91 message = createNewDraft(
103 message.localID = generateUID('draft');
104 dispatch(createDraftAction(message));
105 return message.localID;
107 [cache, getMailSettings, getAddresses, draftVerifications]
110 return { createDraft, sendingFromDefaultAddressModal };