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 'errors:required' } if (error.keyword === 'format') { if (error.params['format'] === 'email') { return 'errors:invalid-email' } return 'errors:invalid' } return `errors:${error.keyword}` } return 'errors:invalid' } export type GetErrorTranslation = ( error: Error | undefined ) => string | undefined export type GetFirstErrorTranslation = ( errors: Error[] | undefined ) => string | undefined export interface UseFormTranslationResult { getErrorTranslation: GetErrorTranslation getFirstErrorTranslation: GetFirstErrorTranslation } export const useFormTranslation = (): UseFormTranslationResult => { const { t } = useTranslation() const getErrorTranslation: GetErrorTranslation = (error) => { if (error != null) { return t(getErrorTranslationKey(error)).replace( '{expected}', error?.params?.['limit'] ) } return undefined } const getFirstErrorTranslation: GetFirstErrorTranslation = (errors) => { if (errors != null) { return getErrorTranslation(errors[0]) } return undefined } return { getFirstErrorTranslation, getErrorTranslation } }