@@ -1,4 +1,7 @@
1import React, { useCallback, useEffect, useMemo, useState } from 'react';
1import React, { useCallback, useEffect, useMemo, useState } from 'react';
2+import { Just, Nothing } from 'folktale/maybe';
3+import * as need from 'lib/need';
4+import * as ob from 'urbit-ob';
3import { ActivateSteps } from './ActivateSteps';
6import { ActivateSteps } from './ActivateSteps';
4import { Box } from '@tlon/indigo-react';
7import { Box } from '@tlon/indigo-react';
@@ -10,10 +13,54 @@ import { FadeableMasterKeyCopy as MasterKeyCopy } from './MasterKeyCopy';
10import { FadeableMasterKeyPresenter as MasterKeyPresenter } from './MasterKeyPresenter';
13import { FadeableMasterKeyPresenter as MasterKeyPresenter } from './MasterKeyPresenter';
11import { useActivateFlow } from './ActivateFlow';
14import { useActivateFlow } from './ActivateFlow';
12import ActivateView from './ActivateView';
15import ActivateView from './ActivateView';
16+import { useLocalRouter } from 'lib/LocalRouter';
17+import { compileNetworkingKey } from 'lib/keys';
18+import { downloadWallet } from 'lib/invite';
19+import PaperBuilder from 'components/PaperBuilder';
14const MasterKeyDownload = () => {
21const MasterKeyDownload = () => {
15− const { setIsIn } = useActivateFlow();
28+ } = useActivateFlow();
29+ const { push, names } = useLocalRouter();
30+ const point = need.point(derivedPoint);
31+ const wallet = need.wallet(derivedWallet);
32+ const ticket = wallet.ticket;
34+ const [paper, setPaper] = useState(Nothing());
16 const [triggerAnimation, setTriggerAnimation] = useState<boolean>(false);
35 const [triggerAnimation, setTriggerAnimation] = useState<boolean>(false);
36+ const [downloaded, setDownloaded] = useState<boolean>(false);
38+ const pointAsString = derivedPoint.matchWith({
40+ Just: p => p.value.toFixed(),
43+ const download = useCallback(() => {
44+ const netkey = compileNetworkingKey(wallet.network.keys, point, 1);
45+ //TODO could be deduplicated with useKeyfileGenerator's logic
46+ const filename = ob.patp(point).slice(1) + '-1.key';
47+ downloadWallet(paper.getOrElse([]), netkey, filename);
49+ }, [paper, wallet, point, setDownloaded]);
51+ // sync paper value to activation state
56+ Nothing: () => false,
60+ [paper, setGenerated]
63+ const goToVerify = useCallback(() => push(names.VERIFY), [push, names]);
18 const header = useMemo(() => {
65 const header = useMemo(() => {
19 return triggerAnimation ? (
66 return triggerAnimation ? (
@@ -30,11 +77,14 @@ const MasterKeyDownload = () => {
31 const footer = useMemo(() => {
78 const footer = useMemo(() => {
32 return triggerAnimation ? (
79 return triggerAnimation ? (
33− <ActivateButton onClick={() => console.log('download')}>
80+ <ActivateButton
81+ disabled={!generated}
82+ onClick={!downloaded ? download : goToVerify}
83+ success={downloaded}>
34− Download Backup
84+ {!downloaded ? 'Download Backup (Passport)' : 'Continue'}
35 </ActivateButton>
85 </ActivateButton>
37− }, [triggerAnimation]);
87+ }, [download, downloaded, generated, goToVerify, triggerAnimation]);
39 const delayedReveal = useCallback(async () => {
89 const delayedReveal = useCallback(async () => {
40 setTimeout(() => {
90 setTimeout(() => {
@@ -64,11 +114,18 @@ const MasterKeyDownload = () => {
64 {triggerAnimation && (
114 {triggerAnimation && (
65 <DangerBox>Do not share this with anyone else!</DangerBox>
115 <DangerBox>Do not share this with anyone else!</DangerBox>
67− <MasterKeyPresenter fadeIn={true} />
117+ {ticket && <MasterKeyPresenter fadeIn={true} ticket={ticket} />}
68− {triggerAnimation && <MasterKeyCopy text={'test'} />}
118+ {triggerAnimation && <MasterKeyCopy text={ticket} />}
70 </ActivateView>
120 </ActivateView>
71 <ActivateSteps currentStep={1} totalSteps={4} />
121 <ActivateSteps currentStep={1} totalSteps={4} />
123+ point={pointAsString}
126+ setPaper(Just(data));