'use client'; import { useCallback } from 'react'; import type { ReactNode } from 'react'; import { store } from '../core/store'; import { toast as toastApi } from '../core/toast'; import type { PromiseOptions, ToastLayout, ToastOptions, ToastPosition, ToastType, } from '../core/types'; import { useVyrn } from './useVyrn'; type Options = Omit; /** * The v4 hook, kept for compatibility. Unlike v4 it no longer requires a * surrounding provider — it talks to the same global store as `toast()`. * * Prefer importing `toast` directly; use this when you want the live queue. */ export const useToast = () => { const { toasts } = useVyrn(); const create = useCallback( (options: ToastOptions & { type?: ToastType }) => store.add(options), [] ); const byType = useCallback( (type: ToastType) => (content: ReactNode, options?: Options) => store.add({ ...options, content, type }), [] ); const changePosition = useCallback((position: ToastPosition) => { store.setOverrides({ position }); }, []); const changeLayout = useCallback((layout: ToastLayout) => { store.setOverrides({ layout }); }, []); const overrides = store.getOverrides(); return { /** Live queue, newest last. */ toasts, toast: create, update: useCallback( (id: string | number, updates: ToastOptions & { type?: ToastType }) => store.update(id, updates), [] ), dismiss: useCallback((id?: string | number) => store.dismiss(id), []), clearAll: useCallback(() => store.dismiss(), []), promise: useCallback( (input: Promise | (() => Promise), options: PromiseOptions) => toastApi.promise(input, options).id, [] ), loading: useCallback( (content: ReactNode, options?: Options) => toastApi.loading(content, options), [] ), default: byType('default'), message: byType('default'), info: byType('info'), success: byType('success'), warning: byType('warning'), error: byType('error'), custom: byType('custom'), changePosition, changeLayout, position: overrides.position, layout: overrides.layout, }; };