import React, { useEffect, useState, type ComponentPropsWithRef, type ReactNode } from 'react'; import { Promises } from '@wener/utils'; import { DynamicRender } from './'; import type { DynamicRenderer } from './DynamicRender'; type ShowDialogOptions = { title?: ReactNode; description?: ReactNode; content?: ReactNode; renderer?: DynamicRenderer; action?: ReactNode; }; export function showPrompt({ defaultValue, placeholder, ...props }: ShowDialogOptions & { defaultValue?: string; placeholder?: string; }): Promise { const { resolve, promise } = Promises.withResolvers(); let valueRef = defaultValue || ''; const handle = showDialog({ ...props, content: ( <> { valueRef = e.target.value; }} {...{ defaultValue, placeholder, }} /> ), action: (
), }); return promise; } export function showConfirm(props: ShowDialogOptions): Promise { const { resolve, promise } = Promises.withResolvers(); const handle = showDialog({ ...props, action: (
), }); return promise; } export function showDialog({ title, description, content, renderer, action }: ShowDialogOptions) { return DynamicRender.render({ renderer, render: () => { const { remove, id } = DynamicRender.useRenderHandle(); const [dialogRef, setRef] = useState(); let ref = dialogRef; useEffect(() => { if (!ref) return; if (!ref.open) { ref.showModal(); } ref.addEventListener('close', remove); return () => { ref.removeEventListener('close', remove); }; }, [ref]); return ( ); }, }); } const DynamicDialog = ({ title, description, content, children, action, ...props }: Omit, 'title' | 'content'> & { title?: ReactNode; description?: ReactNode; content?: ReactNode; action?: ReactNode; }) => { return (
{title &&

{title}

} {description &&

{description}

} {content} {action ?? (
)}
); };