import type { UseFormRegisterReturn } from 'react-hook-form'; import { digitsOnly, toEnglishDigits } from './utils'; /** * فیلدهای عددی React Hook Form: ارقام فارسی/عربی را حین تایپ به لاتین تبدیل می‌کند. * * چرا `type="text"`؟ چون `type="number"` روی ارقام فارسی مقدار را نامعتبر می‌داند * و `e.target.value` رشتهٔ خالی برمی‌گرداند — یعنی داده از دست می‌رود و هیچ * onChange‌ای نجاتش نمی‌دهد. */ type NumericFieldProps = UseFormRegisterReturn & { type: 'text'; inputMode: 'numeric'; dir: 'ltr'; }; function wrap( reg: UseFormRegisterReturn, normalize: (raw: string) => string, ): NumericFieldProps { return { ...reg, type: 'text', inputMode: 'numeric', dir: 'ltr', onChange: (event: { target: any; type?: any }) => { event.target.value = normalize(String(event.target.value ?? '')); return reg.onChange(event); }, }; } /** فقط ارقام لاتین — برای موبایل، کد ملی، مبلغ، درصد، تعداد. */ export function numericField(reg: UseFormRegisterReturn, maxDigits?: number): NumericFieldProps { return wrap(reg, (raw) => digitsOnly(raw, maxDigits)); } /** * فقط ترجمهٔ رقم؛ جداکننده‌ها و حروف حفظ می‌شوند — برای شبا (`IR…`) و * تلفن ثابت (`021-1234…`). */ export function latinDigitsField(reg: UseFormRegisterReturn): NumericFieldProps { return wrap(reg, toEnglishDigits); }