رفتن به محتوای اصلی
نیکاوب
محصول دانلودی برای توسعه‌دهنده‌ها

ورودی شماره موبایل ایرانی برای 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.error
false · '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
React
'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>
    </>
  )
}
Next.js با Server Action
// 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. پیام‌های خطا، مثال‌ها و صفحه دمو فارسی‌اند و همین صفحه هم همه قابلیت‌ها را به فارسی نشان می‌دهد.

یک بار بخرید، در همه فرم‌ها استفاده کنید

۴۳۹٬۰۰۰ تومان، پرداخت یک‌باره، دانلود فوری · نسخه ۱.۰.۰

خرید و دانلود