"use client"; import { FC, useCallback, useState } from "react"; import AnimatedPageContainer from "@/components/AnimatedPageContainer"; import { TypeEditor } from "./type-editor"; import { useObjectStateWrapper } from "@/hooks/useObjectState"; import { useInput } from "../../hooks/useInput"; import { useRecoilState, useResetRecoilState } from "recoil"; import { SchemaEditAtom } from "@/recoil/atoms/schema"; import { SchemaViewer } from "./schema-viewer"; import { TemplateEditor } from "./template-editor"; import { Icon } from "@/components/Icon"; import { useParams } from "next/navigation"; import { FieldTypes } from "./fieldtypes"; import { prisma } from "@/prisma/prismaClient"; export const SchemaBuilder: FC = () => { const [schema, setSchema] = useRecoilState(SchemaEditAtom); const resetSchema = useResetRecoilState(SchemaEditAtom); const { update: updateSchema, bindProperty: bindSchemaProperty } = useObjectStateWrapper(schema, setSchema); const { schemaId, gameSystemId } = useParams<{ schemaId: string; gameSystemId?: string; }>(); const { value: typeName, bind: bindTypeName, reset: resetTypeName, } = useInput(""); const [pageNumber, setPageNumber] = useState(0); const [lastSaved, setLastSaved] = useState(schema); const [selectedType, setSelectedType] = useState(""); const saveType = useCallback( (name: string, type: TypeType) => { updateSchema((e) => ({ types: { ...e.types, [name]: type, }, })); resetTypeName(); setPageNumber(0); setSelectedType(""); }, [resetTypeName, updateSchema] ); const saveSchema = useCallback(async () => { // "use server"; // setLastSaved(schema); // await prisma.schema.upsert({ // where: { id: schema.id }, // update: { ...schema }, // create: { // name: schema.name, // schema: schema.schema, // types: schema.types, // version: 0, // gameSystemId, // }, // }); }, [schema, gameSystemId]); const selectTypeForEdit = useCallback((typeKey: string) => { setSelectedType(typeKey); setPageNumber(1); }, []); const { value: schemaFieldName, bind: bindSchemaFieldName, reset: resetSchemaFieldName, } = useInput("", { disallowSpaces: true }); const addSchemaField = useCallback(() => { updateSchema((s) => ({ schema: { ...s.schema, [schemaFieldName]: { display: "", type: FieldTypes.any, }, }, })); resetSchemaFieldName(); }, [resetSchemaFieldName, schemaFieldName, updateSchema]); const updateSchemaField = useCallback( (key: string, template: Template) => { updateSchema((s) => ({ schema: { ...s.schema, [key]: template, }, })); }, [updateSchema] ); const deleteType = useCallback( (key: string) => { updateSchema((s) => { const types = { ...s.types }; delete types[key]; return { types }; }); }, [updateSchema] ); return (

Add Schema Field

    {Object.entries(schema.schema).map( ([schemaFieldKey, schemaField]) => ( ) )}

Add a type

    {Object.keys(schema.types).map((t) => (
  • {t}
  • ))}
); };