import { useState } from "react"; import { ExternalLink, ShieldCheck, Trash2 } from "lucide-react"; import { useTranslation } from "react-i18next"; import { AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogTitle, } from "@/components/ui/alert-dialog"; import { Button } from "@/components/ui/button"; import { Sheet, SheetContent, SheetDescription, SheetTitle } from "@/components/ui/sheet"; import type { ExtensionAction } from "@/lib/api"; import type { ExtensionDiagnosticInfo, ExtensionInfo } from "@/lib/types"; import { cn } from "@/lib/utils"; import { DetailPill, DetailSection, ExtensionMark, MetaItem, NamedItems, RuntimeBadge, StatusBadge, } from "./extension-ui"; interface ExtensionDetailSheetProps { extension: ExtensionInfo | null; diagnostics: ExtensionDiagnosticInfo[]; busy: string | null; open: boolean; onOpenChange: (open: boolean) => void; onAction: ( action: ExtensionAction, values: Record, ) => Promise; } export function ExtensionDetailSheet({ extension, diagnostics, busy, open, onOpenChange, onAction, }: ExtensionDetailSheetProps) { const { t } = useTranslation(); const [uninstallOpen, setUninstallOpen] = useState(false); if (!extension) return null; const external = extension.scope !== "builtin"; const requested = new Set(extension.requested_permissions); const granted = new Set(extension.granted_permissions); const allGranted = [...requested].every((permission) => granted.has(permission)); return ( <>
{extension.name} {extension.description || extension.id}
{extension.version}
{extension.homepage ? ( {t("extensions.details.homepage")} ) : null}
({ name: item.name, meta: item.kind, }))} /> ({ name: item.name, meta: `${item.kind}${item.specifier ? ` ${item.specifier}` : ""}`, }))} /> {extension.permissions.length ? (
{extension.permissions.map((permission) => (
{permission.name}
{permission.reason ? (

{permission.reason}

) : null}
{granted.has(permission.name) ? t("extensions.permissionGranted") : t("extensions.permissionPending")}
))} {external ? ( ) : null}
) : (

{t("extensions.noPermissions")}

)}
{diagnostics.length ? (
{diagnostics.map((diagnostic, index) => (
{diagnostic.code}

{diagnostic.message}

))}
) : null}
{external ? (
) : null}
{t("extensions.uninstallTitle")} {t("extensions.uninstallDescription", { name: extension.name })} {t("extensions.cancel")} void onAction("uninstall", { id: extension.id })} className="bg-destructive text-destructive-foreground hover:bg-destructive/90" > {t("extensions.uninstall")} ); }