on 4e849bf help sign in
bridge/src/store/lib/useInvitesStore.js
57 lines 1.6 kB history raw
1import { useCallback } from 'react';
2import { Just, Nothing } from 'folktale/maybe';
3import * as azimuth from 'azimuth-js';
5import { useNetwork } from '../network';
6import useSetState from 'lib/useSetState';
8// the default value of a point's invites
9const EMPTY_INVITES = {
10 availableInvites: Nothing(),
11 sentInvites: Nothing(),
12 acceptedInvites: Nothing(),
13};
15export default function useInvitesStore() {
16 const { contracts } = useNetwork();
17 const [invitesCache, addToInvitesCache] = useSetState({});
19 const getInvites = useCallback(
20 point => invitesCache[point] || EMPTY_INVITES,
21 [invitesCache]
22 );
24 const syncInvites = useCallback(
25 async point => {
26 const _contracts = contracts.getOrElse(null);
27 if (!_contracts) {
28 return;
29 }
31 const [availableInvites, invitedPoints] = await Promise.all([
32 azimuth.delegatedSending.getTotalUsableInvites(_contracts, point),
33 azimuth.delegatedSending.getInvited(_contracts, point),
34 ]);
36 const activity = await Promise.all(
37 invitedPoints.map(invitedPoint =>
38 azimuth.azimuth.isActive(_contracts, invitedPoint)
39 )
40 );
42 const sentInvites = invitedPoints.length;
43 const acceptedInvites = activity.filter(i => !!i).length;
45 addToInvitesCache({
46 [point]: {
47 availableInvites: Just(availableInvites),
48 sentInvites: Just(sentInvites),
49 acceptedInvites: Just(acceptedInvites),
50 },
51 });
52 },
53 [contracts, addToInvitesCache]
54 );
56 return { getInvites, syncInvites };