'use client' /** * @deprecated Use `@/app/components/base/ui/toast` instead. * This component will be removed after migration is complete. * See: https://github.com/langgenius/dify/issues/32811 */ import type { ReactNode } from 'react' import type { IToastProps } from './context' import { noop } from 'es-toolkit/function' import * as React from 'react' import { useEffect, useState } from 'react' import { createRoot } from 'react-dom/client' import ActionButton from '@/app/components/base/action-button' import { cn } from '@/utils/classnames' import { ToastContext, useToastContext } from './context' export type ToastHandle = { clear?: VoidFunction } const Toast = ({ type = 'info', size = 'md', message, children, className, customComponent, }: IToastProps) => { const { close } = useToastContext() // sometimes message is react node array. Not handle it. if (typeof message !== 'string') return null return (
{type === 'success' &&
{message}
{customComponent}
{!!children && (
{children}
)}
{close && ( )}
) } /** @deprecated Use `@/app/components/base/ui/toast` instead. See issue #32811. */ export const ToastProvider = ({ children, }: { children: ReactNode }) => { const placeholder: IToastProps = { type: 'info', message: 'Toast message', duration: 6000, } const [params, setParams] = React.useState(placeholder) const defaultDuring = (params.type === 'success' || params.type === 'info') ? 3000 : 6000 const [mounted, setMounted] = useState(false) useEffect(() => { if (mounted) { setTimeout(() => { setMounted(false) }, params.duration || defaultDuring) } }, [defaultDuring, mounted, params.duration]) return ( { setMounted(true) setParams(props) }, close: () => setMounted(false), }} > {mounted && } {children} ) } Toast.notify = ({ type, size = 'md', message, duration, className, customComponent, onClose, }: Pick): ToastHandle => { const defaultDuring = (type === 'success' || type === 'info') ? 3000 : 6000 const toastHandler: ToastHandle = {} if (typeof window === 'object') { const holder = document.createElement('div') const root = createRoot(holder) toastHandler.clear = () => { if (holder) { root.unmount() holder.remove() } onClose?.() } root.render( { if (holder) { root.unmount() holder.remove() } onClose?.() }, }} > , ) document.body.appendChild(holder) const d = duration ?? defaultDuring if (d > 0) setTimeout(toastHandler.clear, d) } return toastHandler } export default Toast export type { IToastProps } from './context'