on 8ca8b8a help sign in
bridge/src/store/lib/useInvitesStore.js
65 lines 1.7 kB history raw
1import { useCallback, useState } from 'react';
2import Maybe from 'folktale/maybe';
3import * as azimuth from 'azimuth-js';
5import { useNetwork } from '../network';
7// the default value of a point's invites
8const kEmptyInvites = {
9 availableInvites: Maybe.Nothing(),
10 sentInvites: Maybe.Nothing(),
11 acceptedInvites: Maybe.Nothing(),
12};
14export default function useInvitesStore() {
15 const { contracts } = useNetwork();
16 const [invitesCache, _setInvitesCache] = useState({});
18 const addToInvitesCache = useCallback(
19 entry =>
20 _setInvitesCache(cache => ({
21 ...cache,
22 ...entry,
23 })),
24 [_setInvitesCache]
25 );
27 const getInvites = useCallback(
28 point => invitesCache[point] || kEmptyInvites,
29 [invitesCache]
30 );
32 const syncInvites = useCallback(
33 async point => {
34 const _contracts = contracts.getOrElse(null);
35 if (!_contracts) {
36 return;
37 }
39 const [availableInvites, invitedPoints] = await Promise.all([
40 azimuth.delegatedSending.getTotalUsableInvites(_contracts, point),
41 azimuth.delegatedSending.getInvited(_contracts, point),
42 ]);
44 const activity = await Promise.all(
45 invitedPoints.map(invitedPoint =>
46 azimuth.azimuth.isActive(_contracts, invitedPoint)
47 )
48 );
50 const sentInvites = invitedPoints.length;
51 const acceptedInvites = activity.filter(i => i.active).length;
53 addToInvitesCache({
54 [point]: {
55 availableInvites: Maybe.Just(availableInvites),
56 sentInvites: Maybe.Just(sentInvites),
57 acceptedInvites: Maybe.Just(acceptedInvites),
58 },
59 });
60 },
61 [contracts, addToInvitesCache]
62 );
64 return { getInvites, syncInvites };