@@ -0,0 +1,204 @@
1+import React, { useCallback, useMemo } from 'react';
2+import * as need from 'lib/need';
4+import ActivateView from './ActivateView';
5+import { Box, Text } from '@tlon/indigo-react';
6+import { composeValidator, buildPatqValidator } from 'form/validators';
7+import { DEFAULT_FADE_TIMEOUT } from 'lib/constants';
8+import { FadeableActivateButton as ActivateButton } from './ActivateButton';
9+import { FadeableActivateHeader as ActivateHeader } from './ActivateHeader';
10+import { FadeableActivateParagraph as ActivateParagraph } from './ActivateParagraph';
11+import { FadeableActivateSteps as ActivateSteps } from './ActivateSteps';
12+import { isDevelopment } from 'lib/flags';
13+import { ticketFromSegments, ticketToSegments } from 'form/formatters';
14+import { timeout } from 'lib/timeout';
15+import { useActivateFlow } from './ActivateFlow';
16+import { useLocalRouter } from 'lib/LocalRouter';
17+import { validateExactly } from 'lib/validators';
18+import BridgeForm from 'form/BridgeForm';
19+import FormError from 'form/FormError';
20+import useFadeIn from './useFadeIn';
26+const MasterKeyConfirm = () => {
27+ const { derivedWallet, setIsIn } = useActivateFlow();
28+ const { ticket } = need.wallet(derivedWallet);
29+ const { push, names } = useLocalRouter();
30+ const STUB_VERIFY_TICKET = isDevelopment;
31+ const ticketSegments = useMemo(() => ticketToSegments(ticket), [ticket]);
33+ const onValues = useCallback(({ valid, values, form }) => {
34+ console.log('valid:', valid);
35+ console.log('values:', values);
37+ const { ticket0, ticket1, ticket2, ticket3 } = values;
39+ const updatedTicket = ticketFromSegments([
46+ console.log(updatedTicket);
48+ form.change('ticket', updatedTicket);
51+ const validate = useMemo(
54+ ticket: buildPatqValidator([
55+ validateExactly(ticket, 'Does not match expected master ticket.'),
61+ const initialValues = useMemo(
63+ ticket: STUB_VERIFY_TICKET ? ticket : undefined,
64+ ticket0: STUB_VERIFY_TICKET ? ticketSegments[0] : undefined,
65+ ticket1: STUB_VERIFY_TICKET ? ticketSegments[1] : undefined,
66+ ticket2: STUB_VERIFY_TICKET ? ticketSegments[2] : undefined,
69+ [STUB_VERIFY_TICKET, ticket, ticketSegments]
72+ const goToTransfer = useCallback(async () => {
74+ await timeout(DEFAULT_FADE_TIMEOUT); // Pause for UI fade animation
75+ push(names.TRANSFER);
76+ }, [names.TRANSFER, push, setIsIn]);
78+ const header = useMemo(() => {
81+ <ActivateHeader copy={'Confirm Backup'} />
84+ 'Confirm that you have stored your Master Key somewhere safe by entering it below'
98+ gridAreas={"'header' 'content'"}>
100+ alignItems={'center'}
102+ flexDirection={'column'}
105+ justifyContent={'center'}>
109+ flexFlow: 'column nowrap',
112+ justifyContent: 'center',
113+ alignItems: 'center',
116+ afterSubmit={goToTransfer}
118+ initialValues={initialValues}>
119+ {({ handleSubmit, valid }) => (
122+ gridTemplateAreas={"'inputs' 'submit'"}
123+ gridTemplateColumns={'1fr'}
124+ gridTemplateRows={'80% 20%'}
130+ flexDirection={'column'}
133+ alignItems={'center'}
134+ justifyContent={'center'}>
137+ flexDirection={'row'}
139+ height={'min-content'}
141+ justifyContent={'center'}>
142+ {ticketSegments.map((segment, i) => {
147+ flexDirection={'row'}
148+ flexWrap={'nowrap'}>
154+ fontFamily={'Source Code Pro'}
155+ borderRadius={'5px'}
156+ border={'solid 1px rgba(0,0,0,0.25)'}
159+ {i < ticketSegments.length - 1 ? (
176+ style={{ display: 'none' }}
181+ <Box as={FormError} />
185+ flexDirection="column"
188+ justifyContent="flex-end"
190+ <ActivateButton disabled={!valid} onClick={handleSubmit}>
199+ <ActivateSteps currentStep={2} totalSteps={4} overrideFadeIn={true} />
204+export default MasterKeyConfirm;