/** * 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 (
{isUpdate ? t`${pluginName} is requesting additional permissions:` : t`${pluginName} requires the following permissions:`}