| 38 | }; |
| 39 | |
| 40 | export const intNumberRangeRule = ( |
| 41 | field: string, |
| 42 | min: number, |
| 43 | max: number = Number.MAX_SAFE_INTEGER, |
| 44 | ) => { |
| 45 | return (value: unknown): string | boolean => { |
| 46 | const hasValue = !!value; |
| 47 | if (!hasValue) { |
| 48 | // this rule only applies if there is a value |
| 49 | return true; |
| 50 | } |
| 51 | |
| 52 | const parsedValue = parseInt(`${value}`, 10); |
| 53 | |
| 54 | if (isNaN(parsedValue) || Number(value) % 1 !== 0) { |
| 55 | return i18n.global.t('forms.rules.requiredIntNumber'); |
| 56 | } |
| 57 | |
| 58 | return parsedValue >= min && parsedValue <= max |
| 59 | ? true |
| 60 | : i18n.global.t('forms.rules.intNumberRange', { field, min, max }); |
| 61 | }; |
| 62 | }; |
| 63 | |
| 64 | export const numberRangeRule = (opts: { decimals?: number; min?: number; max?: number } = {}) => { |
| 65 | return (value: unknown): string | boolean => { |