@@ -1,20 +1,37 @@
1import React, { useMemo } from 'react';
1import React, { useMemo } from 'react';
2import { Input, AccessoryIcon } from 'indigo-react';
2import { Input, AccessoryIcon } from 'indigo-react';
3import { useField } from 'react-final-form';
3import { useField } from 'react-final-form';
5 validateNotEmpty,
6 validateNotEmpty,
6 validateTicket,
7 validateTicket,
7 kDefaultValidator,
8 kDefaultValidator,
8} from 'lib/validators';
10} from 'lib/validators';
9import { compose } from 'lib/lib';
11import { compose } from 'lib/lib';
12+import { prependSig } from 'lib/transformers';
13+import { DEFAULT_HD_PATH } from 'lib/wallet';
15+// TODO: why is `validate` called when routing away? new props?
16+// active not true: https://github.com/final-form/react-final-form/issues/558
18+const kEmptyValidators = []; // necessary for referential stability
19+const kEmptyTransformers = []; // also for referential stability
21+const PLACEHOLDER_POINT = '~sampel-ponnym';
22+const PLACEHOLDER_HD_PATH = DEFAULT_HD_PATH;
23+const PLACEHOLDER_MNEMONIC =
24+ 'example crew supreme gesture quantum web media hazard theory mercy wing kitten';
11const PLACEHOLDER_TICKET = '~sampel-ticlyt-migfun-falmel';
25const PLACEHOLDER_TICKET = '~sampel-ticlyt-migfun-falmel';
26+const PLACEHOLDER_ADDRESS = '0x12345abcdeDB11D175F123F6891AA64F01c24F7d';
27+const PLACEHOLDER_PRIVATE_KEY =
28+ '0x12345abcdee6beb2f323fab48b432925c9785808d33a6ca6d7ba00b45e9370c3';
13const buildValidator = (
30const buildValidator = (
14 validators = [],
31 validators = [],
15 fn = x => undefined
32 fn = x => undefined
16) => async value => {
33) => async value => {
17− console.log('validating', value);
34+ // console.log('validating:', value);
20 ...validators,
37 ...validators,
@@ -24,19 +41,27 @@ const buildValidator = (
26const kTicketValidators = [validateTicket, validateNotEmpty];
43const kTicketValidators = [validateTicket, validateNotEmpty];
27−export function TicketInput({ name, validators = [], config = {}, ...rest }) {
44+export function TicketInput({
46+ validators = kEmptyValidators,
47+ transformers = kEmptyTransformers,
28 const { valid, error, validating } = useField(name, {
51 const { valid, error, validating } = useField(name, {
29 subscription: { error: true, validating: true },
52 subscription: { error: true, validating: true },
32− const validate = useMemo(
55+ const _validate = useMemo(
34− buildValidator([...validators, ...kTicketValidators], config.validate),
56+ () => buildValidator([...validators, ...kTicketValidators], validate),
35− [config.validate, validators]
57+ [validate, validators]
60+ const _format = (value, name) => prependSig(value);
40 name={name}
65 name={name}
41 placeholder={PLACEHOLDER_TICKET}
66 placeholder={PLACEHOLDER_TICKET}
42 accessory={
67 accessory={
@@ -48,9 +73,71 @@ export function TicketInput({ name, validators = [], config = {}, ...rest }) {
48 <AccessoryIcon.Success />
73 <AccessoryIcon.Success />
51− config={{ validate }}
76+ config={{ validate: _validate, format: _format }}
83+const kMnemonicValidators = [validateMnemonic, validateNotEmpty];
84+export function MnemonicInput({
86+ validators = kEmptyValidators,
87+ transformers = kEmptyTransformers,
91+ const _validate = useMemo(
92+ () => buildValidator([...validators, ...kMnemonicValidators], validate),
93+ [validate, validators]
100+ placeholder={PLACEHOLDER_MNEMONIC}
101+ config={{ validate: _validate }}
53 {...rest}
104 {...rest}
109+const kHdPathValidators = [validateNotEmpty];
110+export function HdPathInput({
112+ validators = kEmptyValidators,
113+ transformers = kEmptyTransformers,
117+ const _validate = useMemo(
118+ () => buildValidator([...validators, ...kHdPathValidators], validate),
119+ [validate, validators]
126+ placeholder={PLACEHOLDER_HD_PATH}
127+ config={{ validate: _validate }}
134+export function PassphraseInput({ ...rest }) {
138+ placeholder="Passphrase"