@@ -1,14 +1,6 @@
1−import React, { useCallback, useEffect, useRef, useState } from 'react';
1+import React, { useCallback, useMemo, useRef, useState } from 'react';
2import { Just, Nothing } from 'folktale/maybe';
2import { Just, Nothing } from 'folktale/maybe';
11−} from 'indigo-react';
3+import { Grid, Text, H5, Flex, ToggleInput, CheckboxInput } from 'indigo-react';
12import * as azimuth from 'azimuth-js';
4import * as azimuth from 'azimuth-js';
13import { randomHex } from 'web3-utils';
5import { randomHex } from 'web3-utils';
@@ -30,7 +22,6 @@ import { formatDotsWithTime } from 'lib/dateFormat';
30import useEthereumTransaction from 'lib/useEthereumTransaction';
22import useEthereumTransaction from 'lib/useEthereumTransaction';
31import { GAS_LIMITS } from 'lib/constants';
23import { GAS_LIMITS } from 'lib/constants';
32import { addHexPrefix } from 'lib/wallet';
24import { addHexPrefix } from 'lib/wallet';
33−import { useHexInput, useCheckboxInput } from 'lib/useInputs';
34import useKeyfileGenerator from 'lib/useKeyfileGenerator';
25import useKeyfileGenerator from 'lib/useKeyfileGenerator';
36import ViewHeader from 'components/ViewHeader';
27import ViewHeader from 'components/ViewHeader';
@@ -40,6 +31,15 @@ import DownloadKeyfileButton from 'components/DownloadKeyfileButton';
40import InlineEthereumTransaction from 'components/InlineEthereumTransaction';
31import InlineEthereumTransaction from 'components/InlineEthereumTransaction';
41import NoticeBox from 'components/NoticeBox';
32import NoticeBox from 'components/NoticeBox';
36+ buildCheckboxValidator,
40+import BridgeForm from 'form/BridgeForm';
41+import Condition from 'form/Condition';
43const chainKeyProp = name => d =>
43const chainKeyProp = name => d =>
44 d[name] === CURVE_ZERO_ADDR ? Nothing() : Just(d[name]);
44 d[name] === CURVE_ZERO_ADDR ? Nothing() : Just(d[name]);
@@ -163,58 +163,44 @@ export default function AdminNetworkingKeys() {
163 keyfileBind,
163 keyfileBind,
164 } = useSetKeys();
164 } = useSetKeys();
166− const [showNetworkSeedInput, { data: showNetworkSeed }] = useCheckboxInput({
166+ const validateForm = useCallback((values, errors) => {
167− name: 'shownetworkseed',
167+ if (values.useNetworkSeed && errors.networkSeed) {
168− label: 'Use Custom Network Seed',
168+ return errors;
169− inverseLabel: 'Back to Derived Network Seed',
169+ }
170− initialValue: false,
171− disabled: inputsLocked,
174− const [
174+ const validate = useMemo(
175− networkSeedInput,
175+ () =>
176− { pass: validNetworkSeed, data: networkSeed },
176+ composeValidator(
177− { reset: resetNetworkSeed },
177+ {
178− ] = useHexInput({
178+ useNetworkSeed: buildCheckboxValidator(),
179− name: 'networkseed',
179+ networkSeed: buildHexValidator(32),
180− label: 'Network Seed (64 bytes)',
180+ useDiscontinuity: buildCheckboxValidator(),
181− length: 32, // 64 bytes
181+ },
182− disabled: inputsLocked,
182+ validateForm
185− const [
187+ const onValues = useCallback(
186− discontinuityInput,
188+ ({ valid, values, form }) => {
187− { pass: validDiscontinuity, data: isDiscontinuity },
189+ if (valid) {
188− ] = useCheckboxInput({
190+ construct(
189− name: 'discontinuity',
191+ values.useNetworkSeed ? values.networkSeed : undefined,
190− label: 'Trigger New Continuity Era',
192+ values.useDiscontinuity
191− initialValue: false,
193+ );
192− disabled: inputsLocked,
194+ } else {
193− });
195+ unconstruct();
195− useEffect(() => {
198+ if (!values.useNetworkSeed && values.networkSeed) {
196− const nothingOrValidSeed =
199+ form.change('networkSeed', '');
197− !showNetworkSeed || (showNetworkSeed && validNetworkSeed);
200+ }
198− if (nothingOrValidSeed && validDiscontinuity) {
199− construct(networkSeed, isDiscontinuity);
205− unconstruct,
202+ [construct, unconstruct]
206− isDiscontinuity,
203+ );
214− if (!showNetworkSeed) {
217− }, [resetNetworkSeed, showNetworkSeed]);
219 const goRelocate = useCallback(() => push(names.RELOCATE), [push, names]);
205 const goRelocate = useCallback(() => push(names.RELOCATE), [push, names]);
@@ -335,20 +321,48 @@ export default function AdminNetworkingKeys() {
337 {!completed && (
323 {!completed && (
339− <Grid.Item full as={ToggleInput} {...showNetworkSeedInput} />
325+ validate={validate}
340− {showNetworkSeed && (
326+ onValues={onValues}
329+ useNetworkSeed: false,
330+ useDiscontinuity: false,
332+ {({ handleSubmit }) => (
337+ name="useNetworkSeed"
338+ label="Use Custom Network Seed"
339+ inverseLabel="Back to Derived Network Seed"
340+ disabled={inputsLocked}
342+ <Condition when="useNetworkSeed" is={true}>
342− <Grid.Item full as={NoticeBox} className="mb2">
343+ <Grid.Item full as={NoticeBox} className="mb2">
343− When using a custom network seed, you'll need to download your
344+ When using a custom network seed, you'll need to download
344− Arvo keyfile immediately after this transaction is
345+ your Arvo keyfile immediately after this transaction is
345− completed—Multipass does not store your seed.
346+ completed—Multipass does not store your seed.
346− </Grid.Item>
347+ </Grid.Item>
347− <Grid.Item full as={Input} {...networkSeedInput} />
348+ <Grid.Item
352+ label="Network Seed (64 bytes)"
353+ disabled={inputsLocked}
359+ name="useDiscontinuity"
360+ label="Trigger New Continuity Era"
361+ disabled={inputsLocked}
350− <Grid.Item full as={CheckboxInput} {...discontinuityInput} />
365+ </BridgeForm>
354 <Grid.Item
368 <Grid.Item