feat: implement MobileInput component for standardized mobile number input and update related forms to use it
This commit is contained in:
@@ -1,3 +1,5 @@
|
||||
import { z } from 'zod';
|
||||
|
||||
export function formatRial(amount: number): string {
|
||||
return new Intl.NumberFormat('fa-IR').format(amount) + ' تومان';
|
||||
}
|
||||
@@ -46,3 +48,35 @@ export function maskMobile(mobile: string): string {
|
||||
export function cn(...classes: (string | undefined | null | false)[]): string {
|
||||
return classes.filter(Boolean).join(' ');
|
||||
}
|
||||
|
||||
// تبدیل ارقام فارسی/عربی به انگلیسی + حذف هر کاراکتر غیرعددی.
|
||||
export function toEnglishDigits(input: string): string {
|
||||
if (!input) return '';
|
||||
return input
|
||||
.replace(/[۰-۹]/g, (d) => String(d.charCodeAt(0) - 0x06f0))
|
||||
.replace(/[٠-٩]/g, (d) => String(d.charCodeAt(0) - 0x0660));
|
||||
}
|
||||
|
||||
// فقط ارقام انگلیسی، حداکثر ۱۱ رقم (برای فیلد موبایل).
|
||||
export function sanitizeMobileInput(input: string): string {
|
||||
return toEnglishDigits(input).replace(/\D/g, '').slice(0, 11);
|
||||
}
|
||||
|
||||
// regex شماره موبایل ایران
|
||||
export const IRAN_MOBILE_RE = /^09\d{9}$/;
|
||||
|
||||
export function isValidIranMobile(input: string): boolean {
|
||||
return IRAN_MOBILE_RE.test(toEnglishDigits(input || ''));
|
||||
}
|
||||
|
||||
// schema قابلاستفادهی مشترک برای شماره موبایل ایران (ارقام فارسی/عربی را هم میپذیرد و نرمال میکند).
|
||||
export const iranMobileSchema = z
|
||||
.string()
|
||||
.transform((v) => toEnglishDigits(v).replace(/\D/g, ''))
|
||||
.refine((v) => IRAN_MOBILE_RE.test(v), 'شماره موبایل باید ۱۱ رقم و با 09 شروع شود');
|
||||
|
||||
// نسخهی اختیاری (خالی یا معتبر) برای فیلدهای غیرالزامی.
|
||||
export const iranMobileOptionalSchema = z
|
||||
.string()
|
||||
.transform((v) => toEnglishDigits(v).replace(/\D/g, ''))
|
||||
.refine((v) => v === '' || IRAN_MOBILE_RE.test(v), 'شماره موبایل نامعتبر است');
|
||||
|
||||
Reference in New Issue
Block a user