@akhatmirzo/ui

OtpInput

SMS orqali kelgan bir martalik kodni kiritish: katakchalar, joylash, avtoto'ldirish va qayta yuborish taymeri.

+998 90 *** ** 67 ga yuborildi. Kod: 123456

Import

import { OtpInput, ResendTimer } from '@akhatmirzo/ui';

ResendTimer — OtpInput.ResendTimer sifatida ham mavjud, alohida import qilish shart emas.

Qachon ishlatish

  • Telefon yoki email tasdiqlash, ikki bosqichli kirish — SMS yoki ilovadan kelgan 4–8 xonali kod uchun.
  • Kod to'lishi bilan tekshiring: onComplete oxirgi belgi kiritilganda chaqiriladi — "Tasdiqlash" tugmasi shart emas.
  • Xatoni matn bilan ayting: invalid katakchalarni qizil qiladi va silkitadi, lekin sababini Field ning error prop'ida yozing ("Kod noto'g'ri").
  • Qayta yuborishni taymer bilan bering — ResendTimer foydalanuvchini SMS kelishini kutishga undaydi va serverni ortiqcha so'rovlardan saqlaydi.
  • Parol yoki PIN saqlash uchun emas — belgilar ochiq ko'rinadi.

Tasdiqlash oqimi

Yuqoridagi misolda to'g'ri kod — 123456. Noto'g'ri kod kiritilsa, invalid yoqiladi: katakchalar qizil bo'ladi va guruh yengil silkinadi. Foydalanuvchi qayta yoza boshlaganda xatoni olib tashlang. Kod tasdiqlangach disabled qilib qo'yish mumkin.

VerifyForm.tsx
import { Field, OtpInput } from '@akhatmirzo/ui';
import { useState } from 'react';

async function verifyCode(code: string) {
  const res = await fetch('/api/verify', { method: 'POST', body: JSON.stringify({ code }) });
  return res.ok;
}

export function VerifyForm() {
  const [code, setCode] = useState('');
  const [error, setError] = useState(false);

  return (
    <Field label="Tasdiqlash kodi" error={error ? "Kod noto'g'ri" : undefined}>
      <OtpInput
        value={code}
        onValueChange={(v) => {
          setCode(v);
          setError(false);
        }}
        onComplete={async (v) => setError(!(await verifyCode(v)))}
      />
    </Field>
  );
}

Joylash va SMS'dan to'ldirish

Butun kodni istalgan katakka joylash (Ctrl+V) mumkin — hamma katakcha to'ladi. Birinchi katakchada autocomplete="one-time-code" bor: iOS va Android SMS'dagi kodni klaviatura ustida taklif qiladi.

Uzunlik, tur va guruhlash

length — katakchalar soni (standart 6). type="alphanumeric" harflarni ham qabul qiladi (standart — faqat raqam). groupSize katakchalarni guruhlarga ajratadi: 3 → 123 – 456.

Qiymat: —

Holatlar

invalid — qizil chegara va silkinish (prefers-reduced-motion yoqilgan bo'lsa silkinmaydi). disabled — katakchalar o'chirilgan.

ResendTimer

"Kodni qayta yuborish (0:59)" — taymer tugaguncha bosilmaydi. onResend Promise qaytarsa, u tugaguncha ham bosib bo'lmaydi; keyin taymer qaytadan boshlanadi. Taymer komponent paydo bo'lishi bilan boshlanadi — kod allaqachon yuborilgan deb hisoblanadi.

Props

OtpInput

Qolgan <div> atributlarini (className, aria-label, data-* ...) va ref ni qabul qiladi (ildiz — katakchalar guruhi).

PropTipStandartTavsif
lengthnumber6Katakchalar soni
type'numeric' | 'alphanumeric''numeric'Faqat raqam yoki harf va raqam
valuestring—Kod (boshqariladigan)
defaultValuestring—
onValueChange(value: string) => void—
onComplete(code: string) => void—Oxirgi belgi kiritilganda
invalidboolean—Xato: qizil + silkinish (Field ichida error bo'lsa avtomatik)
disabledboolean—
groupSizenumber—Guruhlash: 3 → 123 – 456
namestring—Forma uchun yashirin maydon nomi
autoFocusboolean—Birinchi katakchaga fokus
labelsOtpInputLabels—{ cell?: (index, length) => string; group?: string }

ResendTimer

Qolgan <button> atributlarini qabul qiladi.

PropTipStandartTavsif
secondsnumber60Kutish vaqti, soniya
onResend() => unknown—Bosilganda; Promise qaytarsa — tugaguncha bosib bo'lmaydi
labels{ resend?: string }{ resend: 'Kodni qayta yuborish' }
disabledboolean—Taymerdan qat'i nazar bosilmaydi

Data atributlari

AtributElementQiymat
data-invalidOtpInputxato bo'lganda mavjud
data-disabledOtpInputdisabled bo'lganda mavjud
data-completeOtpInputbarcha katakchalar to'lganda
data-stateResendTimerwaiting · ready

Klaviatura

TugmaHarakat
BelgiKatakchani to'ldiradi, fokus keyingisiga o'tadi
BackspaceBelgini o'chiradi; katakcha bo'sh bo'lsa — oldingisiga qaytadi
DeleteJoriy katakchadagi belgini o'chiradi
← →Katakchalar bo'ylab yurish
Home / EndBirinchi / birinchi bo'sh katakcha

Bo'sh joydan keyingi katakchaga sakrab bo'lmaydi — fokus birinchi bo'sh katakchaga o'tadi.

Accessibility

  • Guruh — role="group". Field ichida label orqali (aria-labelledby), tashqarisida "Tasdiqlash kodi" nomi bilan (labels.group) o'qiladi.
  • Har bir katakcha — alohida <input> o'z nomi bilan: "1-raqam", "2-raqam" ... Boshqa tilda labels.cell bilan o'zgartiring: cell: (i, n) => 'Digit ' + (i + 1) + ' of ' + n.
  • aria-invalid, aria-describedby, aria-required Field dan har bir katakchaga uzatiladi — xato matni qaysi katakchada bo'lmasin o'qiladi.
  • Mobil klaviatura: numeric turida inputMode="numeric".
  • Harakat sezgirligi: silkinish prefers-reduced-motion: reduce da o'chadi.
  • ResendTimer kutish paytida aria-disabled — fokusda qoladi, lekin bosilmaydi; taymer matni tugma nomining bir qismi.

Sahifada