From b8604d334b445b713049a58397862a7ffbbe612a Mon Sep 17 00:00:00 2001 From: Brian McGee Date: Tue, 8 Jul 2025 11:31:18 +0100 Subject: [PATCH] feat(ui): prep V2 Preparation for rebuilding the UI with V2 components. --- pkgs/clan-app/ui/.storybook/preview.ts | 1 - .../ui/src/Form/fields/FormSection.tsx | 8 - .../clan-app/ui/src/Form/fields/TextInput.tsx | 57 ---- pkgs/clan-app/ui/src/Form/fields/index.ts | 2 - pkgs/clan-app/ui/src/Form/fields/layout.tsx | 26 -- pkgs/clan-app/ui/src/api/index.tsx | 195 ------------ pkgs/clan-app/ui/src/api_test.tsx | 188 ----------- .../src/components/{v2 => }/Alert/Alert.css | 0 .../{v2 => }/Alert/Alert.stories.tsx | 2 +- .../src/components/{v2 => }/Alert/Alert.tsx | 4 +- .../clan-app/ui/src/components/BackButton.tsx | 16 - .../ui/src/components/Button/Button-Base.css | 55 ---- .../ui/src/components/Button/Button-Dark.css | 31 -- .../ui/src/components/Button/Button-Ghost.css | 11 - .../ui/src/components/Button/Button-Light.css | 37 --- .../src/components/{v2 => }/Button/Button.css | 0 .../src/components/{v2 => }/Button/Button.mdx | 0 .../{v2 => }/Button/Button.stories.tsx | 0 .../ui/src/components/Button/Button.tsx | 133 ++++---- .../components/{v2 => }/Divider/Divider.css | 0 .../{v2 => }/Divider/Divider.stories.tsx | 2 +- .../components/{v2 => }/Divider/Divider.tsx | 0 .../src/components/{v2 => }/Form/Checkbox.css | 0 .../{v2 => }/Form/Checkbox.stories.tsx | 2 +- .../src/components/{v2 => }/Form/Checkbox.tsx | 2 +- .../src/components/{v2 => }/Form/Combobox.css | 0 .../{v2 => }/Form/Combobox.stories.tsx | 0 .../src/components/{v2 => }/Form/Combobox.tsx | 6 +- .../ui/src/components/{v2 => }/Form/Field.tsx | 0 .../src/components/{v2 => }/Form/Fieldset.css | 0 .../{v2 => }/Form/Fieldset.stories.tsx | 8 +- .../src/components/{v2 => }/Form/Fieldset.tsx | 2 +- .../ui/src/components/{v2 => }/Form/Label.css | 0 .../ui/src/components/{v2 => }/Form/Label.tsx | 4 +- .../src/components/{v2 => }/Form/Orienter.css | 0 .../src/components/{v2 => }/Form/Orienter.tsx | 0 .../{v2 => }/Form/TextArea.stories.tsx | 0 .../src/components/{v2 => }/Form/TextArea.tsx | 0 .../components/{v2 => }/Form/TextInput.css | 0 .../{v2 => }/Form/TextInput.stories.tsx | 2 +- .../components/{v2 => }/Form/TextInput.tsx | 2 +- .../ui/src/components/Helpers/List.tsx | 20 -- .../ui/src/components/Helpers/index.tsx | 1 - .../components/{v2 => }/Icon/Icon.stories.tsx | 0 .../ui/src/components/{v2 => }/Icon/Icon.tsx | 0 .../src/components/{v2 => }/Loader/Loader.css | 0 .../{v2 => }/Loader/Loader.stories.tsx | 2 +- .../src/components/{v2 => }/Loader/Loader.tsx | 0 .../{v2 => }/MachineStatus/MachineStatus.css | 0 .../MachineStatus/MachineStatus.stories.tsx | 2 +- .../{v2 => }/MachineStatus/MachineStatus.tsx | 2 +- .../src/components/{v2 => }/Modal/Modal.css | 0 .../{v2 => }/Modal/Modal.stories.tsx | 12 +- .../src/components/{v2 => }/Modal/Modal.tsx | 0 .../Sidebar/SidebarFlyout/index.tsx | 14 - .../src/components/Sidebar/SidebarHeader.tsx | 71 ----- .../components/Sidebar/SidebarListItem.tsx | 30 -- .../{v2 => }/Sidebar/SidebarNav.css | 0 .../{v2 => }/Sidebar/SidebarNav.stories.tsx | 2 +- .../{v2 => }/Sidebar/SidebarNav.tsx | 6 +- .../{v2 => }/Sidebar/SidebarNavBody.css | 0 .../{v2 => }/Sidebar/SidebarNavBody.tsx | 6 +- .../{v2 => }/Sidebar/SidebarNavHeader.css | 0 .../{v2 => }/Sidebar/SidebarNavHeader.tsx | 4 +- .../{v2 => }/Sidebar/SidebarPane.css | 0 .../{v2 => }/Sidebar/SidebarPane.stories.tsx | 10 +- .../{v2 => }/Sidebar/SidebarPane.tsx | 2 +- .../{v2 => }/Sidebar/SidebarSection.css | 0 .../{v2 => }/Sidebar/SidebarSection.tsx | 2 +- .../components/Sidebar/css/sidebar-flyout.css | 21 -- .../components/Sidebar/css/sidebar-header.css | 30 -- .../Sidebar/css/sidebar-list-item.css | 52 --- .../Sidebar/css/sidebar-profile.css | 19 -- .../ui/src/components/Sidebar/css/sidebar.css | 32 -- .../ui/src/components/Sidebar/index.tsx | 85 ----- .../ui/src/components/{v2 => }/Tag/Tag.css | 0 .../components/{v2 => }/Tag/Tag.stories.tsx | 2 +- .../ui/src/components/{v2 => }/Tag/Tag.tsx | 2 +- .../components/{v2 => }/TagGroup/TagGroup.css | 0 .../{v2 => }/TagGroup/TagGroup.stories.tsx | 2 +- .../components/{v2 => }/TagGroup/TagGroup.tsx | 2 +- .../{v2 => }/Typography/Typography.css | 0 .../{v2 => }/Typography/Typography.mdx | 0 .../Typography/Typography.stories.tsx | 2 +- .../{v2 => }/Typography/Typography.tsx | 2 +- .../Typography/css/typography-color.css | 23 -- .../css/typography-hierarchy/index.css | 4 - .../typography-hierarchy/typography-body.css | 23 -- .../typography-headline.css | 17 - .../typography-hierarchy/typography-label.css | 14 - .../typography-hierarchy/typography-title.css | 17 - .../components/Typography/css/typography.css | 26 -- .../ui/src/components/Typography/index.tsx | 109 ------- .../ui/src/components/{v2 => }/colors.ts | 0 .../clan-app/ui/src/components/icon/index.tsx | 98 ------ .../ui/src/components/inputBase/index.tsx | 193 ----------- .../ui/src/components/toast/index.tsx | 301 ------------------ .../ui/src/components/v2/Button/Button.tsx | 115 ------- pkgs/clan-app/ui/src/components/v2/README.md | 7 - pkgs/clan-app/ui/src/components/v2/index.css | 75 ----- pkgs/clan-app/ui/src/contexts/clan.tsx | 64 ---- pkgs/clan-app/ui/src/floating/index.tsx | 125 -------- pkgs/clan-app/ui/src/hooks/index.ts | 44 --- pkgs/clan-app/ui/src/index.css | 146 ++------- pkgs/clan-app/ui/src/index.tsx | 103 +----- pkgs/clan-app/ui/src/layout/header.tsx | 29 -- pkgs/clan-app/ui/src/layout/layout.tsx | 29 -- pkgs/clan-app/ui/src/queries/clan-meta.ts | 37 --- pkgs/clan-app/ui/src/routes/clans/create.tsx | 207 ------------ pkgs/clan-app/ui/src/routes/clans/details.tsx | 151 --------- pkgs/clan-app/ui/src/routes/clans/index.ts | 3 - pkgs/clan-app/ui/src/routes/clans/list.tsx | 160 ---------- .../ui/src/routes/components/index.tsx | 118 ------- pkgs/clan-app/ui/src/routes/hosts/view.tsx | 76 ----- pkgs/clan-app/ui/src/routes/welcome/index.tsx | 37 --- pkgs/clan-app/ui/src/stores/clan.tsx | 88 ----- pkgs/clan-app/ui/src/three.tsx | 271 ---------------- 117 files changed, 158 insertions(+), 3785 deletions(-) delete mode 100644 pkgs/clan-app/ui/src/Form/fields/FormSection.tsx delete mode 100644 pkgs/clan-app/ui/src/Form/fields/TextInput.tsx delete mode 100644 pkgs/clan-app/ui/src/Form/fields/index.ts delete mode 100644 pkgs/clan-app/ui/src/Form/fields/layout.tsx delete mode 100644 pkgs/clan-app/ui/src/api/index.tsx delete mode 100644 pkgs/clan-app/ui/src/api_test.tsx rename pkgs/clan-app/ui/src/components/{v2 => }/Alert/Alert.css (100%) rename pkgs/clan-app/ui/src/components/{v2 => }/Alert/Alert.stories.tsx (97%) rename pkgs/clan-app/ui/src/components/{v2 => }/Alert/Alert.tsx (89%) delete mode 100644 pkgs/clan-app/ui/src/components/BackButton.tsx delete mode 100644 pkgs/clan-app/ui/src/components/Button/Button-Base.css delete mode 100644 pkgs/clan-app/ui/src/components/Button/Button-Dark.css delete mode 100644 pkgs/clan-app/ui/src/components/Button/Button-Ghost.css delete mode 100644 pkgs/clan-app/ui/src/components/Button/Button-Light.css rename pkgs/clan-app/ui/src/components/{v2 => }/Button/Button.css (100%) rename pkgs/clan-app/ui/src/components/{v2 => }/Button/Button.mdx (100%) rename pkgs/clan-app/ui/src/components/{v2 => }/Button/Button.stories.tsx (100%) rename pkgs/clan-app/ui/src/components/{v2 => }/Divider/Divider.css (100%) rename pkgs/clan-app/ui/src/components/{v2 => }/Divider/Divider.stories.tsx (90%) rename pkgs/clan-app/ui/src/components/{v2 => }/Divider/Divider.tsx (100%) rename pkgs/clan-app/ui/src/components/{v2 => }/Form/Checkbox.css (100%) rename pkgs/clan-app/ui/src/components/{v2 => }/Form/Checkbox.stories.tsx (96%) rename pkgs/clan-app/ui/src/components/{v2 => }/Form/Checkbox.tsx (97%) rename pkgs/clan-app/ui/src/components/{v2 => }/Form/Combobox.css (100%) rename pkgs/clan-app/ui/src/components/{v2 => }/Form/Combobox.stories.tsx (100%) rename pkgs/clan-app/ui/src/components/{v2 => }/Form/Combobox.tsx (96%) rename pkgs/clan-app/ui/src/components/{v2 => }/Form/Field.tsx (100%) rename pkgs/clan-app/ui/src/components/{v2 => }/Form/Fieldset.css (100%) rename pkgs/clan-app/ui/src/components/{v2 => }/Form/Fieldset.stories.tsx (91%) rename pkgs/clan-app/ui/src/components/{v2 => }/Form/Fieldset.tsx (95%) rename pkgs/clan-app/ui/src/components/{v2 => }/Form/Label.css (100%) rename pkgs/clan-app/ui/src/components/{v2 => }/Form/Label.tsx (95%) rename pkgs/clan-app/ui/src/components/{v2 => }/Form/Orienter.css (100%) rename pkgs/clan-app/ui/src/components/{v2 => }/Form/Orienter.tsx (100%) rename pkgs/clan-app/ui/src/components/{v2 => }/Form/TextArea.stories.tsx (100%) rename pkgs/clan-app/ui/src/components/{v2 => }/Form/TextArea.tsx (100%) rename pkgs/clan-app/ui/src/components/{v2 => }/Form/TextInput.css (100%) rename pkgs/clan-app/ui/src/components/{v2 => }/Form/TextInput.stories.tsx (96%) rename pkgs/clan-app/ui/src/components/{v2 => }/Form/TextInput.tsx (95%) delete mode 100644 pkgs/clan-app/ui/src/components/Helpers/List.tsx delete mode 100644 pkgs/clan-app/ui/src/components/Helpers/index.tsx rename pkgs/clan-app/ui/src/components/{v2 => }/Icon/Icon.stories.tsx (100%) rename pkgs/clan-app/ui/src/components/{v2 => }/Icon/Icon.tsx (100%) rename pkgs/clan-app/ui/src/components/{v2 => }/Loader/Loader.css (100%) rename pkgs/clan-app/ui/src/components/{v2 => }/Loader/Loader.stories.tsx (83%) rename pkgs/clan-app/ui/src/components/{v2 => }/Loader/Loader.tsx (100%) rename pkgs/clan-app/ui/src/components/{v2 => }/MachineStatus/MachineStatus.css (100%) rename pkgs/clan-app/ui/src/components/{v2 => }/MachineStatus/MachineStatus.stories.tsx (95%) rename pkgs/clan-app/ui/src/components/{v2 => }/MachineStatus/MachineStatus.tsx (93%) rename pkgs/clan-app/ui/src/components/{v2 => }/Modal/Modal.css (100%) rename pkgs/clan-app/ui/src/components/{v2 => }/Modal/Modal.stories.tsx (83%) rename pkgs/clan-app/ui/src/components/{v2 => }/Modal/Modal.tsx (100%) delete mode 100644 pkgs/clan-app/ui/src/components/Sidebar/SidebarFlyout/index.tsx delete mode 100644 pkgs/clan-app/ui/src/components/Sidebar/SidebarHeader.tsx delete mode 100644 pkgs/clan-app/ui/src/components/Sidebar/SidebarListItem.tsx rename pkgs/clan-app/ui/src/components/{v2 => }/Sidebar/SidebarNav.css (100%) rename pkgs/clan-app/ui/src/components/{v2 => }/Sidebar/SidebarNav.stories.tsx (98%) rename pkgs/clan-app/ui/src/components/{v2 => }/Sidebar/SidebarNav.tsx (76%) rename pkgs/clan-app/ui/src/components/{v2 => }/Sidebar/SidebarNavBody.css (100%) rename pkgs/clan-app/ui/src/components/{v2 => }/Sidebar/SidebarNavBody.tsx (95%) rename pkgs/clan-app/ui/src/components/{v2 => }/Sidebar/SidebarNavHeader.css (100%) rename pkgs/clan-app/ui/src/components/{v2 => }/Sidebar/SidebarNavHeader.tsx (96%) rename pkgs/clan-app/ui/src/components/{v2 => }/Sidebar/SidebarPane.css (100%) rename pkgs/clan-app/ui/src/components/{v2 => }/Sidebar/SidebarPane.stories.tsx (90%) rename pkgs/clan-app/ui/src/components/{v2 => }/Sidebar/SidebarPane.tsx (90%) rename pkgs/clan-app/ui/src/components/{v2 => }/Sidebar/SidebarSection.css (100%) rename pkgs/clan-app/ui/src/components/{v2 => }/Sidebar/SidebarSection.tsx (95%) delete mode 100644 pkgs/clan-app/ui/src/components/Sidebar/css/sidebar-flyout.css delete mode 100644 pkgs/clan-app/ui/src/components/Sidebar/css/sidebar-header.css delete mode 100644 pkgs/clan-app/ui/src/components/Sidebar/css/sidebar-list-item.css delete mode 100644 pkgs/clan-app/ui/src/components/Sidebar/css/sidebar-profile.css delete mode 100644 pkgs/clan-app/ui/src/components/Sidebar/css/sidebar.css delete mode 100644 pkgs/clan-app/ui/src/components/Sidebar/index.tsx rename pkgs/clan-app/ui/src/components/{v2 => }/Tag/Tag.css (100%) rename pkgs/clan-app/ui/src/components/{v2 => }/Tag/Tag.stories.tsx (93%) rename pkgs/clan-app/ui/src/components/{v2 => }/Tag/Tag.tsx (94%) rename pkgs/clan-app/ui/src/components/{v2 => }/TagGroup/TagGroup.css (100%) rename pkgs/clan-app/ui/src/components/{v2 => }/TagGroup/TagGroup.stories.tsx (89%) rename pkgs/clan-app/ui/src/components/{v2 => }/TagGroup/TagGroup.tsx (90%) rename pkgs/clan-app/ui/src/components/{v2 => }/Typography/Typography.css (100%) rename pkgs/clan-app/ui/src/components/{v2 => }/Typography/Typography.mdx (100%) rename pkgs/clan-app/ui/src/components/{v2 => }/Typography/Typography.stories.tsx (98%) rename pkgs/clan-app/ui/src/components/{v2 => }/Typography/Typography.tsx (97%) delete mode 100644 pkgs/clan-app/ui/src/components/Typography/css/typography-color.css delete mode 100644 pkgs/clan-app/ui/src/components/Typography/css/typography-hierarchy/index.css delete mode 100644 pkgs/clan-app/ui/src/components/Typography/css/typography-hierarchy/typography-body.css delete mode 100644 pkgs/clan-app/ui/src/components/Typography/css/typography-hierarchy/typography-headline.css delete mode 100644 pkgs/clan-app/ui/src/components/Typography/css/typography-hierarchy/typography-label.css delete mode 100644 pkgs/clan-app/ui/src/components/Typography/css/typography-hierarchy/typography-title.css delete mode 100644 pkgs/clan-app/ui/src/components/Typography/css/typography.css delete mode 100644 pkgs/clan-app/ui/src/components/Typography/index.tsx rename pkgs/clan-app/ui/src/components/{v2 => }/colors.ts (100%) delete mode 100644 pkgs/clan-app/ui/src/components/icon/index.tsx delete mode 100644 pkgs/clan-app/ui/src/components/inputBase/index.tsx delete mode 100644 pkgs/clan-app/ui/src/components/toast/index.tsx delete mode 100644 pkgs/clan-app/ui/src/components/v2/Button/Button.tsx delete mode 100644 pkgs/clan-app/ui/src/components/v2/README.md delete mode 100644 pkgs/clan-app/ui/src/components/v2/index.css delete mode 100644 pkgs/clan-app/ui/src/contexts/clan.tsx delete mode 100644 pkgs/clan-app/ui/src/floating/index.tsx delete mode 100644 pkgs/clan-app/ui/src/hooks/index.ts delete mode 100644 pkgs/clan-app/ui/src/layout/header.tsx delete mode 100644 pkgs/clan-app/ui/src/layout/layout.tsx delete mode 100644 pkgs/clan-app/ui/src/queries/clan-meta.ts delete mode 100644 pkgs/clan-app/ui/src/routes/clans/create.tsx delete mode 100644 pkgs/clan-app/ui/src/routes/clans/details.tsx delete mode 100644 pkgs/clan-app/ui/src/routes/clans/index.ts delete mode 100644 pkgs/clan-app/ui/src/routes/clans/list.tsx delete mode 100644 pkgs/clan-app/ui/src/routes/components/index.tsx delete mode 100644 pkgs/clan-app/ui/src/routes/hosts/view.tsx delete mode 100644 pkgs/clan-app/ui/src/routes/welcome/index.tsx delete mode 100644 pkgs/clan-app/ui/src/stores/clan.tsx delete mode 100644 pkgs/clan-app/ui/src/three.tsx diff --git a/pkgs/clan-app/ui/.storybook/preview.ts b/pkgs/clan-app/ui/.storybook/preview.ts index 33aafbfb6..b1bbb8cda 100644 --- a/pkgs/clan-app/ui/.storybook/preview.ts +++ b/pkgs/clan-app/ui/.storybook/preview.ts @@ -1,6 +1,5 @@ import type { Preview } from "@kachurun/storybook-solid-vite"; -import "@/src/components/v2/index.css"; import "../src/index.css"; import "./preview.css"; diff --git a/pkgs/clan-app/ui/src/Form/fields/FormSection.tsx b/pkgs/clan-app/ui/src/Form/fields/FormSection.tsx deleted file mode 100644 index 66a17717d..000000000 --- a/pkgs/clan-app/ui/src/Form/fields/FormSection.tsx +++ /dev/null @@ -1,8 +0,0 @@ -import { JSX } from "solid-js"; - -interface FormSectionProps { - children: JSX.Element; -} -const FormSection = (props: FormSectionProps) => { - return
{props.children}
; -}; diff --git a/pkgs/clan-app/ui/src/Form/fields/TextInput.tsx b/pkgs/clan-app/ui/src/Form/fields/TextInput.tsx deleted file mode 100644 index 7487fabb9..000000000 --- a/pkgs/clan-app/ui/src/Form/fields/TextInput.tsx +++ /dev/null @@ -1,57 +0,0 @@ -import { splitProps, type JSX } from "solid-js"; -import { - InputBase, - InputError, - InputLabel, - InputVariant, -} from "@/src/components/inputBase"; -import { FieldLayout } from "./layout"; - -interface TextInputProps { - // Common - error?: string; - required?: boolean; - disabled?: boolean; - // Passed to input - value: string; - inputProps?: JSX.InputHTMLAttributes; - placeholder?: string; - variant?: InputVariant; - // Passed to label - label: JSX.Element; - help?: string; - // Passed to layout - class?: string; -} - -export function TextInput(props: TextInputProps) { - const [layoutProps, rest] = splitProps(props, ["class"]); - return ( - - {props.label} - - } - field={ - - } - error={props.error && } - {...layoutProps} - /> - ); -} diff --git a/pkgs/clan-app/ui/src/Form/fields/index.ts b/pkgs/clan-app/ui/src/Form/fields/index.ts deleted file mode 100644 index 46efa5eec..000000000 --- a/pkgs/clan-app/ui/src/Form/fields/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from "./FormSection"; -export * from "./TextInput"; diff --git a/pkgs/clan-app/ui/src/Form/fields/layout.tsx b/pkgs/clan-app/ui/src/Form/fields/layout.tsx deleted file mode 100644 index 32d4a8888..000000000 --- a/pkgs/clan-app/ui/src/Form/fields/layout.tsx +++ /dev/null @@ -1,26 +0,0 @@ -import { JSX, splitProps } from "solid-js"; -import cx from "classnames"; - -interface LayoutProps extends JSX.HTMLAttributes { - field?: JSX.Element; - label?: JSX.Element; - error?: JSX.Element; -} -export const FieldLayout = (props: LayoutProps) => { - const [intern, divProps] = splitProps(props, [ - "field", - "label", - "error", - "class", - ]); - return ( -
-
{props.label}
-
{props.field}
- {props.error && {props.error}} -
- ); -}; diff --git a/pkgs/clan-app/ui/src/api/index.tsx b/pkgs/clan-app/ui/src/api/index.tsx deleted file mode 100644 index 519062817..000000000 --- a/pkgs/clan-app/ui/src/api/index.tsx +++ /dev/null @@ -1,195 +0,0 @@ -import { API } from "@/api/API"; -import { Schema as Inventory } from "@/api/Inventory"; -import { toast } from "solid-toast"; -import { - ErrorToastComponent, - CancelToastComponent, -} from "@/src/components/toast"; - -type OperationNames = keyof API; -type Services = NonNullable; -type ServiceNames = keyof Services; - -export type OperationArgs = API[T]["arguments"]; -export type OperationResponse = API[T]["return"]; - -export type ClanServiceInstance = NonNullable< - Services[T] ->[string]; - -export type SuccessQuery = Extract< - OperationResponse, - { status: "success" } ->; -export type SuccessData = SuccessQuery["data"]; - -interface SendHeaderType { - logging?: { group_path: string[] }; -} -interface BackendSendType { - body: OperationArgs; - header?: SendHeaderType; -} - -// eslint-disable-next-line @typescript-eslint/no-empty-object-type -interface ReceiveHeaderType {} -interface BackendReturnType { - body: OperationResponse; - header: ReceiveHeaderType; -} - -const _callApi = ( - method: K, - args: OperationArgs, - backendOpts?: SendHeaderType, -): { promise: Promise>; op_key: string } => { - // if window[method] does not exist, throw an error - if (!(method in window)) { - console.error(`Method ${method} not found on window object`); - // return a rejected promise - return { - promise: Promise.resolve({ - body: { - status: "error", - errors: [ - { - message: `Method ${method} not found on window object`, - code: "method_not_found", - }, - ], - op_key: "noop", - }, - header: {}, - }), - op_key: "noop", - }; - } - - const message: BackendSendType = { - body: args, - header: backendOpts, - }; - - const promise = ( - window as unknown as Record< - OperationNames, - ( - args: BackendSendType, - ) => Promise> - > - )[method](message) as Promise>; - - // eslint-disable-next-line @typescript-eslint/no-explicit-any - const op_key = (promise as any)._webviewMessageId as string; - - return { promise, op_key }; -}; - -const handleCancel = async ( - ops_key: string, - orig_task: Promise>, -) => { - console.log("Canceling operation: ", ops_key); - const { promise, op_key } = _callApi("delete_task", { task_id: ops_key }); - promise.catch((error) => { - toast.custom( - (t) => ( - - ), - { - duration: 5000, - }, - ); - console.error("Unhandled promise rejection in callApi:", error); - }); - const resp = await promise; - - if (resp.body.status === "error") { - toast.custom( - (t) => ( - - ), - { - duration: 5000, - }, - ); - } else { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - (orig_task as any).cancelled = true; - } - console.log("Cancel response: ", resp); -}; - -export const callApi = ( - method: K, - args: OperationArgs, - backendOpts?: SendHeaderType, -): { promise: Promise>; op_key: string } => { - console.log("Calling API", method, args, backendOpts); - - const { promise, op_key } = _callApi(method, args, backendOpts); - promise.catch((error) => { - toast.custom( - (t) => ( - - ), - { - duration: 5000, - }, - ); - console.error("Unhandled promise rejection in callApi:", error); - }); - - const toastId = toast.custom( - ( - t, // t is the Toast object, t.id is the id of THIS toast instance - ) => ( - - ), - { - duration: Infinity, - }, - ); - - const new_promise = promise.then((response) => { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - const cancelled = (promise as any).cancelled; - if (cancelled) { - console.log("Not printing toast because operation was cancelled"); - } - - const body = response.body; - if (body.status === "error" && !cancelled) { - toast.remove(toastId); - toast.custom( - (t) => ( - - ), - { - duration: Infinity, - }, - ); - } else { - toast.remove(toastId); - } - return body; - }); - - return { promise: new_promise, op_key: op_key }; -}; diff --git a/pkgs/clan-app/ui/src/api_test.tsx b/pkgs/clan-app/ui/src/api_test.tsx deleted file mode 100644 index 76ab8ac65..000000000 --- a/pkgs/clan-app/ui/src/api_test.tsx +++ /dev/null @@ -1,188 +0,0 @@ -import { - createForm, - FieldValues, - getValues, - setValue, - SubmitHandler, -} from "@modular-forms/solid"; -import { TextInput } from "@/src/Form/fields/TextInput"; -import { Button } from "./components/Button/Button"; -import { callApi } from "./api"; -import { API } from "@/api/API"; -import { createSignal, Match, Switch, For, Show } from "solid-js"; -import { Typography } from "./components/Typography"; -import { useQuery } from "@tanstack/solid-query"; -import { makePersisted } from "@solid-primitives/storage"; -import jsonSchema from "@/api/API.json"; - -interface APITesterForm extends FieldValues { - endpoint: string; - payload: string; -} - -const ACTUAL_API_ENDPOINT_NAMES: (keyof API)[] = jsonSchema.required.map( - (key) => key as keyof API, -); - -export const ApiTester = () => { - const [persistedTestData, setPersistedTestData] = makePersisted( - createSignal(), - { - name: "_test_data", - storage: localStorage, - }, - ); - - const [formStore, { Form, Field }] = createForm({ - initialValues: persistedTestData() || { endpoint: "", payload: "" }, - }); - - const [endpointSearchTerm, setEndpointSearchTerm] = createSignal( - getValues(formStore).endpoint || "", - ); - const [showSuggestions, setShowSuggestions] = createSignal(false); - - const filteredEndpoints = () => { - const term = endpointSearchTerm().toLowerCase(); - if (!term) return ACTUAL_API_ENDPOINT_NAMES; - return ACTUAL_API_ENDPOINT_NAMES.filter((ep) => - ep.toLowerCase().includes(term), - ); - }; - - const query = useQuery(() => { - const currentEndpoint = getValues(formStore).endpoint; - const currentPayload = getValues(formStore).payload; - const values = getValues(formStore); - - return { - queryKey: ["api-tester", currentEndpoint, currentPayload], - queryFn: async () => { - return await callApi( - values.endpoint as keyof API, - JSON.parse(values.payload || "{}"), - ).promise; - }, - staleTime: Infinity, - enabled: false, - }; - }); - - const handleSubmit: SubmitHandler = (values) => { - console.log(values); - setPersistedTestData(values); - setEndpointSearchTerm(values.endpoint); - query.refetch(); - - const v = getValues(formStore); - console.log(v); - }; - return ( -
-

API Tester

-
-
- - {(field, fieldProps) => ( -
- { - if (fieldProps.onInput) { - (fieldProps.onInput as (ev: Event) => void)(e); - } - setEndpointSearchTerm( - (e.currentTarget as HTMLInputElement).value, - ); - setShowSuggestions(true); - }, - onBlur: (e: FocusEvent) => { - if (fieldProps.onBlur) { - (fieldProps.onBlur as (ev: FocusEvent) => void)(e); - } - setTimeout(() => setShowSuggestions(false), 150); - }, - onFocus: (e: FocusEvent) => { - setEndpointSearchTerm(field.value || ""); - setShowSuggestions(true); - }, - onKeyDown: (e: KeyboardEvent) => { - if (e.key === "Escape") { - setShowSuggestions(false); - } - }, - }} - /> - 0} - > -
    - - {(ep) => ( -
  • { - e.preventDefault(); - setValue(formStore, "endpoint", ep); - setEndpointSearchTerm(ep); - setShowSuggestions(false); - }} - > - {ep} -
  • - )} -
    -
-
-
- )} -
- - {(field, fieldProps) => ( -
- -