forked from decred/decrediton
-
Notifications
You must be signed in to change notification settings - Fork 0
/
hooks.js
96 lines (84 loc) · 2.77 KB
/
hooks.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
import { useState, useCallback } from "react";
import { useSelector, useDispatch } from "react-redux";
import * as sel from "selectors";
import * as ca from "actions/ClientActions";
import * as ta from "actions/TransactionActions";
import { UNMINED, IMMATURE, LIVE } from "constants";
import { isEqual } from "lodash";
import QRCode from "qrcode";
import { useIntl } from "react-intl";
export const useTicketsList = () => {
const intl = useIntl();
const dispatch = useDispatch();
// selectors
const tickets = useSelector(sel.filteredStakeTxs);
const tsDate = useSelector(sel.tsDate);
const noMoreTickets = useSelector(sel.noMoreStakeTxs);
const ticketsFilter = useSelector(sel.ticketsFilter);
const window = useSelector(sel.mainWindow);
// actions
const goBackHistory = () => dispatch(ca.goBackHistory());
const getTickets = (isStake) => dispatch(ta.getTransactions(isStake));
const changeTicketsFilter = (newFilter) =>
dispatch(ta.changeTicketsFilter(newFilter));
const [QRs, setQRs] = useState([]);
const [qrHashes, setQRHashes] = useState([]);
const [QRsPage, setQRsPage] = useState(0);
const [loadingQRs, setLoadingQRs] = useState(true);
// Number of transaction hashes per QR.
const TX_PER_QR = 10;
const activeFilter = ({ status }) =>
status === UNMINED || status === IMMATURE || status === LIVE;
const onQRPageClick = ({ selected }) => {
setQRsPage(selected);
};
// prepareQR asychronously updates the qr codes if current viewed ticket hashes
// have changed since last viewing.
const prepareQRs = useCallback(() => {
setLoadingQRs(true);
const filteredTiks = tickets.filter(activeFilter);
const filteredHashes = filteredTiks.map(({ txHash }) => txHash);
if (filteredHashes.length == 0) {
setLoadingQRs(false);
return;
}
// If QRs already generated for all given tickets, then nothing to do.
if (isEqual(qrHashes, filteredHashes)) {
setLoadingQRs(false);
return;
}
const qrsPromises = [];
// Create for each page of hashes a QR.
for (let i = 0; i < Math.ceil(filteredHashes.length / TX_PER_QR); i++) {
const start = i * TX_PER_QR;
const qrdata = JSON.stringify(
filteredHashes.slice(start, start + TX_PER_QR)
);
qrsPromises.push(QRCode.toDataURL(qrdata));
}
Promise.all(qrsPromises)
.then((qrs) => {
setQRHashes(filteredHashes);
setQRs(qrs);
setLoadingQRs(false);
})
// XXX snackbar error instead plzx.
.catch((err) => console.log(err));
}, [tickets, qrHashes]);
return {
intl,
tickets,
tsDate,
noMoreTickets,
ticketsFilter,
window,
goBackHistory,
getTickets,
changeTicketsFilter,
QRsPage,
onQRPageClick,
loadingQRs,
QRs,
prepareQRs
};
};