import type { EntityData } from "data"; import { useState } from "react"; import { useEntityMutate } from "ui/client"; import { useBkndData } from "ui/client/schema/data/use-bknd-data"; import { Button } from "ui/components/buttons/Button"; import { Message } from "ui/components/display/Message"; import { useBrowserTitle } from "ui/hooks/use-browser-title"; import { useSearch } from "ui/hooks/use-search"; import * as AppShell from "ui/layouts/AppShell/AppShell"; import { Breadcrumbs2 } from "ui/layouts/AppShell/Breadcrumbs2"; import { routes } from "ui/lib/routes"; import { EntityForm } from "ui/modules/data/components/EntityForm"; import { useEntityForm } from "ui/modules/data/hooks/useEntityForm"; import * as tbbox from "@sinclair/typebox"; const { Type } = tbbox; export function DataEntityCreate({ params }) { const { $data } = useBkndData(); const entity = $data.entity(params.entity as string); if (!entity) { return ; } else if (entity.type === "system") { return ; } const [error, setError] = useState(null); useBrowserTitle(["Data", entity.label, "Create"]); const $q = useEntityMutate(entity.name); // @todo: use entity schema for prefilling const search = useSearch(Type.Object({}), {}); function goBack() { window.history.go(-1); } async function onSubmitted(changeSet?: EntityData) { console.log("create:changeSet", changeSet); if (!changeSet) return; try { await $q.create(changeSet); if (error) setError(null); // @todo: navigate to created? goBack(); } catch (e) { setError(e instanceof Error ? e.message : "Failed to create"); } } const { Form, handleSubmit } = useEntityForm({ action: "create", entity: entity, initialData: search.value, onSubmitted, }); const fieldsDisabled = $q.isLoading || $q.isValidating || Form.state.isSubmitting; return ( <> [state.canSubmit, state.isSubmitting]} children={([canSubmit, isSubmitting]) => ( )} /> } > {error && (
Create failed: {error}
)}
); }