import { useState } from "react"; import { useParams, useNavigate } from "react-router-dom"; import { useQuery, useMutation, useQueryClient } from "@tanstack/react-query"; import { Loader2, AlertCircle, ArrowLeft, CheckCircle, Clock, Shield, FileText, ExternalLink, Plus, Check, X, AlertTriangle, BookOpen, FlaskConical, } from "lucide-react"; import { getTechniqueByMitreId, markTechniqueReviewed } from "../api/techniques"; import { getTemplatesByTechnique } from "../api/test-templates"; import { useAuth } from "../context/AuthContext"; import TestFromTemplateForm from "../components/TestFromTemplateForm"; import type { TechniqueStatus, TestState, TestResult } from "../types/models"; const statusBadgeColors: Record = { validated: "bg-green-900/50 text-green-400 border-green-500/30", partial: "bg-yellow-900/50 text-yellow-400 border-yellow-500/30", in_progress: "bg-blue-900/50 text-blue-400 border-blue-500/30", not_covered: "bg-red-900/50 text-red-400 border-red-500/30", not_evaluated: "bg-gray-800/50 text-gray-400 border-gray-600/30", review_required: "bg-orange-900/50 text-orange-400 border-orange-500/30", }; const testStateBadgeColors: Record = { draft: "bg-gray-800/50 text-gray-400 border-gray-600/30", red_executing: "bg-orange-900/50 text-orange-400 border-orange-500/30", blue_evaluating: "bg-indigo-900/50 text-indigo-400 border-indigo-500/30", in_review: "bg-blue-900/50 text-blue-400 border-blue-500/30", validated: "bg-green-900/50 text-green-400 border-green-500/30", rejected: "bg-red-900/50 text-red-400 border-red-500/30", }; const testResultBadgeColors: Record = { detected: "bg-green-900/50 text-green-400 border-green-500/30", not_detected: "bg-red-900/50 text-red-400 border-red-500/30", partially_detected: "bg-yellow-900/50 text-yellow-400 border-yellow-500/30", }; export default function TechniqueDetailPage() { const { mitreId } = useParams<{ mitreId: string }>(); const navigate = useNavigate(); const queryClient = useQueryClient(); const { user } = useAuth(); const [templateFormId, setTemplateFormId] = useState(null); const canReview = user?.role === "admin" || user?.role === "red_lead" || user?.role === "blue_lead"; const { data: technique, isLoading, error, } = useQuery({ queryKey: ["technique", mitreId], queryFn: () => getTechniqueByMitreId(mitreId!), enabled: !!mitreId, }); const { data: templates = [], isLoading: isTemplatesLoading } = useQuery({ queryKey: ["templates-for-technique", mitreId], queryFn: () => getTemplatesByTechnique(mitreId!), enabled: !!mitreId, }); const reviewMutation = useMutation({ mutationFn: () => markTechniqueReviewed(mitreId!), onSuccess: () => { queryClient.invalidateQueries({ queryKey: ["technique", mitreId] }); queryClient.invalidateQueries({ queryKey: ["techniques"] }); }, }); if (isLoading) { return (
); } if (error || !technique) { return (

Failed to load technique

); } const formatDate = (dateStr: string | null) => { if (!dateStr) return "—"; return new Date(dateStr).toLocaleDateString("en-US", { year: "numeric", month: "short", day: "numeric", hour: "2-digit", minute: "2-digit", }); }; return (
{/* Back button */} {/* Header */}

{technique.mitre_id}

{technique.status_global.replace(/_/g, " ")} {technique.review_required && ( Review Required )}

{technique.name}

{canReview && technique.review_required && ( )}
{/* Info Section */}
{/* Description */}

Description

{technique.description || "No description available."}

{/* Metadata */}

Details

Tactic
{technique.tactic?.replace(/-/g, " ") || "—"}
Platforms
{technique.platforms && technique.platforms.length > 0 ? ( technique.platforms.map((p) => ( {p} )) ) : ( )}
Subtechnique
{technique.is_subtechnique ? `Yes (${technique.parent_mitre_id})` : "No"}
Last Review
{formatDate(technique.last_review_date)}
MITRE Version
{technique.mitre_version || "—"}
{/* Tests Section */}

Associated Tests

{technique.tests && technique.tests.length > 0 ? (
{technique.tests.map((test) => ( ))}
Name State Result Platform Created Actions
{test.name} {test.state.replace(/_/g, " ")} {test.result ? ( {test.result.replace(/_/g, " ")} ) : ( )} {test.platform || "—"} {formatDate(test.created_at)}
{canReview && test.state === "draft" && ( <> )}
) : (

No tests have been created for this technique yet.

)}
{/* Available Test Templates Section */}

Available Test Templates

{isTemplatesLoading ? (
) : templates.length > 0 ? (
{templates.map((tpl) => (

{tpl.name}

{tpl.source === "atomic_red_team" ? "Atomic" : tpl.source} {tpl.platform && ( {tpl.platform} )} {tpl.severity && ( {tpl.severity} )}
))}
) : (

No test templates available for this technique.

)}
{/* Intel Items Section */} {technique.intel_items && technique.intel_items.length > 0 && (

Threat Intelligence

{technique.intel_items.map((intel) => (

{intel.title || intel.url}

{intel.source && {intel.source} • } Detected {formatDate(intel.detected_at)}

View
))}
)} {/* Template instantiation modal */} {templateFormId && technique && ( setTemplateFormId(null)} /> )}
); }