Toast
Qisqa bildirishnomalar: imperativ toast() API, promise kuzatish, amal tugmasi va dasta.
'use client';
import { Button, toast } from '@akhatmirzo/ui';
export default function ToastTypes() {
return (
<div className="flex flex-wrap items-center gap-2">
<Button variant="outline" onClick={() => toast('Havola nusxalandi')}>
Oddiy
</Button>
<Button variant="outline" onClick={() => toast.success("O'zgarishlar saqlandi")}>
success
</Button>
<Button
variant="outline"
onClick={() =>
toast.error("Ulanib bo'lmadi", {
description: "Internetni tekshirib, qayta urinib ko'ring.",
})
}
>
error
</Button>
<Button
variant="outline"
onClick={() =>
toast.warning('Obuna 3 kundan keyin tugaydi', {
description: "To'lovni oldindan qiling.",
})
}
>
warning
</Button>
<Button variant="outline" onClick={() => toast.info('Yangi versiya mavjud')}>
info
</Button>
<Button variant="outline" onClick={() => toast.loading('Hisobot tayyorlanmoqda...')}>
loading
</Button>
<Button variant="ghost" onClick={() => toast.dismiss()}>
Hammasini yopish
</Button>
</div>
);
}
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
actionbilan "Qaytarish" tugmasi. Ko'pinchaconfirm()dan qulayroq: foydalanuvchini savol bilan to'xtatmaysiz. - Uzoq jarayon holati —
toast.promise()yokitoast.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 —Fieldningerrorprop'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.
'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
| Funksiya | Ikonka | Standart davomiylik |
|---|---|---|
toast() | yo'q | 4 s |
toast.success() | yashil ✓ | 4 s |
toast.error() | qizil ! | 6 s |
toast.warning() | sariq uchburchak | 4 s |
toast.info() | ko'k i | 4 s |
toast.loading() | spinner | cheksiz |
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.
'use client';
import { Button, toast } from '@akhatmirzo/ui';
export default function ToastAction() {
return (
<div className="flex flex-wrap items-center gap-2">
<Button
variant="outline"
onClick={() =>
toast.success('Buyurtma yaratildi', {
description: "#1042 · 1 250 000 so'm",
action: { label: "Ko'rish", onClick: () => toast.info('Buyurtma #1042 ochildi') },
})
}
>
Amal bilan
</Button>
<Button
variant="outline"
onClick={() =>
toast("Mahsulot o'chirildi", {
description: 'iPhone 15 Pro, 256 GB',
action: {
label: 'Qaytarish',
onClick: () => toast.success('Mahsulot qaytarildi'),
},
})
}
>
Bekor qilish (undo)
</Button>
</div>
);
}
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.
'use client';
import { Button, toast } from '@akhatmirzo/ui';
const wait = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms));
async function saveOrder() {
await wait(1500);
return 1042;
}
async function failingRequest(): Promise<void> {
await wait(1200);
throw new Error('Server javob bermadi');
}
export default function ToastPromise() {
return (
<div className="flex flex-wrap items-center gap-2">
<Button
variant="outline"
onClick={() =>
toast.promise(saveOrder, {
loading: 'Saqlanmoqda...',
success: (id) => `Buyurtma #${id} saqlandi`,
error: 'Xatolik yuz berdi',
})
}
>
Muvaffaqiyatli
</Button>
<Button
variant="outline"
onClick={() =>
toast
.promise(failingRequest, {
loading: 'Yuborilmoqda...',
success: 'Yuborildi',
error: (e) => `Xatolik: ${(e as Error).message}`,
})
.catch(() => {})
}
>
Xato bilan
</Button>
</div>
);
}
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.
'use client';
import { Button, toast } from '@akhatmirzo/ui';
const wait = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms));
export default function ToastUpdate() {
const upload = async () => {
const id = toast.loading('Fayl yuklanmoqda...', { description: 'hisobot.xlsx' });
await wait(1000);
toast.loading('Fayl tekshirilmoqda...', { id, description: 'hisobot.xlsx' });
await wait(1000);
toast.success('Fayl yuklandi', { id, description: 'hisobot.xlsx · 2,4 MB' });
};
return (
<Button variant="outline" onClick={upload}>
Faylni yuklash
</Button>
);
}
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.
'use client';
import { Button, toast } from '@akhatmirzo/ui';
export default function ToastStack() {
const burst = () => {
toast.info("Yangi mijoz ro'yxatdan o'tdi");
toast.success("To'lov qabul qilindi", { description: "350 000 so'm" });
toast.warning('Omborda 3 ta qoldi');
toast('Yangi sharh qoldirildi');
};
return (
<div className="flex flex-wrap items-center gap-2">
<Button variant="outline" onClick={burst}>
4 tasini birdan
</Button>
<Button variant="ghost" onClick={() => toast.dismiss()}>
Hammasini yopish
</Button>
</div>
);
}
Props
toast(title, options?)
title — ReactNode. Barcha funksiyalar (toast.success ...) bir xil opsiyalarni oladi,
faqat type dan tashqari.
| Prop | Tip | Standart | Tavsif |
|---|---|---|---|
id | string | 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 |
description | ReactNode | — | Ikkinchi qator |
action | { label: ReactNode; onClick?: (event) => void; altText?: string } | — | O'ngdagi tugma. altText — label matn bo'lmasa, ekran o'quvchi uchun |
duration | number | 4000 | ms. error — 6000, loading — Infinity |
icon | ReactNode | — | Status ikonkasini almashtiradi; null — ikonkasiz |
onDismiss | (id: ToastId) => void | — | Toast har qanday sabab bilan yopilganda |
toast.promise(promise, messages, options?)
| Prop | Tip | Standart | Tavsif |
|---|---|---|---|
promisemajburiy | Promise<T> | (() => Promise<T>) | — | Kuzatiladigan promise yoki uni qaytaradigan funksiya |
messages.loadingmajburiy | ReactNode | — | Kutish matni |
messages.successmajburiy | ReactNode | ((data: T) => ReactNode) | — | Muvaffaqiyat matni |
messages.errormajburiy | ReactNode | ((error: unknown) => ReactNode) | — | Xato matni |
options | Omit<ToastOptions, 'type' | 'duration'> | — | description, action, icon ... (uchala bosqichda ham) |
Qaytaradi: asl Promise<T>.
Toaster
| Prop | Tip | Standart | Tavsif |
|---|---|---|---|
position | 'top-left' | 'top-center' | 'top-right' | 'bottom-left' | 'bottom-center' | 'bottom-right' | 'bottom-right' | Telefonda (< 640px) doim pastda, to'liq kenglikda |
duration | number | 4000 | Standart davomiylik, ms (error — 6000, loading — cheksiz) |
visibleToasts | number | 3 | Bir vaqtda ko'rinadigan toastlar soni |
gap | number | 8 | Yoyilgan holatda toastlar orasidagi masofa, px |
closeButton | boolean | false | Har bir toastda ✕ tugmasi |
hotkey | string[] | ['F8'] | Toast hududiga fokus o'tkazadigan tugma |
labels | { region?: string; toast?: string; close?: string } | — | Ekran o'quvchi matnlari (pastda) |
className | string | — | 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
| Atribut | Qayerda | Qiymat |
|---|---|---|
data-type | toast | default · success · error · warning · info · loading |
data-index | toast | dastadagi o'rni (0 — eng oldingi) |
data-front | toast | eng oldingi toastda mavjud |
data-expanded | toast, hudud | dasta yoyilganda mavjud |
data-position | hudud | position qiymati |
Klaviatura
| Tugma | Harakat |
|---|---|
F8 | Fokusni toastlar hududiga o'tkazadi (hotkey) |
Tab | Toastlar va ulardagi tugmalar bo'ylab yurish |
Esc | Fokusdagi toastni yopadi |
Enter / Space | Amal yoki ✕ tugmasini bosish |
Accessibility
- E'lon qilish. Toast
role="status"bilan chiziladi — ekran o'quvchi ishni bo'lmasdan o'qiydi.errorturi —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(yokihotkey) fokusni toastlar hududiga o'tkazadi, hudud "Bildirishnomalar (F8)" nomini oladi. - Amal tugmasi.
labelmatn bo'lmasa (masalan, ikonka),altTextyozing — ekran o'quvchi shu matnni aytadi. - Yashirin toastlar (navbatdagilar)
inert— fokus ularga tushmaydi. - Kamroq harakat.
prefers-reduced-motionda siljish o'rniga shaffoflik animatsiyasi.