diff options
| author | Frank <[email protected]> | 2025-08-29 23:32:17 -0400 |
|---|---|---|
| committer | Frank <[email protected]> | 2025-08-29 23:32:17 -0400 |
| commit | 37f284f9a97d3354143d64fc76c2eb9f7d9ccf9e (patch) | |
| tree | 053db9abcb2178c71b22ebeadd07f920750ef5d2 /cloud/web/src/ui/context-dialog.tsx | |
| parent | 0178eab29bda2f1b37a29543cd313ede48ad3977 (diff) | |
| download | opencode-37f284f9a97d3354143d64fc76c2eb9f7d9ccf9e.tar.gz opencode-37f284f9a97d3354143d64fc76c2eb9f7d9ccf9e.zip | |
wip: cloud
Diffstat (limited to 'cloud/web/src/ui/context-dialog.tsx')
| -rw-r--r-- | cloud/web/src/ui/context-dialog.tsx | 120 |
1 files changed, 0 insertions, 120 deletions
diff --git a/cloud/web/src/ui/context-dialog.tsx b/cloud/web/src/ui/context-dialog.tsx deleted file mode 100644 index f1bc93250..000000000 --- a/cloud/web/src/ui/context-dialog.tsx +++ /dev/null @@ -1,120 +0,0 @@ -import { createContext, JSX, ParentProps, useContext } from "solid-js" -import { StandardSchemaV1 } from "@standard-schema/spec" -import { createStore } from "solid-js/store" -import { Dialog } from "./dialog" - -const Context = createContext<DialogControl>() - -type DialogControl = { - open<Schema extends StandardSchemaV1<object>>( - component: DialogComponent<Schema>, - input: StandardSchemaV1.InferInput<Schema>, - ): void - close(): void - isOpen(input: any): boolean - size: "sm" | "md" - transition?: boolean - input?: any -} - -type DialogProps<Schema extends StandardSchemaV1<object>> = { - input: StandardSchemaV1.InferInput<Schema> - control: DialogControl -} - -type DialogComponent<Schema extends StandardSchemaV1<object>> = ReturnType< - typeof createDialog<Schema> -> - -export function createDialog<Schema extends StandardSchemaV1<object>>(props: { - schema: Schema - size: "sm" | "md" - render: (props: DialogProps<Schema>) => JSX.Element -}) { - const result = () => { - const dialog = useDialog() - return ( - <Dialog - size={dialog.size} - transition={dialog.transition} - open={dialog.isOpen(result)} - onOpenChange={(val) => { - if (!val) dialog.close() - }} - > - {props.render({ - input: dialog.input, - control: dialog, - })} - </Dialog> - ) - } - result.schema = props.schema - result.size = props.size - return result -} - -export function DialogProvider(props: ParentProps) { - const [store, setStore] = createStore<{ - dialog?: DialogComponent<any> - input?: any - transition?: boolean - size: "sm" | "md" - }>({ - size: "sm", - }) - - const control: DialogControl = { - get input() { - return store.input - }, - get size() { - return store.size - }, - get transition() { - return store.transition - }, - isOpen(input) { - return store.dialog === input - }, - open(component, input) { - setStore({ - dialog: component, - input: input, - size: store.dialog !== undefined ? store.size : component.size, - transition: store.dialog !== undefined, - }) - - setTimeout(() => { - setStore({ - size: component.size, - }) - }, 0) - - setTimeout(() => { - setStore({ - transition: false, - }) - }, 150) - }, - close() { - setStore({ - dialog: undefined, - }) - }, - } - - return ( - <> - <Context.Provider value={control}>{props.children}</Context.Provider> - </> - ) -} - -export function useDialog() { - const ctx = useContext(Context) - if (!ctx) { - throw new Error("useDialog must be used within a DialogProvider") - } - return ctx -} |
