@akhatmirzo/ui

Toast

Qisqa bildirishnomalar: imperativ toast() API, promise kuzatish, amal tugmasi va dasta.

Import

import { toast, Toaster } from '@akhatmirzo/ui';

Qachon ishlatish

  • Harakat natijasi haqida xabar — "Saqlandi", "Havola nusxalandi", "To'lov qabul qilindi". Foydalanuvchi ishini to'xtatmaydi va o'zi yo'qoladi.
  • Bekor qilish (undo) — o'chirishdan keyin action bilan "Qaytarish" tugmasi. Ko'pincha confirm() dan qulayroq: foydalanuvchini savol bilan to'xtatmaysiz.
  • Uzoq jarayon holati — toast.promise() yoki toast.loading() + { id } bilan bitta toast "yuklanmoqda" dan natijaga o'tadi.
  • Javob talab qiladigan savol uchun toast emas, confirm() kerak. Forma maydonidagi xato esa maydon yonida — Field ning error prop'ida — ko'rsatiladi.

Toaster — o'rnatish

toast() modul darajasidagi store'ga yozadi, ekranga esa <Toaster /> chizadi. Ilovada bitta <Toaster /> bo'lishi shart — u bo'lmasa, toast() xato bermaydi, lekin hech narsa ko'rinmaydi.

app/providers.tsx
'use client';

import { Toaster } from '@akhatmirzo/ui';
import type { ReactNode } from 'react';

export function Providers({ children }: { children: ReactNode }) {
  return (
    <>
      {children}
      <Toaster position="bottom-right" />
    </>
  );
}

Shundan keyin toast() ni istalgan joydan chaqirasiz — komponent ichidan, hodisa ishlovchisidan, hatto React tashqarisidagi oddiy funksiyadan ham (masalan, API klientidagi xato ishlovchisidan).

Turlar

FunksiyaIkonkaStandart davomiylik
toast()yo'q4 s
toast.success()yashil ✓4 s
toast.error()qizil !6 s
toast.warning()sariq uchburchak4 s
toast.info()ko'k i4 s
toast.loading()spinnercheksiz

Har bir funksiya toast id sini qaytaradi. toast.dismiss(id) bitta toastni, toast.dismiss() — hammasini yopadi.

Izoh va amal

description — ikkinchi qator. action — o'ngda kichik tugma: { label, onClick }. Tugma bosilgach toast yopiladi; ochiq qolishi kerak bo'lsa, onClick ichida event.preventDefault() chaqiring.

toast("Mahsulot o'chirildi", {
  description: 'iPhone 15 Pro, 256 GB',
  action: { label: 'Qaytarish', onClick: () => restoreProduct(id) },
});

toast.promise()

Promise holatini kuzatadi: avval loading, keyin success yoki error — hammasi bitta toastda. success va error o'rniga funksiya bersangiz, natija yoki xato obyektini oladi. Promise o'rniga promise qaytaradigan funksiya ham berish mumkin. toast.promise() asl promise'ni qaytaradi — await qilish yoki .catch() ulash mumkin.

const order = await toast.promise(api.saveOrder(data), {
  loading: 'Saqlanmoqda...',
  success: (o) => `Buyurtma #${o.id} saqlandi`,
  error: (e) => `Xatolik: ${(e as Error).message}`,
});

id bilan yangilash

{ id } berilsa, shu id'li toast yangilanadi (yo'q bo'lsa — shu id bilan yaratiladi). Turini, matnini va izohini o'zgartirish mumkin; taymer qaytadan boshlanadi.

Dasta (stack)

Bir vaqtda ko'pi bilan 3 ta toast ko'rinadi (visibleToasts), qolganlari navbat kutadi va ularning taymeri to'xtab turadi. Toastlar ustma-ust "dasta" bo'lib turadi; sichqoncha ustiga borsa yoki fokus tushsa — yoyiladi va barcha taymerlar to'xtaydi. Toastni chetga surib (swipe) yopish mumkin.

Props

toast(title, options?)

