aboutsummaryrefslogtreecommitdiffstats
path: root/src/helpers/validation-helpers.ts
blob: 23c297443126332af8a4bba9612009c989aba679 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
import { defineMessages } from 'react-intl';
import isEmail from 'validator/lib/isEmail';

const messages = defineMessages({
  required: {
    id: 'validation.required',
    defaultMessage: '{field} is required',
  },
  email: {
    id: 'validation.email',
    defaultMessage: '{field} is not valid',
  },
  url: {
    id: 'validation.url',
    defaultMessage: '{field} is not a valid URL',
  },
  minLength: {
    id: 'validation.minLength',
    defaultMessage: '{field} should be at least {length} characters long',
  },
  oneRequired: {
    id: 'validation.oneRequired',
    defaultMessage: 'At least one is required',
  },
});

export function required({ field }) {
  const isValid = field.value.trim() !== '';
  return [
    isValid,
    (window as any).ferdi.intl.formatMessage(messages.required, {
      field: field.label,
    }),
  ];
}

export function email({ field }) {
  const value = field.value.trim();
  const isValid = isEmail(value);
  return [
    isValid,
    (window as any).ferdi.intl.formatMessage(messages.email, {
      field: field.label,
    }),
  ];
}

export function url({ field }) {
  const value = field.value.trim();
  let isValid = false;

  isValid =
    value !== ''
      ? Boolean(
          // eslint-disable-next-line unicorn/better-regex
          /(^|[\s.:;?\-\]<(])(https?:\/\/[-\w;/?:@&=+$|_.!~*|'()[\]%#,☺]+[\w/#](\(\))?)(?=$|[\s',|().:;?\-[\]>)])/i.test(
            value,
          ),
        )
      : true;

  return [
    isValid,
    (window as any).ferdi.intl.formatMessage(messages.url, {
      field: field.label,
    }),
  ];
}

export function minLength(length: number) {
  return ({ field }) => {
    let isValid = true;
    if (field.touched) {
      isValid = field.value.length >= length;
    }
    return [
      isValid,
      (window as any).ferdi.intl.formatMessage(messages.minLength, {
        field: field.label,
        length,
      }),
    ];
  };
}

export function oneRequired(targets: string[]) {
  return ({ field, form }) => {
    const invalidFields = targets.filter(target => form.$(target).value === '');
    return [
      targets.length !== invalidFields.length,
      (window as any).ferdi.intl.formatMessage(messages.required, {
        field: field.label,
      }),
    ];
  };
}