import React, { useCallback, useEffect, useMemo, useState } from "react"; import type { Meta, StoryObj } from "@storybook/react"; const meta: Meta = { title: "Layout/Editor", parameters: { layout: "fullscreen", }, }; export default meta; type Story = StoryObj; const SERVER_URL = "http://localhost:4001/layout"; function LayoutEditor() { const [value, setValue] = useState(""); const [status, setStatus] = useState("Idle"); const [error, setError] = useState(""); const isJsonValid = useMemo(() => { try { JSON.parse(value); return true; } catch { return false; } }, [value]); const load = useCallback(async () => { setStatus("Loading..."); setError(""); try { const res = await fetch(SERVER_URL); if (!res.ok) { throw new Error(`Load failed (${res.status})`); } const json = await res.json(); setValue(JSON.stringify(json, null, 2)); setStatus("Loaded"); } catch (err) { setError(err instanceof Error ? err.message : "Load failed"); setStatus("Error"); } }, []); const save = useCallback(async () => { if (!isJsonValid) { setError("JSON is invalid. Fix it before saving."); setStatus("Error"); return; } setStatus("Saving..."); setError(""); try { const res = await fetch(SERVER_URL, { method: "POST", headers: { "Content-Type": "application/json" }, body: value, }); if (!res.ok) { const text = await res.text(); throw new Error(`Save failed (${res.status}): ${text}`); } setStatus("Saved"); } catch (err) { setError(err instanceof Error ? err.message : "Save failed"); setStatus("Error"); } }, [isJsonValid, value]); useEffect(() => { load(); }, [load]); return (
Edit the JSON layout config and save it back to the repo.