diff --git a/pkgs/clan-app/ui/src/hooks/api.ts b/pkgs/clan-app/ui/src/hooks/api.ts index 1d93671fc..f5341c15d 100644 --- a/pkgs/clan-app/ui/src/hooks/api.ts +++ b/pkgs/clan-app/ui/src/hooks/api.ts @@ -91,7 +91,10 @@ export const callApi = ( return { uuid: op_key, - result: result.then(({ body }) => body), + result: result.then(({ body }) => { + console.debug(`API call ${method}`, body); + return body; + }), cancel: async () => { console.log("Cancelling api call: ", op_key); await callApi("delete_task", { task_id: op_key }).result; diff --git a/pkgs/clan-app/ui/src/hooks/queries.ts b/pkgs/clan-app/ui/src/hooks/queries.ts index b276f826d..22042ba33 100644 --- a/pkgs/clan-app/ui/src/hooks/queries.ts +++ b/pkgs/clan-app/ui/src/hooks/queries.ts @@ -222,3 +222,41 @@ export const useMachineHardwareSummary = ( }, })); }; + +export type MachineDiskSchema = SuccessData<"get_machine_disk_schemas">; +export type MachineDiskSchemaQuery = UseQueryResult; + +export const useMachineDiskSchemas = ( + clanUri: string, + machineName: string, +): MachineDiskSchemaQuery => { + const client = useApiClient(); + return useQuery(() => ({ + queryKey: [ + "clans", + encodeBase64(clanUri), + "machines", + machineName, + "disk_schemas", + ], + queryFn: async () => { + const call = client.fetch("get_machine_disk_schemas", { + machine: { + flake: { + identifier: clanUri, + }, + name: machineName, + }, + }); + const result = await call.result; + + if (result.status === "error") { + // todo should we create some specific error types? + console.error("Error fetching clan details:", result.errors); + throw new Error(result.errors[0].message); + } + + return result.data; + }, + })); +}; diff --git a/pkgs/clan-app/ui/src/routes/Machine/Machine.tsx b/pkgs/clan-app/ui/src/routes/Machine/Machine.tsx index 119b7ed04..b20d65a4c 100644 --- a/pkgs/clan-app/ui/src/routes/Machine/Machine.tsx +++ b/pkgs/clan-app/ui/src/routes/Machine/Machine.tsx @@ -23,13 +23,13 @@ export const Machine = (props: RouteSectionProps) => {
(container = el)} > ; }; } diff --git a/pkgs/clan-app/ui/src/workflows/Install/steps/createInstaller.tsx b/pkgs/clan-app/ui/src/workflows/Install/steps/createInstaller.tsx index 378ea6af7..473931a58 100644 --- a/pkgs/clan-app/ui/src/workflows/Install/steps/createInstaller.tsx +++ b/pkgs/clan-app/ui/src/workflows/Install/steps/createInstaller.tsx @@ -21,8 +21,7 @@ import { useSystemStorageOptions, } from "@/src/hooks/queries"; import { useApiClient } from "@/src/hooks/ApiClient"; -import { createEffect, onMount } from "solid-js"; -import { create } from "storybook/internal/theming"; +import { onMount } from "solid-js"; const Prose = () => ( { const call = client.fetch("run_machine_hardware_info", { target_host: { address: store.install.targetHost, - command_prefix: "D0 YOU SEE ME LEAKING?", }, opts: { - backend: "nixos-facter", machine: { flake: { identifier: clanUri, @@ -199,17 +200,28 @@ const DiskSchema = v.object({ type DiskForm = v.InferInput; const ConfigureDisk = () => { + const stepSignal = useStepper(); + const [store, set] = getStepStore(stepSignal); + const [formStore, { Form, Field }] = createForm({ validate: valiForm(DiskSchema), + initialValues: { + mainDisk: store.install?.mainDisk, + }, }); - const stepSignal = useStepper(); const handleSubmit: SubmitHandler = (values, event) => { - console.log("submitted", values); - // Here you would typically trigger the ISO creation process + console.log("disk submitted", values); + + set("install", (s) => ({ ...s, mainDisk: values.mainDisk })); stepSignal.next(); }; + const diskSchemasQuery = useMachineDiskSchemas( + useClanURI(), + store.install.machineName, + ); + return (
{ {(field, props) => (