"use client"; import { useEffect, useRef, useState } from "react"; import { useTranslation } from "react-i18next"; import { IconAlertTriangle } from "@tabler/icons-react"; import { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle, } from "@kandev/ui/dialog"; import { Drawer, DrawerContent, DrawerDescription, DrawerHeader, DrawerTitle, } from "@kandev/ui/drawer"; import { Button } from "@kandev/ui/button"; import { useResponsiveBreakpoint } from "@/hooks/use-responsive-breakpoint"; import { statusSummaryTaskError } from "@/lib/task-status-summary"; import { cn } from "@/lib/utils"; import { useTaskLaunchErrorContext } from "./task-launch-error-context"; import { TaskLaunchErrorEntry } from "./simple/components/task-launch-error-entry"; /** Persistent task-owned failure surface. It is mounted above the task tabs so * session changes and Dockview panel changes cannot hide the recovery affordance. */ export function TaskSharedError({ reserveMobileTopBar = false, }: { reserveMobileTopBar?: boolean; } = {}) { const context = useTaskLaunchErrorContext(); const error = statusSummaryTaskError(context?.statusSummary); const [detailsOpen, setDetailsOpen] = useState(false); const localAnnouncementStampRef = useRef(null); const { isMobile } = useResponsiveBreakpoint(); const { t } = useTranslation(); const launchNeedsAttention = t("task:launchNeedsAttention"); const errorStamp = error?.stamp ?? ""; const [announcement, setAnnouncement] = useState(""); useEffect(() => { if (!context || !error || !errorStamp) return; const shouldAnnounce = context.claimTaskErrorAnnouncement ? context.claimTaskErrorAnnouncement(errorStamp) : localAnnouncementStampRef.current !== errorStamp; if (!shouldAnnounce) return; localAnnouncementStampRef.current = errorStamp; setAnnouncement(`${error.preview}. ${launchNeedsAttention}`); }, [context, error, errorStamp, launchNeedsAttention]); if (!context || !error) return null; const details = ( ); return ( <>

{announcement}

{isMobile ? ( {error.preview} {launchNeedsAttention}
{details}
) : ( {error.preview} {launchNeedsAttention} {details} )} ); }