title — ReactNode. Barcha funksiyalar (toast.success ...) bir xil opsiyalarni oladi, faqat type dan tashqari.

PropTipStandartTavsif
idstring | number—Shu id'li toast bo'lsa — yangilanadi, bo'lmasa shu id bilan yaratiladi
type'default' | 'success' | 'error' | 'warning' | 'info' | 'loading''default'Faqat toast() da; qolganlarida funksiya nomidan olinadi
descriptionReactNode—Ikkinchi qator
action{ label: ReactNode; onClick?: (event) => void; altText?: string }—O'ngdagi tugma. altText — label matn bo'lmasa, ekran o'quvchi uchun
durationnumber4000ms. error — 6000, loading — Infinity
iconReactNode—Status ikonkasini almashtiradi; null — ikonkasiz
onDismiss(id: ToastId) => void—Toast har qanday sabab bilan yopilganda

toast.promise(promise, messages, options?)

PropTipStandartTavsif
promisemajburiyPromise<T> | (() => Promise<T>)—Kuzatiladigan promise yoki uni qaytaradigan funksiya
messages.loadingmajburiyReactNode—Kutish matni
messages.successmajburiyReactNode | ((data: T) => ReactNode)—Muvaffaqiyat matni
messages.errormajburiyReactNode | ((error: unknown) => ReactNode)—Xato matni
optionsOmit<ToastOptions, 'type' | 'duration'>—description, action, icon ... (uchala bosqichda ham)

Qaytaradi: asl Promise<T>.

Toaster

PropTipStandartTavsif
position'top-left' | 'top-center' | 'top-right' | 'bottom-left' | 'bottom-center' | 'bottom-right''bottom-right'Telefonda (< 640px) doim pastda, to'liq kenglikda
durationnumber4000Standart davomiylik, ms (error — 6000, loading — cheksiz)
visibleToastsnumber3Bir vaqtda ko'rinadigan toastlar soni
gapnumber8Yoyilgan holatda toastlar orasidagi masofa, px
closeButtonbooleanfalseHar bir toastda ✕ tugmasi
hotkeystring[]['F8']Toast hududiga fokus o'tkazadigan tugma
labels{ region?: string; toast?: string; close?: string }—Ekran o'quvchi matnlari (pastda)
classNamestring—Toastlar hududi (viewport) klassi

labels standart qiymatlari: region — 'Bildirishnomalar ({hotkey})' ({hotkey} tugma nomi bilan almashtiriladi), toast — 'Bildirishnoma' (e'lon oldidan qo'shiladigan so'z), close — 'Yopish'.

Data atributlari

AtributQayerdaQiymat
data-typetoastdefault · success · error · warning · info · loading
data-indextoastdastadagi o'rni (0 — eng oldingi)
data-fronttoasteng oldingi toastda mavjud
data-expandedtoast, hududdasta yoyilganda mavjud
data-positionhududposition qiymati

Klaviatura

TugmaHarakat
F8Fokusni toastlar hududiga o'tkazadi (hotkey)
TabToastlar va ulardagi tugmalar bo'ylab yurish
EscFokusdagi toastni yopadi
Enter / SpaceAmal yoki ✕ tugmasini bosish

Accessibility

  • E'lon qilish. Toast role="status" bilan chiziladi — ekran o'quvchi ishni bo'lmasdan o'qiydi. error turi — role="alert", darhol e'lon qilinadi.
  • Taymer to'xtaydi sichqoncha ustida turganda yoki fokus toastlar hududida bo'lganda — foydalanuvchi matnni o'qib ulguradi.
  • Klaviatura bilan yetish. F8 (yoki hotkey) fokusni toastlar hududiga o'tkazadi, hudud "Bildirishnomalar (F8)" nomini oladi.
  • Amal tugmasi. label matn bo'lmasa (masalan, ikonka), altText yozing — ekran o'quvchi shu matnni aytadi.
  • Yashirin toastlar (navbatdagilar) inert — fokus ularga tushmaydi.
  • Kamroq harakat. prefers-reduced-motion da siljish o'rniga shaffoflik animatsiyasi.

Sahifada