on 44dc2fe help sign in
bridge/src/store/lib/useInvitesStore.js
72 lines 2.0 kB history raw
1import { useCallback } from 'react';
2import { Just, Nothing } from 'folktale/maybe';
3import * as azimuth from 'azimuth-js';
4import { chain } from 'lodash';
6import { useNetwork } from '../network';
7import useSetState from 'lib/useSetState';
9// the default value of a point's invites
10const EMPTY_INVITES = {
11 availableInvites: Nothing(),
12 sentInvites: Nothing(),
13 acceptedInvites: Nothing(),
14 acceptedPoints: Nothing(),
15 pendingPoints: Nothing(),
16};
18export default function useInvitesStore() {
19 const { contracts } = useNetwork();
20 const [invitesCache, addToInvitesCache] = useSetState({});
22 const getInvites = useCallback(
23 point => invitesCache[point] || EMPTY_INVITES,
24 [invitesCache]
25 );
27 const syncInvites = useCallback(
28 async point => {
29 const _contracts = contracts.getOrElse(null);
30 if (!_contracts) {
31 return;
32 }
34 const [availableInvites, invitedPoints] = await Promise.all([
35 azimuth.delegatedSending.getTotalUsableInvites(_contracts, point),
36 azimuth.delegatedSending.getInvited(_contracts, point),
37 ]);
39 const activity = await Promise.all(
40 invitedPoints.map(invitedPoint =>
41 azimuth.azimuth.isActive(_contracts, invitedPoint)
42 )
43 );
45 const sentInvites = invitedPoints.length;
46 const acceptedInvites = activity.filter(i => !!i).length;
48 console.log(invitedPoints);
50 const [acceptedPoints, pendingPoints] = chain(invitedPoints)
51 .zipWith(activity, (point, active) => ({
52 point,
53 active: !!active,
54 }))
55 .partition('active')
56 .map(arr => arr.map(x => x.point));
58 addToInvitesCache({
59 [point]: {
60 availableInvites: Just(availableInvites),
61 sentInvites: Just(sentInvites),
62 acceptedInvites: Just(acceptedInvites),
63 pendingPoints: Just(pendingPoints),
64 acceptedPoints: Just(acceptedPoints),
65 },
66 });
67 },
68 [contracts, addToInvitesCache]
69 );
71 return { getInvites, syncInvites };