on d760cbf help sign in
bridge/src/store/lib/useRekeyDateStore.js
62 lines 1.6 kB history raw
1import { useCallback, useState } from 'react';
2import { Just, Nothing } from 'folktale/maybe';
4import { useNetwork } from '../network';
6export default function useRekeyDateStore() {
7 const { web3, contracts } = useNetwork();
8 const [rekeyDateCache, _setRekeyDateCache] = useState({});
10 const addToRekeyDateCache = useCallback(
11 entry =>
12 _setRekeyDateCache(cache => ({
13 ...cache,
14 ...entry,
15 })),
16 [_setRekeyDateCache]
17 );
19 const getRekeyDate = useCallback(
20 point => rekeyDateCache[point] || Nothing(),
21 [rekeyDateCache]
22 );
24 const syncRekeyDate = useCallback(
25 async point => {
26 const _web3 = web3.getOrElse(null);
27 if (!_web3) {
28 return;
29 }
30 const _contracts = contracts.getOrElse(null);
31 if (!_contracts) {
32 return;
33 }
35 //TODO tighter search?
36 //TODO maybe move into azimuth-js?
37 const logs = await _contracts.azimuth.getPastEvents('ChangedKeys', {
38 fromBlock: 0,
39 toBlock: 'latest',
40 filter: { point: [point] },
41 });
43 if (logs.length === 0) {
44 //TODO: better encoding for "no rekeyDate" state?
45 addToRekeyDateCache({
46 [point]: Just('unknown'),
47 });
48 } else {
49 // last log is most recent
50 const blockNumber = logs[logs.length - 1].blockNumber;
51 const block = await _web3.eth.getBlock(blockNumber);
52 addToRekeyDateCache({
53 //TODO date format
54 [point]: Just(new Date(block.timestamp * 1000).toString()),
55 });
56 }
57 },
58 [web3, contracts, addToRekeyDateCache]
59 );
61 return { getRekeyDate, syncRekeyDate };