on b465a33 help sign in
bridge/src/lib/useMailer.js
44 lines 1.2 kB history raw
1import { useCallback, useEffect } from 'react';
2import Maybe from 'folktale/maybe';
4import { hasReceived, sendMail } from './inviteMail';
5import useSetState from './useSetState';
7function useHasReceivedCache(emails = []) {
8 const [cache, addToCache] = useSetState();
10 const getHasRecieved = useCallback(
11 email => cache[email] || Maybe.Nothing(), //
12 [cache]
13 );
15 useEffect(() => {
16 for (const email of emails) {
17 if (Maybe.Just.hasInstance(getHasRecieved(email))) {
18 // never update the cache after we know about it
19 return;
20 }
22 (async () => {
23 addToCache({ [email]: await hasReceived(email) });
24 })();
25 }
26 }, [emails, getHasRecieved, addToCache]);
28 return { getHasRecieved };
31export default function useMailer(emails) {
32 const { getHasRecieved } = useHasReceivedCache(emails);
34 // prefix to avoid clobbering sendMail import
35 const _sendMail = useCallback(async (email, ticket, rawTx) => {
36 const mailSuccess = await sendMail(email, ticket, rawTx);
38 if (!mailSuccess) {
39 throw new Error(`Internal mailing error when mailing ${email}`);
40 }
41 }, []);
43 return { getHasRecieved, sendMail: _sendMail };