diff --git a/frontend/src/components/scripts/ScriptConfigurePane.tsx b/frontend/src/components/scripts/ScriptConfigurePane.tsx new file mode 100644 index 00000000..ee107cc6 --- /dev/null +++ b/frontend/src/components/scripts/ScriptConfigurePane.tsx @@ -0,0 +1,213 @@ +import { useState } from 'react' +import { ArrowLeft, Terminal, Download, Loader2, AlertTriangle, Copy, Check } from 'lucide-react' +import { cn } from '@/lib/utils' +import { useScriptGeneratorStore } from '@/store/scriptGeneratorStore' +import { ScriptParameterForm } from './ScriptParameterForm' + +const COMPLEXITY_CLASSES = { + beginner: 'text-emerald-400 bg-emerald-400/10 border-emerald-400/20', + intermediate: 'text-amber-400 bg-amber-400/10 border-amber-400/20', + advanced: 'text-rose-500 bg-rose-500/10 border-rose-500/20', +} as const + +interface Props { + canGenerate: boolean + onBack: () => void +} + +export function ScriptConfigurePane({ canGenerate, onBack }: Props) { + const selectedTemplate = useScriptGeneratorStore(s => s.selectedTemplate) + const isLoadingDetail = useScriptGeneratorStore(s => s.isLoadingDetail) + const categories = useScriptGeneratorStore(s => s.categories) + const generatedScript = useScriptGeneratorStore(s => s.generatedScript) + const generationWarnings = useScriptGeneratorStore(s => s.generationWarnings) + const isGenerating = useScriptGeneratorStore(s => s.isGenerating) + const generateError = useScriptGeneratorStore(s => s.generateError) + const generate = useScriptGeneratorStore(s => s.generate) + + const [copied, setCopied] = useState(false) + + const handleCopy = async () => { + if (!generatedScript) return + try { + await navigator.clipboard.writeText(generatedScript) + setCopied(true) + setTimeout(() => setCopied(false), 2000) + } catch { + // silently fail + } + } + + const handleDownload = () => { + if (!generatedScript || !selectedTemplate) return + const blob = new Blob([generatedScript], { type: 'text/plain' }) + const url = URL.createObjectURL(blob) + const a = document.createElement('a') + a.href = url + a.download = `${selectedTemplate.slug}.ps1` + document.body.appendChild(a) + a.click() + document.body.removeChild(a) + URL.revokeObjectURL(url) + } + + // Loading state + if (isLoadingDetail) { + return ( +
Failed to load template.
+{selectedTemplate.description}
+ )} +{w}
+ ))} +{generateError}
+ )} +