Toast
一時的な通知メッセージを表示するコンポーネント。ユーザーの操作結果やシステムイベントを通知します。
基本的な使い方
ToastはRadix UIベースで、ToastProviderとuseToastフックを使用して実装します。
import { ToastProvider, ToastViewport, ToastContextProvider, useToast } from '@codeconnect-llc/design-system'
// アプリのルートでToastContextProviderをセットアップfunction App() { return ( <ToastContextProvider> <ToastProvider> <YourApp /> <ToastViewport /> </ToastProvider> </ToastContextProvider> )}
// コンポーネント内でuseToastフックを使用function MyComponent() { const { toast } = useToast()
const showToast = () => { toast({ variant: 'info', title: 'お知らせ', description: 'これは通知メッセージです', }) }
return <Button onClick={showToast}>通知を表示</Button>}バリアント
Toastは4つのバリアントを提供します。各バリアントに対応するアイコンが自動的に表示されます。
Info
const { toast } = useToast()
toast({ variant: 'info', title: '情報', description: '新機能が追加されました',})Success
const { toast } = useToast()
toast({ variant: 'success', title: '成功', description: 'データが正常に保存されました',})Warning
const { toast } = useToast()
toast({ variant: 'warning', title: '警告', description: 'この操作は元に戻せません',})Error
const { toast } = useToast()
toast({ variant: 'error', title: 'エラー', description: '処理に失敗しました',})タイトルのみ
descriptionを省略すると、タイトルのみのコンパクトな通知になります。
const { toast } = useToast()
toast({ variant: 'success', title: '保存しました',})自動非表示の制御
durationプロップで表示時間(ミリ秒)を制御できます。デフォルトは5000ms(5秒)です。
const { toast } = useToast()
// 3秒後に自動で消えるtoast({ variant: 'info', title: 'クリップボードにコピーしました', duration: 3000,})
// 自動で消えない(duration: Infinityまたは0を指定)toast({ variant: 'warning', title: '重要な通知', description: '手動で閉じる必要があります', duration: Infinity,})プログラムで閉じる
dismiss関数を使用して、特定のトーストを閉じることができます。
const { toast, dismiss } = useToast()
const toastId = toast({ variant: 'info', title: '処理中...', duration: Infinity,})
// 処理完了後に閉じるsetTimeout(() => { dismiss(toastId)}, 3000)useToast API
| メソッド | 型 | 説明 |
|---|---|---|
toast | (props: ToastProps) => string | トーストを表示し、IDを返す |
dismiss | (toastId: string) => void | 指定したトーストを閉じる |
remove | (toastId: string) => void | 指定したトーストをDOMから削除 |
toasts | ToastItem[] | 現在表示中のトースト一覧 |
Toast Props
| Prop | Type | Default | Description |
|---|---|---|---|
variant | 'info' | 'success' | 'warning' | 'error' | 'info' | トーストの種類 |
title | string | - | トーストのタイトル |
description | string | - | トーストの説明文 |
duration | number | 5000 | 表示時間(ミリ秒) |
自動アイコン表示
各バリアントに対応するアイコンが自動的に表示されます:
- Info: 情報アイコン(i)
- Success: チェックマークアイコン
- Warning: 警告三角アイコン
- Error: エラーXアイコン
アクセシビリティ
- 自動非表示: デフォルトで5秒後に消えるため、ユーザーの操作を妨げない
- 手動クローズ: 閉じるボタンで手動で消すことも可能
- スワイプジェスチャー: モバイルでスワイプして閉じることができる
- 位置: 画面右下(モバイルは上部)に表示され、視線の邪魔にならない
使用例
フォーム送信後の通知:
import { useToast } from '@codeconnect-llc/design-system'import { useState } from 'react'
export function ContactForm() { const { toast } = useToast() const [isSubmitting, setIsSubmitting] = useState(false)
const handleSubmit = async (e) => { e.preventDefault() setIsSubmitting(true)
try { await submitForm() toast({ variant: 'success', title: '送信完了', description: 'お問い合わせを受け付けました。1営業日以内に返信いたします。', }) } catch (error) { toast({ variant: 'error', title: '送信失敗', description: 'エラーが発生しました。もう一度お試しください。', }) } finally { setIsSubmitting(false) } }
return ( <form onSubmit={handleSubmit}> {/* Form fields */} <Button type="submit" disabled={isSubmitting}> 送信 </Button> </form> )}複数の操作を順次通知:
import { useToast } from '@codeconnect-llc/design-system'
export function DataProcessor() { const { toast } = useToast()
const processData = async () => { // ステップ1 toast({ variant: 'info', title: 'データを読み込み中...', duration: 2000, }) await loadData()
// ステップ2 toast({ variant: 'info', title: 'データを処理中...', duration: 2000, }) await processData()
// 完了 toast({ variant: 'success', title: '処理完了', description: 'すべてのデータが正常に処理されました', }) }
return <Button onClick={processData}>データを処理</Button>}