on 4b0ca21 help sign in
bridge/src/store/lib/useResidentsStore.ts
103 lines 2.9 kB history raw
1import { useState, useCallback } from 'react';
2import { Just, Nothing } from 'folktale/maybe';
4import { azimuth } from 'azimuth-js';
6import { useNetwork } from 'store/network';
8import * as need from 'lib/need';
10const emptyCacheEntry = {
11 residentCount: Nothing(),
12 requestCount: Nothing(),
13 residents: Nothing(),
14 requests: Nothing(),
15};
17export default function useResidents() {
18 const [residentCache, _setResidentCache] = useState({});
20 const addToResidentCache = useCallback(
21 (point, entry) =>
22 _setResidentCache(cache => ({ ...cache, [point]: entry })),
23 [_setResidentCache]
24 );
26 const getResidents = useCallback(
27 point => residentCache[point] || emptyCacheEntry,
28 [residentCache]
29 );
31 const { contracts } = useNetwork();
32 const _contracts = need.contracts(contracts);
34 const syncResidentCount = useCallback(
35 async point => {
36 // Do nothing if we've already fetched in full
37 // or we aren't a sponsor
38 const pointSize = azimuth.getPointSize(point);
39 if (Just.hasInstance(getResidents(point).residents)) {
40 return;
41 }
42 if (pointSize === azimuth.PointSize.Planet) {
43 addToResidentCache(point, {
44 residentCount: Just(0),
45 requestCount: Just(0),
46 requests: Just([]),
47 residents: Just([]),
48 });
49 return;
50 }
52 const isGalaxy = pointSize === azimuth.PointSize.Galaxy;
53 const [residentCount, requestCount] = await Promise.all([
54 azimuth.getSponsoringCount(_contracts, point),
55 azimuth.getEscapeRequestsCount(_contracts, point),
56 ]);
58 // Galaxies sponsor themselves
59 const parsedCount = Number(residentCount);
60 const _residentCount = isGalaxy ? parsedCount - 1 : parsedCount;
62 addToResidentCache(point, {
63 residentCount: Just(_residentCount),
64 requestCount: Just(Number(requestCount)),
65 residents: Nothing(),
66 requests: Nothing(),
67 });
68 },
69 [addToResidentCache, _contracts, getResidents]
70 );
72 const syncResidents = useCallback(
73 async point => {
74 if (azimuth.getPointSize(point) === azimuth.PointSize.Planet) {
75 addToResidentCache(point, {
76 residentCount: Just(0),
77 requestCount: Just(0),
78 requests: Just([]),
79 residents: Just([]),
80 });
82 return;
83 }
84 const [residents, requests] = await Promise.all([
85 azimuth.getSponsoring(_contracts, point),
86 azimuth.getEscapeRequests(_contracts, point),
87 ]);
89 // Galaxies sponsor themselves
90 const _residents = residents.filter(r => r !== point);
92 addToResidentCache(point, {
93 residentCount: Just(_residents.length),
94 requestCount: Just(requests.length),
95 residents: Just(_residents),
96 requests: Just(requests),
97 });
98 },
99 [addToResidentCache, _contracts]
100 );
102 return { getResidents, syncResidentCount, syncResidents };