1import React, { useCallback, useMemo, useRef } from 'react';
2import { Just } from 'folktale/maybe';
3import cn from 'classnames';
4import * as azimuth from 'azimuth-js';
5import * as kg from 'urbit-key-generation';
6import { Grid, CheckboxInput, Flex, ToggleInput } from 'indigo-react';
7import { FORM_ERROR } from 'final-form';
9import { useNetwork } from 'store/network';
10import { useWallet } from 'store/wallet';
11import { usePointCursor } from 'store/pointCursor';
13import * as need from 'lib/need';
14import { WALLET_TYPES, urbitWalletFromTicket } from 'lib/wallet';
15import useImpliedPoint from 'lib/useImpliedPoint';
16import useLoginView from 'lib/useLoginView';
17import patp2dec from 'lib/patp2dec';
18import timeout from 'lib/timeout';
20import BridgeForm from 'form/BridgeForm';
21import Condition from 'form/Condition';
22import { TicketInput, PassphraseInput, PointInput } from 'form/Inputs';
25 buildCheckboxValidator,
27 buildPassphraseValidator,
29} from 'form/validators';
30import FormError from 'form/FormError';
31import SubmitButton from 'form/SubmitButton';
32import { WARNING } from 'form/helpers';
34export default function Ticket({ className, goHome }) {
35 useLoginView(WALLET_TYPES.TICKET);
37 const { contracts } = useNetwork();
38 const { setUrbitWallet } = useWallet();
39 const { setPointCursor } = usePointCursor();
40 const impliedPoint = useImpliedPoint();
41 const didWarn = useRef(false);
43 const validateForm = useCallback((values, errors) => {
44 didWarn.current = false;
50 if (values.useShards) {
51 if (errors.shard1 || errors.shard2 || errors.shard3) {
61 const onSubmit = useCallback(
63 const ticket = values.useShards
64 ? kg.combine([values.shard1, values.shard2, values.shard3])
68 const _contracts = need.contracts(contracts);
69 const point = patp2dec(values.point);
71 await timeout(16); // allow ui events to flush
72 const urbitWallet = await urbitWalletFromTicket(
78 const [isOwner, isTransferProxy] = await Promise.all([
79 azimuth.azimuth.isOwner(
82 urbitWallet.ownership.keys.address
84 azimuth.azimuth.isTransferProxy(
87 urbitWallet.ownership.keys.address
91 const noPermissions = !isOwner && !isTransferProxy;
93 if (noPermissions && !didWarn.current) {
94 didWarn.current = true;
97 'This wallet is not the owner or transfer proxy for this point.',
101 setUrbitWallet(Just(urbitWallet));
102 setPointCursor(Just(patp2dec(values.point)));
104 console.error(error);
106 [FORM_ERROR]: `Unable to derive wallet from ${
107 values.useShards ? 'shards' : 'ticket'
112 [contracts, setPointCursor, setUrbitWallet]
115 const validate = useMemo(
119 useAdvanced: buildCheckboxValidator(),
120 usePassphrase: buildCheckboxValidator(),
121 useShards: buildCheckboxValidator(),
122 point: buildPointValidator(4),
123 ticket: buildPatqValidator(),
124 shard1: buildPatqValidator(),
125 shard2: buildPatqValidator(),
126 shard3: buildPatqValidator(),
127 showTicket: buildCheckboxValidator(),
128 passphrase: buildPassphraseValidator(),
135 const initialValues = useMemo(
137 point: impliedPoint || '',
147 <Grid className={cn('mt4', className)}>
152 initialValues={initialValues}>
153 {({ handleSubmit, values, submitting }) => (
155 <Grid.Item full as={PointInput} name="point" />
157 <Condition when="useShards" is={false}>
161 type={values.showTicket ? 'text' : 'password'}
163 label="Master Ticket"
167 <Condition when="useShards" is={true}>
171 type={values.showTicket ? 'text' : 'password'}
178 type={values.showTicket ? 'text' : 'password'}
185 type={values.showTicket ? 'text' : 'password'}
191 <Grid.Item full as={CheckboxInput} name="showTicket" label="Show" />
193 <Condition when="usePassphrase" is={true}>
198 label="Wallet Passphrase"
202 <Grid.Item full as={FormError} />
204 <Grid.Item full as={SubmitButton} handleSubmit={handleSubmit}>
214 <Grid.Item full as={Flex} justify="between">
221 <Condition when="useAdvanced" is={true}>
222 <Flex.Item as={Flex}>
keysesc to close
- j k
- move down, up
- enter
- open
- esc
- back, or up a level
- 1 2 3 4
- readme, files, commits, refs
- /
- filter
- y
- copy the clone command
- c
- compare the chosen commit with another (or shift-click both)
- ?
- show or hide this list