on master help sign in
Add page for redownloading paper wallet
2043bfcFang
src/lib/routeNames.js+1
@@ -8,6 +8,7 @@ export const ROUTE_NAMES = {
8 //
8 //
9 LOGIN: Symbol('LOGIN'),
9 LOGIN: Symbol('LOGIN'),
10 ADMIN: Symbol('ADMIN'),
10 ADMIN: Symbol('ADMIN'),
11+ REDOWNLOAD: Symbol('REDOWNLOAD'),
11 RETICKET: Symbol('RETICKET'),
12 RETICKET: Symbol('RETICKET'),
12 //
13 //
13 ACCEPT_TRANSFER: Symbol('ACCEPT_TRANSFER'),
14 ACCEPT_TRANSFER: Symbol('ACCEPT_TRANSFER'),
src/lib/router.js+2
@@ -6,6 +6,7 @@ import Login from '../views/Login.js';
6import InviteTicket from '../views/InviteTicket';
6import InviteTicket from '../views/InviteTicket';
7import InvitesManage from '../views/InvitesManage.js';
7import InvitesManage from '../views/InvitesManage.js';
8import Admin from '../views/Admin';
8import Admin from '../views/Admin';
9+import Redownload from '../views/Redownload';
9import Reticket from '../views/Reticket';
10import Reticket from '../views/Reticket';
10import AcceptTransfer from '../views/AcceptTransfer';
11import AcceptTransfer from '../views/AcceptTransfer';
11import CancelTransfer from '../views/CancelTransfer';
12import CancelTransfer from '../views/CancelTransfer';
@@ -35,6 +36,7 @@ export const ROUTES = {
35 [ROUTE_NAMES.INVITES_MANAGE]: InvitesManage,
36 [ROUTE_NAMES.INVITES_MANAGE]: InvitesManage,
36 [ROUTE_NAMES.LOGIN]: Login,
37 [ROUTE_NAMES.LOGIN]: Login,
37 [ROUTE_NAMES.ADMIN]: Admin,
38 [ROUTE_NAMES.ADMIN]: Admin,
39+ [ROUTE_NAMES.REDOWNLOAD]: Redownload,
38 [ROUTE_NAMES.RETICKET]: Reticket,
40 [ROUTE_NAMES.RETICKET]: Reticket,
39 [ROUTE_NAMES.ACCEPT_TRANSFER]: AcceptTransfer,
41 [ROUTE_NAMES.ACCEPT_TRANSFER]: AcceptTransfer,
40 [ROUTE_NAMES.CANCEL_TRANSFER]: CancelTransfer,
42 [ROUTE_NAMES.CANCEL_TRANSFER]: CancelTransfer,
src/views/Admin.js+17−5
@@ -1,4 +1,5 @@
1import React, { useCallback } from 'react';
1import React, { useCallback } from 'react';
2+import { Just } from 'folktale/maybe';
2import * as need from 'lib/need';
3import * as need from 'lib/need';
3import { Grid } from 'indigo-react';
4import { Grid } from 'indigo-react';
4
5
@@ -13,10 +14,12 @@ import useInvites from 'lib/useInvites';
13import { ROUTE_NAMES } from 'lib/routeNames';
14import { ROUTE_NAMES } from 'lib/routeNames';
14
15
15import { useHistory } from 'store/history';
16import { useHistory } from 'store/history';
17+import { useWallet } from 'store/wallet';
16import FooterButton from 'components/FooterButton';
18import FooterButton from 'components/FooterButton';
17
19
18export default function Admin() {
20export default function Admin() {
19 const history = useHistory();
21 const history = useHistory();
22+ const { urbitWallet } = useWallet();
20 const { pointCursor } = usePointCursor();
23 const { pointCursor } = usePointCursor();
21 // const { pointCache } = usePointCache();
24 // const { pointCache } = usePointCache();
22
25
@@ -25,25 +28,34 @@ export default function Admin() {
25 // fetch the invites for the current cursor
28 // fetch the invites for the current cursor
26 const { availableInvites } = useInvites(point);
29 const { availableInvites } = useInvites(point);
27
30
31+ const goRedownload = useCallback(() => history.push(ROUTE_NAMES.REDOWNLOAD), [
32+ history,
33+ ]);
34+
28 const goReticket = useCallback(() => history.push(ROUTE_NAMES.RETICKET), [
35 const goReticket = useCallback(() => history.push(ROUTE_NAMES.RETICKET), [
29 history,
36 history,
30 ]);
37 ]);
31
38
32 // const pointDetails = need.fromPointCache(pointCache, point);
39 // const pointDetails = need.fromPointCache(pointCache, point);
33
40
41+ const canDownloadPassport = Just.hasInstance(urbitWallet);
42+
34 return (
43 return (
35 <View>
44 <View>
36 <Grid className="pt2">
45 <Grid className="pt2">
37 <Grid.Item full>
46 <Grid.Item full>
38− //TODO "Set Keys" when unset?
39− <ForwardButton detail="Configure public keys">
47+ <ForwardButton
40− Edit Keys
48+ disabled={!canDownloadPassport}
49+ onClick={goRedownload}
50+ detail="Re-download your paper wallet">
51+ Download Passport
41 </ForwardButton>
52 </ForwardButton>
42 </Grid.Item>
53 </Grid.Item>
43 <Grid.Divider />
54 <Grid.Divider />
44 <Grid.Item full>
55 <Grid.Item full>
56+ <ForwardButton
57+ onClick={goReticket}
45− //TODO disable if not logged in as owner
58+ detail="//TODO disable if not logged in as owner">
46− <ForwardButton detail="Get a new master ticket" onClick={goReticket}>
47 Reticket
59 Reticket
48 </ForwardButton>
60 </ForwardButton>
49 </Grid.Item>
61 </Grid.Item>
src/views/Redownload.jsnew file+55
@@ -0,0 +1,55 @@
1+import React, { useCallback, useState } from 'react';
2+import { Just, Nothing } from 'folktale/maybe';
3+import * as need from 'lib/need';
4+import { Grid } from 'indigo-react';
5+
6+import { usePointCursor } from 'store/pointCursor';
7+// import { usePointCache } from 'store/pointCache';
8+
9+import View from 'components/View';
10+import { DownloadButton } from 'components/Buttons';
11+import PaperCollateralRenderer from 'PaperCollateralRenderer';
12+
13+import { downloadWallet } from 'lib/invite';
14+import { ROUTE_NAMES } from 'lib/routeNames';
15+
16+import { useHistory } from 'store/history';
17+import { useWallet } from 'store/wallet';
18+import FooterButton from 'components/FooterButton';
19+
20+export default function Admin() {
21+ const history = useHistory();
22+ const { urbitWallet } = useWallet();
23+ const { pointCursor } = usePointCursor();
24+ const point = need.pointCursor(pointCursor);
25+
26+ const [paper, setPaper] = useState(Nothing());
27+
28+ const doDownload = () => {
29+ downloadWallet(paper.value);
30+ };
31+
32+ const paperRenderer = Just.hasInstance(paper) ? null : (
33+ <PaperCollateralRenderer
34+ wallet={{ [point]: urbitWallet.value }}
35+ className={'extremely-hidden'}
36+ callback={paper => {
37+ setPaper(Just(paper));
38+ }}
39+ mode={'REGISTRATION'}
40+ />
41+ );
42+
43+ return (
44+ <View>
45+ <DownloadButton
46+ disabled={Nothing.hasInstance(paper)}
47+ onClick={doDownload}>
48+ {Nothing.hasInstance(paper)
49+ ? 'Printing and folding...'
50+ : 'Download paper wallet'}
51+ </DownloadButton>
52+ {paperRenderer}
53+ </View>
54+ );
55+}