import { useEffect, useState } from 'react'; import { useNavigate, useParams } from 'react-router-dom'; import { useTranslation } from 'react-i18next'; import { scenarios, steps } from '../../api'; import type { Scenario, ScenarioStep, StepType } from '../../api'; import { Breadcrumbs, Button, Card, Input, Select } from '../../ui'; import styles from '../Page.module.css'; const STEP_TYPES: StepType[] = ['login', 'exec', 'sign']; export function EditStepPage() { const { t } = useTranslation(); const { id, stepId } = useParams<{ id: string; stepId: string }>(); const navigate = useNavigate(); const [scenario, setScenario] = useState(null); const [step, setStep] = useState(null); const [order, setOrder] = useState(''); const [title, setTitle] = useState(''); const [type, setType] = useState('exec'); const [sessionName, setSessionName] = useState(''); const [execCode, setExecCode] = useState(''); const [validateCode, setValidateCode] = useState(''); const [sessionError, setSessionError] = useState(''); const [orderError, setOrderError] = useState(''); const [loading, setLoading] = useState(true); const [saving, setSaving] = useState(false); const [error, setError] = useState(null); useEffect(() => { if (!id || !stepId) return; Promise.all([scenarios.get(Number(id)), steps.get(Number(id), Number(stepId))]) .then(([sc, st]) => { setScenario(sc); setStep(st); setOrder(String(st.order)); setTitle(st.title ?? ''); setType(st.type); setSessionName(st.sessionName); setExecCode(st.execCode ?? ''); setValidateCode(st.validateCode ?? ''); }) .catch((err: Error) => setError(err.message)) .finally(() => setLoading(false)); }, [id, stepId]); const validate = (): boolean => { let valid = true; if (!sessionName.trim()) { setSessionError(t('steps.form_session_required')); valid = false; } if (isNaN(Number(order)) || Number(order) < 0) { setOrderError(t('steps.form_order_invalid')); valid = false; } return valid; }; const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); if (!validate()) return; setSaving(true); setError(null); try { await steps.update(Number(id), Number(stepId), { order: Number(order), title: title.trim() || undefined, type, sessionName: sessionName.trim(), execCode: execCode.trim() || undefined, validateCode: validateCode.trim() || undefined, }); navigate(`/scenarios/${id}`); } catch (err) { setError((err as Error).message); } finally { setSaving(false); } }; return (
navigate('/scenarios') }, { label: scenario?.name ?? `#${id}`, onClick: () => navigate(`/scenarios/${id}`), }, { label: t('steps.edit_title', { order: step?.order ?? stepId }) }, ]} />
{error &&

{error}

} {loading &&

{t('steps.loading')}

} {!loading && step && (
{ setOrder(e.target.value); setOrderError(''); }} error={orderError || undefined} /> setTitle(e.target.value)} /> { setSessionName(e.target.value); setSessionError(''); }} error={sessionError || undefined} required />