summaryrefslogtreecommitdiffhomepage
path: root/cloud/web/src/ui/context-dialog.tsx
diff options
context:
space:
mode:
authorFrank <[email protected]>2025-08-29 23:32:17 -0400
committerFrank <[email protected]>2025-08-29 23:32:17 -0400
commit37f284f9a97d3354143d64fc76c2eb9f7d9ccf9e (patch)
tree053db9abcb2178c71b22ebeadd07f920750ef5d2 /cloud/web/src/ui/context-dialog.tsx
parent0178eab29bda2f1b37a29543cd313ede48ad3977 (diff)
downloadopencode-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.tsx120
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
-}