52 lines
1.3 KiB
TypeScript
52 lines
1.3 KiB
TypeScript
import useTranslation from 'next-translate/useTranslation'
|
|
import type { Error } from 'react-component-form'
|
|
|
|
const knownErrorKeywords = ['minLength', 'maxLength', 'format']
|
|
|
|
const getErrorTranslationKey = (error: Error): string => {
|
|
if (knownErrorKeywords.includes(error?.keyword)) {
|
|
if (
|
|
error.keyword === 'minLength' &&
|
|
typeof error.data === 'string' &&
|
|
error.data.length === 0
|
|
) {
|
|
return 'common:required'
|
|
}
|
|
if (error.keyword === 'format') {
|
|
if (error.params['format'] === 'email') {
|
|
return 'common:invalid-email'
|
|
}
|
|
return 'common:invalid'
|
|
}
|
|
return `common:${error.keyword}`
|
|
}
|
|
return 'common:invalid'
|
|
}
|
|
|
|
export const useFormTranslation = () => {
|
|
const { t } = useTranslation()
|
|
|
|
const getErrorTranslation = (
|
|
error: Error | undefined
|
|
): string | undefined => {
|
|
if (error != null) {
|
|
return t(getErrorTranslationKey(error)).replace(
|
|
'{expected}',
|
|
error?.params?.['limit']
|
|
)
|
|
}
|
|
return undefined
|
|
}
|
|
|
|
const getFirstErrorTranslation = (
|
|
errors: Error[] | undefined
|
|
): string | undefined => {
|
|
if (errors != null) {
|
|
return getErrorTranslation(errors[0])
|
|
}
|
|
return undefined
|
|
}
|
|
|
|
return { getFirstErrorTranslation, getErrorTranslation }
|
|
}
|