Skip to content
Clone
eeff292
41 lines 1.6 KB
import { t } from '@/shared/i18n'
export const emailError = (email: string) =>
/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email) && new TextEncoder().encode(email).length <= 254
? ''
: t('validation.email.invalid')
// 与后端 PasswordPolicy 默认档(src/config/auth.rs)对齐:
// ≥8 位且含大写、小写、数字,避免用户提交后才收到服务端报错。
export const passwordError = (value: string) => {
if (value.length < 8) return t('validation.password.short')
if (!/[A-Z]/.test(value) || !/[a-z]/.test(value) || !/[0-9]/.test(value)) {
return t('validation.password.weak')
}
return ''
}
export const usernameError = (value: string) =>
/^[a-zA-Z0-9_.-]{1,64}$/.test(value) ? '' : t('validation.username.invalid')
export const normalizeEmail = (value: string) => value.trim().toLowerCase()
export function birthError(year: string, month: string, day: string) {
if (!year || !month || !day) return t('validation.birth.incomplete')
const date = new Date(Date.UTC(Number(year), Number(month) - 1, Number(day)))
const today = new Date()
if (
Number(year) < 1900 ||
date.getUTCFullYear() !== Number(year) ||
date.getUTCMonth() !== Number(month) - 1 ||
date.getUTCDate() !== Number(day) ||
date > today
)
return t('validation.birth.invalid')
const age =
today.getUTCFullYear() -
Number(year) -
(today.getUTCMonth() + 1 < Number(month) ||
(today.getUTCMonth() + 1 === Number(month) && today.getUTCDate() < Number(day))
? 1
: 0)
return age >= 13 ? '' : t('validation.birth.underage')
}