on master help sign in
login: improve shard form input handling
e1fb7c6Fang
src/form/validators.js+3
@@ -3,6 +3,7 @@ import { some } from 'lodash';
3import {
3import {
4 validateNotEmpty,
4 validateNotEmpty,
5 validatePatq,
5 validatePatq,
6+ validateShard,
6 validateMnemonic,
7 validateMnemonic,
7 validateHdPath,
8 validateHdPath,
8 validatePoint,
9 validatePoint,
@@ -62,6 +63,8 @@ export const hasErrors = iter =>
62
63
63export const buildPatqValidator = (validators = []) =>
64export const buildPatqValidator = (validators = []) =>
64 buildValidator([validateNotEmpty, validatePatq, ...validators]);
65 buildValidator([validateNotEmpty, validatePatq, ...validators]);
66+export const buildShardValidator = (validators = []) =>
67+ buildValidator([validateShard, ...validators]);
65export const buildAnyMnemonicValidator = () =>
68export const buildAnyMnemonicValidator = () =>
66 buildValidator([validateNotEmpty]);
69 buildValidator([validateNotEmpty]);
67export const buildMnemonicValidator = () =>
70export const buildMnemonicValidator = () =>
src/lib/validators.js+10
@@ -65,6 +65,16 @@ export const validatePatq = v => {
65 }
65 }
66};
66};
67
67
68+export const validateShard = v => {
69+ try {
70+ if (v !== undefined && v !== '' && !ob.isValidPatq(v)) {
71+ throw new Error();
72+ }
73+ } catch {
74+ return 'This is not a valid shard.';
75+ }
76+};
77+
68export const validateOneOf = (options = []) => v =>
78export const validateOneOf = (options = []) => v =>
69 !includes(options, v) && 'Is not a valid option.';
79 !includes(options, v) && 'Is not a valid option.';
70
80
src/views/Login/Ticket.js+17−4
@@ -30,6 +30,7 @@ import {
30 composeValidator,
30 composeValidator,
31 buildCheckboxValidator,
31 buildCheckboxValidator,
32 buildPatqValidator,
32 buildPatqValidator,
33+ buildShardValidator,
33 buildPassphraseValidator,
34 buildPassphraseValidator,
34 buildPointValidator,
35 buildPointValidator,
35} from 'form/validators';
36} from 'form/validators';
@@ -107,6 +108,14 @@ export default function Ticket({ className, goHome }) {
107 if (errors.shard1 || errors.shard2 || errors.shard3) {
108 if (errors.shard1 || errors.shard2 || errors.shard3) {
108 return errors;
109 return errors;
109 }
110 }
111+ const empty = ['shard1', 'shard2', 'shard3'].filter(s => !values[s]);
112+ if (empty.length > 1) {
113+ let errors = {};
114+ empty.map(s => {
115+ errors[s] = 'Please provide at least two out of three shards.';
116+ });
117+ return errors;
118+ }
110 } else {
119 } else {
111 if (errors.ticket) {
120 if (errors.ticket) {
112 return errors;
121 return errors;
@@ -117,7 +126,11 @@ export default function Ticket({ className, goHome }) {
117 const onSubmit = useCallback(
126 const onSubmit = useCallback(
118 async values => {
127 async values => {
119 const ticket = values.useShards
128 const ticket = values.useShards
129+ ? kg.combine(
120− ? kg.combine([values.shard1, values.shard2, values.shard3])
130+ [values.shard1, values.shard2, values.shard3].map(v =>
131+ v === '' ? undefined : v
132+ )
133+ )
121 : values.ticket;
134 : values.ticket;
122
135
123 try {
136 try {
@@ -177,9 +190,9 @@ export default function Ticket({ className, goHome }) {
177 useShards: buildCheckboxValidator(),
190 useShards: buildCheckboxValidator(),
178 point: buildPointValidator(4),
191 point: buildPointValidator(4),
179 ticket: buildPatqValidator(),
192 ticket: buildPatqValidator(),
180− shard1: buildPatqValidator(),
193+ shard1: buildShardValidator(),
181− shard2: buildPatqValidator(),
194+ shard2: buildShardValidator(),
182− shard3: buildPatqValidator(),
195+ shard3: buildShardValidator(),
183 ticketHidden: buildCheckboxValidator(),
196 ticketHidden: buildCheckboxValidator(),
184 passphrase: buildPassphraseValidator(),
197 passphrase: buildPassphraseValidator(),
185 },
198 },