'use client' import * as RadixToast from '@radix-ui/react-toast' import clsx from 'clsx' import { createContext, type FC, type PropsWithChildren, useCallback, useState, } from 'react' import styles from './Toast.module.css' import type { ToastFn, ToastItem, ToastOptions } from './types' type Props = ToastOptions & { isOpen: boolean onOpenChange: (isOpen: boolean) => void } export const Toast: FC = ({ title, description, isOpen, onOpenChange, status, }) => { return ( {title} {description && ( {description} )} ) } export const ToastContext = createContext<{ headerToast: ToastFn commandPaletteToast: ToastFn }>({ headerToast: () => {}, commandPaletteToast: () => {}, }) export const HeaderToastViewportProvider = ({ children, }: PropsWithChildren) => { return ( {children} ) } export const CommandPaletteToastViewportProvider = ({ children, }: PropsWithChildren) => { return ( {children} ) } const useToastDisplay = () => { const [toastItem, setToastItem] = useState(null) const closeToastItem = useCallback(() => { setToastItem((prev) => (prev === null ? null : { ...prev, isOpen: false })) }, []) const createToastItem = useCallback( (options: ToastOptions) => { closeToastItem() window.setTimeout(() => setToastItem({ ...options, isOpen: true }), 100) }, [closeToastItem], ) return { toastItem, createToastItem, closeToastItem } } export const ToastProvider = ({ children }: PropsWithChildren) => { const { toastItem: headerToastItem, createToastItem: createHeaderToastItem, closeToastItem: closeHeaderToastItem, } = useToastDisplay() const { toastItem: commandPaletteToastItem, createToastItem: createCommandPaletteToastItem, closeToastItem: closeCommandPaletteToastItem, } = useToastDisplay() return ( {children} {headerToastItem && ( )} {commandPaletteToastItem && ( )} ) }