/** * Capability Consent Dialog * * Shown before installing or updating a marketplace plugin. * Lists each requested capability with a human-readable explanation. * User must explicitly confirm before the action proceeds. */ import { Button } from "@cloudflare/kumo"; import { useLingui } from "@lingui/react/macro"; import { ShieldCheck, ShieldWarning, Warning } from "@phosphor-icons/react"; import * as React from "react"; import { describeCapability } from "../lib/api/marketplace.js"; import { cn } from "../lib/utils.js"; import { DialogError } from "./DialogError.js"; export interface CapabilityConsentDialogProps { /** Dialog mode */ mode?: "install" | "update"; /** Plugin display name */ pluginName: string; /** Capabilities the plugin requests */ capabilities: string[]; /** Allowed network hosts (for network:fetch capability) */ allowedHosts?: string[]; /** New capabilities added in an update (highlighted differently) */ newCapabilities?: string[]; /** Audit verdict badge */ auditVerdict?: "pass" | "warn" | "fail"; /** Whether the action is in progress */ isPending?: boolean; /** Error message to display inline */ error?: string | null; /** Called when user confirms */ onConfirm: () => void; /** Called when user cancels */ onCancel: () => void; } export function CapabilityConsentDialog({ mode, pluginName, capabilities, allowedHosts, newCapabilities = [], auditVerdict, isPending = false, error, onConfirm, onCancel, }: CapabilityConsentDialogProps) { const { t } = useLingui(); const newSet = new Set(newCapabilities); const isUpdate = mode === "update" || newCapabilities.length > 0; return (
{/* Backdrop */}
!isPending && onCancel()} /> {/* Dialog */}
{/* Header */}

{isUpdate ? t`Review New Permissions` : t`Plugin Permissions`}

{isUpdate ? t`${pluginName} is requesting additional permissions:` : t`${pluginName} requires the following permissions:`}

{/* Capabilities list */}
{capabilities.map((cap) => { const isNew = newSet.has(cap); return (
{describeCapability(cap, allowedHosts)} {isNew && {t`NEW`}}
); })} {/* Audit verdict banner */} {auditVerdict && auditVerdict !== "pass" && (
{auditVerdict === "warn" ? ( ) : ( )} {auditVerdict === "warn" ? t`Security audit flagged potential concerns with this plugin.` : t`Security audit flagged this plugin as potentially unsafe.`}
)}
{/* Error */} {/* Actions */}
); } export default CapabilityConsentDialog;