import { AriaToastProps, AriaToastRegionProps, useToast, useToastRegion, } from '@react-aria/toast'; import { ToastQueue, ToastState, useToastQueue } from '@react-stately/toast'; import { X } from 'lucide-react'; import React, { useRef } from 'react'; import IconButton from '~/components/IconButton'; import cn from '~/utils/cn'; interface ToastProps extends AriaToastProps { state: ToastState; } function Toast({ state, ...props }: ToastProps) { const ref = useRef(null); const { toastProps, contentProps, titleProps, closeButtonProps } = useToast( props, state, ref, ); return (
{props.toast.content}
); } interface ToastRegionProps extends AriaToastRegionProps { state: ToastState; } function ToastRegion({ state, ...props }: ToastRegionProps) { const ref = useRef(null); const { regionProps } = useToastRegion(props, state, ref); return (
{state.visibleToasts.map((toast) => ( ))}
); } export interface ToastProviderProps extends AriaToastRegionProps { queue: ToastQueue; } export default function ToastProvider({ queue, ...props }: ToastProviderProps) { const state = useToastQueue(queue); return ( <> {state.visibleToasts.length > 0 && ( )} ); }