import React, { useCallback, useMemo, useState } from 'react'; import * as need from 'lib/need'; import cn from 'classnames'; import ActivateView from './ActivateView'; import { Box, Text } from '@tlon/indigo-react'; import { composeValidator, buildPatqValidator } from 'form/validators'; import { DEFAULT_FADE_TIMEOUT } from 'lib/constants'; import { FadeableActivateButton as ActivateButton } from './ActivateButton'; import { FadeableActivateHeader as ActivateHeader } from './ActivateHeader'; import { FadeableActivateParagraph as ActivateParagraph } from './ActivateParagraph'; import { FadeableActivateSteps as ActivateSteps } from './ActivateSteps'; import { isDevelopment } from 'lib/flags'; import { ticketFromSegments, ticketToSegments } from 'form/formatters'; import { timeout } from 'lib/timeout'; import { useActivateFlow } from './useActivateFlow'; import { useLocalRouter } from 'lib/LocalRouter'; import { validateExactly } from 'lib/validators'; import BridgeForm from 'form/BridgeForm'; import FormError from 'form/FormError'; import useFadeIn from './useFadeIn'; import { HiddenInput, TicketSegmentInput } from 'form/Inputs'; import View from 'components/View'; import './MasterKeyConfirm.scss'; const MasterKeyConfirm = () => { const { inviteMasterTicketWallet, setIsIn }: any = useActivateFlow(); const { ticket } = need.wallet(inviteMasterTicketWallet); const { push, names }: any = useLocalRouter(); const STUB_VERIFY_TICKET = isDevelopment; const ticketSegments = useMemo(() => ticketToSegments(ticket), [ticket]); const [showError, setShowError] = useState(false); const onValues = useCallback(({ valid, values, form }) => { const { ticket0, ticket1, ticket2, ticket3 } = values; const tickets = [ticket0, ticket1, ticket2, ticket3]; const allTicketsPopulated = tickets.every(t => t?.length === 6); setShowError(!valid && allTicketsPopulated); form.change('ticket', ticketFromSegments(tickets)); }, []); const validate = useMemo( () => composeValidator({ ticket: buildPatqValidator([ validateExactly(ticket, 'Does not match expected master ticket.'), ]), }), [ticket] ); const initialValues = useMemo( () => ({ ticket: STUB_VERIFY_TICKET ? ticket : undefined, ticket0: STUB_VERIFY_TICKET ? ticketSegments[0] : undefined, ticket1: STUB_VERIFY_TICKET ? ticketSegments[1] : undefined, ticket2: STUB_VERIFY_TICKET ? ticketSegments[2] : undefined, ticket3: STUB_VERIFY_TICKET ? ticketSegments[3].slice(0, 5) : undefined, }), [STUB_VERIFY_TICKET, ticket, ticketSegments] ); const goToTransfer = useCallback(async () => { setIsIn(false); await timeout(DEFAULT_FADE_TIMEOUT); // Pause for UI fade animation push(names.TRANSFER); }, [names.TRANSFER, push, setIsIn]); const goBack = useCallback(async () => { setIsIn(false); await timeout(DEFAULT_FADE_TIMEOUT); // Pause for UI fade animation push(names.DOWNLOAD, { skipAnimationDelay: true }); }, [names.DOWNLOAD, push, setIsIn]); const header = useMemo(() => { return ( ); }, []); useFadeIn(); return ( {({ handleSubmit, valid }: any) => ( {showError && ( {/* this is a flexbox placeholder to balance the error message below*/} )} {ticketSegments.map((segment, i) => { return ( {i < ticketSegments.length - 1 ? ( — ) : null} ); })} {showError && ( The Master Ticket you entered is incorrect. )} Confirm Backup )} ); }; export default MasterKeyConfirm;