on 6526dd7 help sign in
bridge/src/form/validators.js
104 lines 3.0 kB history raw
1import { some } from 'lodash';
3import {
4 validateNotEmpty,
5 validateTicket,
6 kDefaultValidator,
7 validateMnemonic,
8 validatePoint,
9 validateMaximumPatpByteLength,
10 validateOneOf,
11 validateHexString,
12 validateHexLength,
13 validateEthereumAddress,
14 validateGreaterThan,
15 validateEmail,
16} from 'lib/validators';
17import { compose } from 'lib/lib';
19const buildValidator = (
20 validators = [],
21 fn = () => undefined
22) => async value => {
23 return (
24 compose(
25 ...validators,
26 kDefaultValidator
27 )(value).error || (await fn(value))
28 );
29};
31// error object has errors if some of its fields are
32// 1) an array with any defined values
33// 2) any defined values
34export const hasErrors = iter =>
35 some(iter, v => (Array.isArray(v) ? hasErrors(v) : v !== undefined));
37export const buildTicketValidator = (validators = []) =>
38 buildValidator([...validators, validateTicket, validateNotEmpty]);
39export const buildMnemonicValidator = () =>
40 buildValidator([validateMnemonic, validateNotEmpty]);
41export const buildCheckboxValidator = mustBe =>
42 buildValidator([
43 validateOneOf(mustBe !== undefined ? [mustBe] : [true, false]),
44 ]);
45export const buildPassphraseValidator = () => buildValidator([]);
46// TODO: validate hdpath format
47export const buildHdPathValidator = () => buildValidator([validateNotEmpty]);
48export const buildPointValidator = (size = 4, validate) =>
49 buildValidator(
50 [validatePoint, validateMaximumPatpByteLength(size), validateNotEmpty],
51 validate
52 );
53export const buildSelectValidator = options =>
54 buildValidator([validateOneOf(options.map(option => option.value))]);
55export const buildHexValidator = length =>
56 buildValidator([
57 validateHexLength(length),
58 validateHexString,
59 validateNotEmpty,
60 ]);
61export const buildUploadValidator = () => buildValidator([validateNotEmpty]);
62export const buildAddressValidator = () =>
63 buildValidator([
64 validateEthereumAddress,
65 validateHexLength(40),
66 validateHexString,
67 validateNotEmpty,
68 ]);
69export const buildNumberValidator = (min = 0) =>
70 buildValidator([validateGreaterThan(min)]);
71export const buildEmailValidator = () =>
72 buildValidator([validateEmail, validateNotEmpty]);
74// the default form validator just returns field-level validations
75const kDefaultFormValidator = (values, errors) => errors;
76export const composeValidator = (
77 fieldValidators = {},
78 formValidator = kDefaultFormValidator
79) => {
80 const names = Object.keys(fieldValidators);
82 const fieldLevelValidators = names.map(name => value =>
83 fieldValidators[name](value)
84 );
86 const fieldLevelValidator = async values => {
87 const errors = await Promise.all(
88 names.map((name, i) => fieldLevelValidators[i](values[name]))
89 );
91 return names.reduce(
92 (memo, name, i) => ({
93 ...memo,
94 [name]: errors[i],
95 }),
96 {}
97 );
98 };
100 return async values => {
101 const errors = await fieldLevelValidator(values);
102 return await formValidator(values, errors);
103 };
104};