"use client"; import { FC, useCallback, useEffect, useState } from "react"; import AnimatedPageContainer from "@/components/AnimatedPageContainer"; import { TypeEditor } from "./type-editor"; import { useObjectStateWrapper } from "@/hooks/useObjectState"; import { useInput } from "../../hooks/useInput"; 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 { findSchema, saveSchemaDb } from "@/actions/Schemas/index"; import { useToast } from "../toast"; import { useAtom } from "jotai"; import { Schema, TypeType } from "@/types"; import { TrashIcon } from "@heroicons/react/24/solid"; import { PencilSquareIcon } from "@heroicons/react/24/solid"; export const SchemaBuilder: FC = () => { const [schema, setSchema] = useAtom(SchemaEditAtom); // const resetSchema = useResetRecoilState(SchemaEditAtom); const { createToast } = useToast(); const { update: updateSchema, bindProperty: bindSchemaProperty } = useObjectStateWrapper(schema, setSchema); const { schemaId, id: gameSystemId } = useParams<{ schemaId: string; id: string; }>(); useEffect(() => { if (schemaId !== "create" && schemaId !== schema.id) findSchema(schemaId, 0).then((sc) => { if (!sc) return; setSchema(sc); }); }, [schema.id, schemaId, setSchema]); useEffect(() => { if (gameSystemId && !schema.gameSystemId) setSchema((sc) => ({ ...sc, gameSystemId })); }, [gameSystemId, schema.gameSystemId, setSchema]); 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 () => { createToast({ msg: "Saving Schema", fading: true }); await saveSchemaDb(schema, schema.version); }, [createToast, schema]); const selectTypeForEdit = useCallback((typeKey: string) => { setSelectedType(typeKey); setPageNumber(1); }, []); const { value: schemaFieldName, bind: bindSchemaFieldName, reset: resetSchemaFieldName, } = useInput("", { disallowSpaces: true }); const addSchemaField = useCallback(() => { updateSchema((s) => ({ fields: { ...s.fields, [schemaFieldName]: FieldTypes.any, }, })); resetSchemaFieldName(); }, [resetSchemaFieldName, schemaFieldName, updateSchema]); const updateSchemaField = useCallback( (key: string, fieldType: FieldTypes) => { updateSchema((s) => ({ fields: { ...s.fields, [key]: fieldType, }, })); }, [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.fields).map( ([schemaFieldKey, schemaField]) => ( ), )}

Add a type

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