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 } }