import { AlertTriangle, Save, X } from 'lucide-react'; import { useState, useEffect } from 'react'; import { CSPBuilder } from './CSPBuilder'; import { PermissionsPolicyBuilder } from './PermissionsPolicyBuilder'; import { SecurityScoreDisplay } from './SecurityScoreDisplay'; import { Alert } from './ui/Alert'; import { Button } from './ui/Button'; import { Card } from './ui/Card'; import { Input } from './ui/Input'; import { NativeSelect } from './ui/NativeSelect'; import { Switch } from './ui/Switch'; import { Textarea } from './ui/Textarea'; import { useCalculateSecurityScore } from '../hooks/useSecurityHeaders'; import type { SecurityHeaderProfile, CreateProfileRequest } from '../api/securityHeaders'; interface SecurityHeaderProfileFormProps { initialData?: SecurityHeaderProfile; onSubmit: (data: CreateProfileRequest) => void; onCancel: () => void; onDelete?: () => void; isLoading?: boolean; isDeleting?: boolean; } export function SecurityHeaderProfileForm({ initialData, onSubmit, onCancel, onDelete, isLoading, isDeleting, }: SecurityHeaderProfileFormProps) { const [formData, setFormData] = useState({ name: initialData?.name || '', description: initialData?.description || '', hsts_enabled: initialData?.hsts_enabled ?? true, hsts_max_age: initialData?.hsts_max_age || 31536000, hsts_include_subdomains: initialData?.hsts_include_subdomains ?? true, hsts_preload: initialData?.hsts_preload ?? false, csp_enabled: initialData?.csp_enabled ?? false, csp_directives: initialData?.csp_directives || '', csp_report_only: initialData?.csp_report_only ?? false, csp_report_uri: initialData?.csp_report_uri || '', x_frame_options: initialData?.x_frame_options || 'DENY', x_content_type_options: initialData?.x_content_type_options ?? true, referrer_policy: initialData?.referrer_policy || 'strict-origin-when-cross-origin', permissions_policy: initialData?.permissions_policy || '', cross_origin_opener_policy: initialData?.cross_origin_opener_policy || 'same-origin', cross_origin_resource_policy: initialData?.cross_origin_resource_policy || 'same-origin', cross_origin_embedder_policy: initialData?.cross_origin_embedder_policy || '', xss_protection: initialData?.xss_protection ?? true, cache_control_no_store: initialData?.cache_control_no_store ?? false, }); const [cspValid, setCspValid] = useState(true); const [, setCspErrors] = useState([]); const calculateScoreMutation = useCalculateSecurityScore(); const { mutate: calculateScore } = calculateScoreMutation; // Calculate score when form data changes useEffect(() => { const timer = setTimeout(() => { calculateScore(formData); }, 500); return () => clearTimeout(timer); }, [formData, calculateScore]); const handleSubmit = (e: React.FormEvent) => { e.preventDefault(); if (!formData.name.trim()) { return; } onSubmit(formData); }; const updateField = ( field: K, value: CreateProfileRequest[K] ) => { setFormData((prev) => ({ ...prev, [field]: value })); }; const isPreset = initialData?.is_preset ?? false; return (
{/* Basic Info */}

Profile Information

updateField('name', e.target.value)} placeholder="e.g., Production Security Headers" required disabled={isPreset} />