on 8d566ea help sign in
bridge/src/store/lib/useResidentsStore.js
83 lines 2.4 kB history raw
1import { useState, useCallback, useEffect } from 'react';
2import { Just, Nothing } from 'folktale/maybe';
4import { azimuth } from 'azimuth-js';
6import { useNetwork } from 'store/network';
8import useCurrentPermissions from 'lib/useCurrentPermissions';
9import * as need from 'lib/need';
11const emptyCacheEntry = {
12 residentCount: Nothing(),
13 requestCount: Nothing(),
14 residents: Nothing(),
15 requests: Nothing(),
16};
18export default function useResidents() {
19 const [residentCache, _setResidentCache] = useState({});
21 const addToResidentCache = useCallback(
22 (point, entry) =>
23 _setResidentCache(cache => ({ ...cache, [point]: entry })),
24 [_setResidentCache]
25 );
27 const getResidents = useCallback(
28 point => residentCache[point] || emptyCacheEntry,
29 [residentCache]
30 );
32 const { contracts, web3 } = useNetwork();
33 const _contracts = need.contracts(contracts);
35 const syncResidentCount = useCallback(
36 async point => {
37 // Do nothing if we've already fetched in full
38 if (Just.hasInstance(getResidents(point).residents)) {
39 return;
40 }
42 const isGalaxy = azimuth.getPointSize(point) === azimuth.PointSize.Galaxy;
43 const [residentCount, requestCount] = await Promise.all([
44 azimuth.getSponsoringCount(_contracts, point),
45 azimuth.getEscapeRequestsCount(_contracts, point),
46 ]);
48 const _residentCount = isGalaxy
49 ? residentCount.toNumber() - 1
50 : residentCount.toNumber();
52 addToResidentCache(point, {
53 residentCount: Just(_residentCount),
54 requestCount: Just(requestCount.toNumber()),
55 residents: Nothing(),
56 requests: Nothing(),
57 });
58 },
59 [addToResidentCache, _contracts, getResidents]
60 );
62 const syncResidents = useCallback(
63 async point => {
64 // Galaxies sponsor themselves
65 const [residents, requests] = await Promise.all([
66 azimuth.getSponsoring(_contracts, point),
67 azimuth.getEscapeRequests(_contracts, point),
68 ]);
70 const _residents = residents.filter(r => r !== point);
72 addToResidentCache(point, {
73 residentCount: Just(_residents.length),
74 requestCount: Just(requests.length),
75 residents: Just(_residents),
76 requests: Just(requests),
77 });
78 },
79 [addToResidentCache, _contracts]
80 );
82 return { getResidents, syncResidentCount, syncResidents };