"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"; export const SchemaBuilder: FC = () => { const [schema, setSchema] = useRecoilState(SchemaEditAtom); const resetSchema = useResetRecoilState(SchemaEditAtom); const { update: updateSchema, bindProperty: bindSchemaProperty } = useObjectStateWrapper(schema, setSchema); const { schemaId } = useParams<{ schemaId: 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 () => { setLastSaved(schema); // const sid = await GameSystemsService.saveSchema(schema); // if (schemaId === 'new') navigate('/schema/'+sid) }, [schema]); const selectTypeForEdit = useCallback((typeKey: string) => { setSelectedType(typeKey); setPageNumber(1); }, []); const { value: schemaFieldName, bind: bindTemplateName, reset: resetTemplateName, } = useInput("", { disallowSpaces: true }); const addSchemaField = useCallback(() => { updateSchema((s) => ({ schema: { ...s.schema, [schemaFieldName]: { display: "", type: FieldTypes.any, }, }, })); resetTemplateName(); }, [resetTemplateName, 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}
  • ))}
); };