import { createEffect, createSignal, createUniqueId, JSX, onMount, ParentComponent, Show } from "solid-js"; import css from './prompt.module.css'; export interface PromptApi { showModal(): Promise; }; class PromptCanceledError extends Error { } export const Prompt: ParentComponent<{ api: (api: PromptApi) => any, title?: string, description?: string | JSX.Element }> = (props) => { const [dialog, setDialog] = createSignal(); const [form, setForm] = createSignal(); const [resolvers, setResolvers] = createSignal<[(...args: any[]) => any, (...args: any[]) => any]>(); const submitId = createUniqueId(); const cancelId = createUniqueId(); const api = { async showModal(): Promise { const { promise, resolve, reject } = Promise.withResolvers(); setResolvers([resolve, reject]); dialog()!.showModal(); try { await promise; return new FormData(form()); } catch (e) { if (!(e instanceof PromptCanceledError)) { throw e; } dialog()!.close(); setResolvers(undefined); } }, }; const onSubmit = (e: SubmitEvent) => { resolvers()?.[0](); }; const onCancel = (e: Event) => { resolvers()?.[1](new PromptCanceledError()); }; createEffect(() => { props.api(api); }); return
{ title => {title()} } { description =>

{description()}

}
{props.children}
; };