aboutsummaryrefslogtreecommitdiffstats
path: root/src/helpers/validation-helpers.ts
diff options
context:
space:
mode:
Diffstat (limited to 'src/helpers/validation-helpers.ts')
-rw-r--r--src/helpers/validation-helpers.ts96
1 files changed, 96 insertions, 0 deletions
diff --git a/src/helpers/validation-helpers.ts b/src/helpers/validation-helpers.ts
new file mode 100644
index 000000000..23c297443
--- /dev/null
+++ b/src/helpers/validation-helpers.ts
@@ -0,0 +1,96 @@
1import { defineMessages } from 'react-intl';
2import isEmail from 'validator/lib/isEmail';
3
4const messages = defineMessages({
5 required: {
6 id: 'validation.required',
7 defaultMessage: '{field} is required',
8 },
9 email: {
10 id: 'validation.email',
11 defaultMessage: '{field} is not valid',
12 },
13 url: {
14 id: 'validation.url',
15 defaultMessage: '{field} is not a valid URL',
16 },
17 minLength: {
18 id: 'validation.minLength',
19 defaultMessage: '{field} should be at least {length} characters long',
20 },
21 oneRequired: {
22 id: 'validation.oneRequired',
23 defaultMessage: 'At least one is required',
24 },
25});
26
27export function required({ field }) {
28 const isValid = field.value.trim() !== '';
29 return [
30 isValid,
31 (window as any).ferdi.intl.formatMessage(messages.required, {
32 field: field.label,
33 }),
34 ];
35}
36
37export function email({ field }) {
38 const value = field.value.trim();
39 const isValid = isEmail(value);
40 return [
41 isValid,
42 (window as any).ferdi.intl.formatMessage(messages.email, {
43 field: field.label,
44 }),
45 ];
46}
47
48export function url({ field }) {
49 const value = field.value.trim();
50 let isValid = false;
51
52 isValid =
53 value !== ''
54 ? Boolean(
55 // eslint-disable-next-line unicorn/better-regex
56 /(^|[\s.:;?\-\]<(])(https?:\/\/[-\w;/?:@&=+$|_.!~*|'()[\]%#,☺]+[\w/#](\(\))?)(?=$|[\s',|().:;?\-[\]>)])/i.test(
57 value,
58 ),
59 )
60 : true;
61
62 return [
63 isValid,
64 (window as any).ferdi.intl.formatMessage(messages.url, {
65 field: field.label,
66 }),
67 ];
68}
69
70export function minLength(length: number) {
71 return ({ field }) => {
72 let isValid = true;
73 if (field.touched) {
74 isValid = field.value.length >= length;
75 }
76 return [
77 isValid,
78 (window as any).ferdi.intl.formatMessage(messages.minLength, {
79 field: field.label,
80 length,
81 }),
82 ];
83 };
84}
85
86export function oneRequired(targets: string[]) {
87 return ({ field, form }) => {
88 const invalidFields = targets.filter(target => form.$(target).value === '');
89 return [
90 targets.length !== invalidFields.length,
91 (window as any).ferdi.intl.formatMessage(messages.required, {
92 field: field.label,
93 }),
94 ];
95 };
96}