on bab2fa8 help sign in
bridge/src/store/lib/useInvitesStore.js
73 lines 2.1 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 console.log('INVITES STORE', availableInvites, invitedPoints, activity);
47 const sentInvites = invitedPoints.length;
48 const acceptedInvites = activity.filter(i => !!i).length;
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))
57 .value();
59 addToInvitesCache({
60 [point]: {
61 availableInvites: Just(availableInvites),
62 sentInvites: Just(sentInvites),
63 acceptedInvites: Just(acceptedInvites),
64 pendingPoints: Just(pendingPoints),
65 acceptedPoints: Just(acceptedPoints),
66 },
67 });
68 },
69 [contracts, addToInvitesCache]
70 );
72 return { getInvites, syncInvites };