import { useState, useEffect } from "react"; import { useQuery } from "@tanstack/react-query"; import { Loader2 } from "lucide-react"; import { getTechniques, type TechniqueSummary } from "../api/techniques"; import type { TestResult } from "../types/models"; export interface TestFormData { technique_id: string; name: string; description: string; platform: string; procedure_text: string; tool_used: string; result?: TestResult; } interface TestFormProps { initialData?: Partial; preselectedTechniqueId?: string; onSubmit: (data: TestFormData) => void; isSubmitting: boolean; showResult?: boolean; } const PLATFORMS = [ { value: "", label: "Select platform" }, { value: "windows", label: "Windows" }, { value: "linux", label: "Linux" }, { value: "macos", label: "macOS" }, { value: "cloud", label: "Cloud" }, { value: "network", label: "Network" }, ]; const RESULTS: { value: TestResult | ""; label: string }[] = [ { value: "", label: "Select result (optional)" }, { value: "detected", label: "Detected" }, { value: "not_detected", label: "Not Detected" }, { value: "partially_detected", label: "Partially Detected" }, ]; export default function TestForm({ initialData, preselectedTechniqueId, onSubmit, isSubmitting, showResult = false, }: TestFormProps) { const [formData, setFormData] = useState({ technique_id: preselectedTechniqueId || initialData?.technique_id || "", name: initialData?.name || "", description: initialData?.description || "", platform: initialData?.platform || "", procedure_text: initialData?.procedure_text || "", tool_used: initialData?.tool_used || "", result: initialData?.result, }); const [errors, setErrors] = useState>({}); const { data: techniques, isLoading: techniquesLoading } = useQuery({ queryKey: ["techniques"], queryFn: () => getTechniques(), }); // Update technique_id when preselected changes useEffect(() => { if (preselectedTechniqueId) { setFormData((prev) => ({ ...prev, technique_id: preselectedTechniqueId })); } }, [preselectedTechniqueId]); const handleChange = ( e: React.ChangeEvent ) => { const { name, value } = e.target; setFormData((prev) => ({ ...prev, [name]: value })); // Clear error when user starts typing if (errors[name]) { setErrors((prev) => ({ ...prev, [name]: "" })); } }; const validate = (): boolean => { const newErrors: Record = {}; if (!formData.technique_id) { newErrors.technique_id = "Technique is required"; } if (!formData.name.trim()) { newErrors.name = "Name is required"; } setErrors(newErrors); return Object.keys(newErrors).length === 0; }; const handleSubmit = (e: React.FormEvent) => { e.preventDefault(); if (validate()) { onSubmit({ ...formData, result: formData.result || undefined, }); } }; return (
{/* Technique Selector */}
{errors.technique_id && (

{errors.technique_id}

)}
{/* Name */}
{errors.name &&

{errors.name}

}
{/* Description */}