import { useEffect, useMemo, useState } from "react"; import { Accordion, AccordionHeader, AccordionItem, AccordionPanel, Field, Input, Text, } from "@fluentui/react-components"; import type { ActionConfig, ActionConfigUpdate } from "../../types/config"; import { useAutoSave } from "../../hooks/useAutoSave"; import { AutoSaveIndicator } from "./AutoSaveIndicator"; import { useConfigStyles } from "./configStyles"; import { CommandField } from "./CommandField"; import { KVEditor } from "./KVEditor"; interface ActionFormEditorProps { config: ActionConfig; onSave: (update: ActionConfigUpdate) => Promise; } export function ActionFormEditor({ config, onSave }: ActionFormEditorProps): React.JSX.Element { const styles = useConfigStyles(); const [before, setBefore] = useState(config.before ?? ""); const [after, setAfter] = useState(config.after ?? ""); const [actionstart, setActionstart] = useState(config.actionstart ?? ""); const [actionstop, setActionstop] = useState(config.actionstop ?? ""); const [actioncheck, setActioncheck] = useState(config.actioncheck ?? ""); const [actionban, setActionban] = useState(config.actionban ?? ""); const [actionunban, setActionunban] = useState(config.actionunban ?? ""); const [actionflush, setActionflush] = useState(config.actionflush ?? ""); const [definitionVars, setDefinitionVars] = useState>(config.definition_vars); const [initVars, setInitVars] = useState>(config.init_vars); useEffect(() => { setBefore(config.before ?? ""); setAfter(config.after ?? ""); setActionstart(config.actionstart ?? ""); setActionstop(config.actionstop ?? ""); setActioncheck(config.actioncheck ?? ""); setActionban(config.actionban ?? ""); setActionunban(config.actionunban ?? ""); setActionflush(config.actionflush ?? ""); setDefinitionVars(config.definition_vars); setInitVars(config.init_vars); }, [config]); const autoSavePayload = useMemo(() => ({ before: before.trim() || null, after: after.trim() || null, actionstart: actionstart.trim() || null, actionstop: actionstop.trim() || null, actioncheck: actioncheck.trim() || null, actionban: actionban.trim() || null, actionunban: actionunban.trim() || null, actionflush: actionflush.trim() || null, definition_vars: definitionVars, init_vars: initVars, }), [after, actionban, actioncheck, actionflush, actionstart, actionstop, actionunban, before, definitionVars, initVars]); const { status: saveStatus, errorText: saveErrorText, retry: retrySave } = useAutoSave(autoSavePayload, onSave); const defVarCount = Object.keys(definitionVars).length; const initVarCount = Object.keys(initVars).length; return (
{config.filename}
Includes
{ setBefore(d.value); }} placeholder="e.g. iptables-common.conf" className={styles.codeInput} /> { setAfter(d.value); }} className={styles.codeInput} />
Lifecycle commands
{`Definition variables (${String(defVarCount)})`}
{`Init variables (${String(initVarCount)})`}
); }