Introduces field-specific validation messages so toasts name the exact field and rule that failed instead of a catch-all "tous les champs sont requis".
25 lines
942 B
TypeScript
25 lines
942 B
TypeScript
import { type } from 'arktype'
|
|
|
|
export const MAX_TRANSACTION_AMOUNT = 1_000_000
|
|
|
|
export const transactionFormSchema = type({
|
|
name: 'unknown',
|
|
amount: 'unknown',
|
|
payBy: 'unknown'
|
|
}).narrow((data, ctx) => {
|
|
if (typeof data.name !== 'string' || data.name.trim().length === 0) {
|
|
ctx.reject({ message: 'validation.transaction_name_required', path: ['name'] })
|
|
}
|
|
if (typeof data.amount !== 'number' || Number.isNaN(data.amount)) {
|
|
ctx.reject({ message: 'validation.amount_required', path: ['amount'] })
|
|
} else if (data.amount <= 0) {
|
|
ctx.reject({ message: 'validation.amount_must_be_positive', path: ['amount'] })
|
|
} else if (data.amount > MAX_TRANSACTION_AMOUNT) {
|
|
ctx.reject({ message: 'validation.amount_too_large', path: ['amount'] })
|
|
}
|
|
if (typeof data.payBy !== 'string' || data.payBy.length === 0) {
|
|
ctx.reject({ message: 'validation.pay_by_required', path: ['payBy'] })
|
|
}
|
|
return !ctx.hasError()
|
|
})
|