ورودی شماره موبایل ایرانی برای React و جاوااسکریپت
شماره موبایل مهمترین فیلد هر فرم ثبتنام و خرید است و بیشتر از هر فیلدی خراب میشود. کاربر هر طور بنویسد، با ارقام فارسی یا انگلیسی، با ۰۹ یا +۹۸ یا ۰۰۹۸، تایپ کند یا از جایی کپی کند، این فیلد شماره را مرتب نشان میدهد، نشانگر را سر جایش نگه میدارد و به کد شما یک مقدار یکدست میدهد: +989121234567.
- بدون هیچ وابستگی
- TypeScript کامل
- React، Next.js و جاوااسکریپت خالص
- کامپوننت کامل ۴٫۵ کیلوبایت فشرده
- ۱۴۶ تست خودکار
- پیامهای خطای فارسی
پرداخت یکباره از درگاه بانکی، دانلود فوری بعد از پرداخت.
onChange → value''detail.national''detail.status- خالی
empty
سه ایرادی که فیلد شماره موبایل تقریباً همیشه دارد
ارقام فارسی رد میشوند
کاربر شماره را با کیبورد فارسی مینویسد: «۰۹۱۲…». اعتبارسنجیای که با \d نوشته شده آن را قبول نمیکند و کاربر نمیفهمد ایراد کجاست.
یک نفر، سه حساب
یکی 09121234567 مینویسد، یکی +989121234567 و یکی ۹۱۲۱۲۳۴۵۶۷. اگر همه به یک شکل ذخیره نشوند، یک شماره سه بار ثبتنام میکند و پیامک به نصفشان نمیرسد.
نشانگری که فرار میکند
فیلدی که موقع تایپ فاصله میگذارد، معمولاً با هر رقم نشانگر را به آخر شماره میبرد و Backspace کنار فاصله کاری نمیکند. کاربر وسط شماره نمیتواند یک رقم را درست کند.
همان کامپوننتی که دانلود میکنید
گزینهها را عوض کنید، شماره را هر طور میخواهید بنویسید و مقداری را که به کد شما میرسد ببینید.
شکل نمایش وقتی اعمال میشود که کاربر از فیلد بیرون بیاید؛ وسط تایپ، پیششمارهای که خودش نوشته دست نمیخورد.
value''detail.e164 · detail.national'' · ''detail.valid · detail.errorfalse · 'empty'
<IranianPhoneInput
value={mobile}
onChange={(value, detail) => setMobile(value)}
/>اینها را امتحان کنید
- با کیبورد فارسی بنویسید؛ ارقام فارسی و انگلیسی هر دو خوانده میشوند.
- وسط شماره رقم اضافه یا پاک کنید؛ نشانگر کنار همان رقم میماند.
- درست بعد از فاصله Backspace بزنید؛ رقم قبل از فاصله پاک میشود.
- +۹۸ یا ۰۰۹۸ بنویسید و از فیلد بیرون بیایید؛ شماره یکدست میشود.
- «شماره من: ۰۹۱۲-۱۲۳-۴۵۶۷» را کپی و Paste کنید.
- همه شماره را انتخاب و کپی کنید؛ ارقام انگلیسی و بدون فاصله کپی میشود.
خطا وقتی که لازم است، نه وسط تایپ
هر وضعیت روی کامپوننت با data-status مشخص است و صفحهخوانها پیام خطا را همان لحظه میخوانند.
خالی
هنوز چیزی ننوشته.
درست
کامل و معتبر.
ناقص، بعد از خروج از فیلد
وسط تایپ خطایی نشان داده نمیشود؛ فقط وقتی کاربر فیلد را نیمهکاره رها کند.
شماره ثابت
با ۰۹ شروع نمیشود، پس همان وسط تایپ خطا میدهد.
خطا از سرور
با ویژگی error، مثلاً شمارهای که قبلاً ثبت شده.
غیرفعال و فقطخواندنی
فیلد فقطخواندنی هنوز قابل انتخاب و کپی است.
فرم با شماره ناقص ارسال نمیشود
مرورگر جلوی ارسال را میگیرد و پیام فارسی را نشان میدهد. چیزی که به سرور میرسد همیشه یک شکل دارد.
اعتبارسنجی روی سرور، با همان قواعد
همان تابعهایی که فیلد با آنها کار میکند، بدون مرورگر: در Server Action، API یا اسکریپت ورود داده.
parseIranianPhone(text){ valid: true, error: null, e164: '+989121234567' }formatIranianMobile(text, { fallback: '—' })- ۰۹۱۲ ۱۲۳ ۴۵۶۷
نصب و چند خط کد
# the .tgz from the download, copied into your project
npm install ./vendor/nikaweb-iranian-phone-input-1.0.0.tgz'use client'
import { useState } from 'react'
import { IranianPhoneInput } from '@nikaweb/iranian-phone-input/react'
import '@nikaweb/iranian-phone-input/styles.css'
export function MobileField() {
const [mobile, setMobile] = useState('')
const [valid, setValid] = useState(false)
return (
<>
<label htmlFor="mobile">شماره موبایل</label>
<IranianPhoneInput
id="mobile"
required
value={mobile}
onChange={setMobile} // '+989121234567'
onValidChange={setValid}
/>
<button disabled={!valid}>ارسال کد</button>
</>
)
}// app/signup/page.tsx — a Server Component
import { IranianPhoneInput } from '@nikaweb/iranian-phone-input/react'
import { normalizeIranianMobile } from '@nikaweb/iranian-phone-input'
async function signup(formData: FormData) {
'use server'
const mobile = normalizeIranianMobile(formData.get('mobile'))
if (!mobile) throw new Error('invalid mobile')
// '+989121234567', however it was typed
}
export default function Page() {
return (
<form action={signup}>
<IranianPhoneInput name="mobile" required />
<button>ثبتنام</button>
</form>
)
}<input id="mobile" required>
<input type="hidden" name="mobile" id="mobile-value">
<p id="mobile-error"></p>
<script src="/js/iranian-phone-input.global.js"></script>
<script>
IranianPhone.bindPhoneInput(document.getElementById('mobile'), {
mirror: document.getElementById('mobile-value'),
message: document.getElementById('mobile-error'),
})
</script>چه چیزی دانلود میکنید
- کد منبع کامل TypeScript
- همه ماژولها، قابل تغییر، با توضیح کنار کد. قواعد ویرایش در یک فایل و به شکل تابع خالص.
- ۱۴۶ تست
- اعتبارسنجی، تایپ و حذف وسط شماره، جای نشانگر، Paste و Copy، رفتار کیبورد اندروید، React و رندر سمت سرور.
- نسخه آماده نصب
- فایل tgz برای npm، pnpm و yarn، بهعلاوه ESM، CommonJS، تایپها و نسخه تگ script.
- مستندات
- README، مرجع کامل API و قواعد اعتبارسنجی با همه شکلهای پذیرفته و ردشده، به انگلیسی.
- مثالها و صفحه دمو
- React، Next.js با Server Action، HTML خالص و Node، و یک صفحه دمو که بدون سرور باز میشود.
- استایل پیشفرض
- یک فایل CSS کوچک با متغیرهای قابل تنظیم؛ اختیاری. با Tailwind هم بدون آن کار میکند.
قبل از خرید
بلافاصله بعد از تأیید پرداخت، در همان صفحه دکمه دانلود نمایش داده میشود. لینک تا ۷ روز کار میکند؛ فایل را همان موقع دانلود کنید و نگه دارید.
در هر تعداد پروژه برای خودتان یا مشتریهایتان، تجاری یا غیرتجاری. فروش دوباره پکیج یا انتشار عمومی کد منبعش، مثلاً در npm یا یک مخزن عمومی، مجاز نیست. متن کامل مجوز داخل فایل است.
نه. شکل شماره را بررسی میکند: ۰۹ و ۹ رقم دیگر، با هر پیششمارهای که کاربر نوشته باشد. اینکه شماره روشن است و مال همین کاربر است را فقط یک کد تأیید پیامکی ثابت میکند.
چون پیششمارههای تازه هر چند وقت یک بار اضافه میشوند و شمارهها بین اپراتورها منتقل میشوند. فهرست ثابت پیششمارهها روزی که یک بازه تازه راه بیفتد، شماره مشتری واقعی را رد میکند و هیچ خطایی هم نمیبینید.
بله. کامپوننت از قبل «use client» دارد و در Server Component استفاده میشود. با ویژگی name، مقدار یکدست مستقیم به Server Action میرسد و توابع اعتبارسنجی روی سرور هم اجرا میشوند. برای react-hook-form نمونه Controller در README هست.
بله. تابع bindPhoneInput همین رفتار را روی هر input معمولی میگذارد و نسخه تگ script برای سایتهای بدون ابزار ساخت هم در فایل هست.
README و مرجع API به انگلیسی نوشته شدهاند، مثل بیشتر پکیجهای npm. پیامهای خطا، مثالها و صفحه دمو فارسیاند و همین صفحه هم همه قابلیتها را به فارسی نشان میدهد.
یک بار بخرید، در همه فرمها استفاده کنید
۴۳۹٬۰۰۰ تومان، پرداخت یکباره، دانلود فوری · نسخه ۱.۰.۰
خرید و دانلود