import { useEffect, useState } from "react"; import { Link, useLocation, useNavigate, useParams } from "react-router-dom"; import { LuArrowLeft, LuPlay, LuSave } from "react-icons/lu"; import { errorMessage } from "../api/client.js"; import { useSaveScript, useScript } from "../api/hooks.js"; import { CodeEditor } from "../components/CodeEditor.jsx"; import { ScriptIcon } from "../components/ScriptIcon.jsx"; import { ScriptMetaPanel } from "../components/ScriptMetaPanel.jsx"; import { NEW_SCRIPT_TEMPLATE, normalizeScriptName } from "../lib/script.js"; import { useNotifications } from "../notifications.jsx"; export function ScriptNewPage() { const navigate = useNavigate(); const location = useLocation(); const [name, setName] = useState(""); const [content, setContent] = useState( location.state?.content ?? NEW_SCRIPT_TEMPLATE, ); const save = useSaveScript(); function onSave(e) { e.preventDefault(); const file = normalizeScriptName(name); if (!file) return; save.mutate( { name: file, content }, { onSuccess: () => navigate(`/scripts/${encodeURIComponent(file)}/edit`), }, ); } function openDryRun() { const file = normalizeScriptName(name); if (!file) return; navigate(`/scripts/${encodeURIComponent(file)}/dry-run`, { state: { content }, }); } return (

New script

setName(e.target.value)} required />
{save.isError ? (

{errorMessage(save.error)}

) : null}
); } export function ScriptEditPage() { const { name: rawName } = useParams(); const name = decodeURIComponent(rawName ?? ""); const navigate = useNavigate(); const { notify } = useNotifications(); const existing = useScript(name); const save = useSaveScript(); const [content, setContent] = useState(""); const [contentReady, setContentReady] = useState(false); useEffect(() => { if (existing.isLoading) return; if (existing.data?.content != null) { setContent(existing.data.content); setContentReady(true); } }, [existing.data, existing.isLoading]); function onSave(e) { e.preventDefault(); save.mutate( { name, content }, { onSuccess: () => notify.success("Script saved") }, ); } function openDryRun() { navigate(`/scripts/${encodeURIComponent(name)}/dry-run`, { state: { content }, }); } if (existing.isLoading) { return (
); } if (existing.isError) { return (
Back

Script not found

); } return (

{name}

Input / output
{save.isError ? (

{errorMessage(save.error)}

) : null}
); }