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 && }; }