Spaces:
Configuration error
Configuration error
import * as React from 'react' | |
import * as ToastPrimitive from '@radix-ui/react-toast' | |
import { ToastProps } from '@radix-ui/react-toast' | |
import { CheckIcon, ExclamationCircleIcon } from '@heroicons/react/24/outline' | |
export const LoadingIcon = () => { | |
return ( | |
<span className="loading-icon"> | |
<svg | |
xmlns="http://www.w3.org/2000/svg" | |
width="20" | |
height="20" | |
viewBox="0 0 24 24" | |
fill="none" | |
stroke="currentColor" | |
strokeWidth="2" | |
strokeLinecap="round" | |
strokeLinejoin="round" | |
> | |
<line x1="12" y1="2" x2="12" y2="6" /> | |
<line x1="12" y1="18" x2="12" y2="22" /> | |
<line x1="4.93" y1="4.93" x2="7.76" y2="7.76" /> | |
<line x1="16.24" y1="16.24" x2="19.07" y2="19.07" /> | |
<line x1="2" y1="12" x2="6" y2="12" /> | |
<line x1="18" y1="12" x2="22" y2="12" /> | |
<line x1="4.93" y1="19.07" x2="7.76" y2="16.24" /> | |
<line x1="16.24" y1="7.76" x2="19.07" y2="4.93" /> | |
</svg> | |
</span> | |
) | |
} | |
export type ToastState = 'default' | 'error' | 'loading' | 'success' | |
interface MyToastProps extends ToastProps { | |
desc: string | |
state?: ToastState | |
} | |
const Toast = React.forwardRef< | |
React.ElementRef<typeof ToastPrimitive.Root>, | |
MyToastProps | |
>((props, forwardedRef) => { | |
const { state, desc, ...itemProps } = props | |
const getIcon = () => { | |
switch (state) { | |
case 'error': | |
return <ExclamationCircleIcon className="error-icon" /> | |
case 'success': | |
return <CheckIcon className="success-icon" /> | |
case 'loading': | |
return <LoadingIcon /> | |
default: | |
return <></> | |
} | |
} | |
return ( | |
<ToastPrimitive.Provider> | |
<ToastPrimitive.Root | |
{...itemProps} | |
ref={forwardedRef} | |
className={`toast-root ${state}`} | |
> | |
<div className="toast-icon">{getIcon()}</div> | |
<ToastPrimitive.Description className="toast-desc"> | |
{desc} | |
</ToastPrimitive.Description> | |
</ToastPrimitive.Root> | |
<ToastPrimitive.Viewport className="toast-viewpoint" /> | |
</ToastPrimitive.Provider> | |
) | |
}) | |
Toast.defaultProps = { | |
state: 'loading', | |
} | |
export default Toast | |