From 72fd52db83ed48e671b52a0519bf380e667bafcf Mon Sep 17 00:00:00 2001 From: diegosouzapw Date: Thu, 28 May 2026 12:58:39 -0300 Subject: [PATCH] feat(ui): per-agent RiskNoticeModal on first DNS activation (fix4 gap3) --- .../agent-bridge/components/AgentCard.tsx | 48 ++++++++++++++++++- 1 file changed, 46 insertions(+), 2 deletions(-) diff --git a/src/app/(dashboard)/dashboard/tools/agent-bridge/components/AgentCard.tsx b/src/app/(dashboard)/dashboard/tools/agent-bridge/components/AgentCard.tsx index d924ba1b2b..6f287a1172 100644 --- a/src/app/(dashboard)/dashboard/tools/agent-bridge/components/AgentCard.tsx +++ b/src/app/(dashboard)/dashboard/tools/agent-bridge/components/AgentCard.tsx @@ -6,10 +6,29 @@ import { AgentIcon } from "./shared/AgentIcon"; import { DnsStatusBadge } from "./shared/DnsStatusBadge"; import { ModelMappingTable } from "./ModelMappingTable"; import { SetupWizard } from "./SetupWizard"; +import { RiskNoticeModal } from "@/shared/components/RiskNoticeModal"; import type { MitmTarget } from "@/mitm/types"; import type { AgentStateEntry } from "../AgentBridgePageClient"; import type { MappingRow } from "./ModelMappingTable"; +const RISK_STORAGE_KEY_PREFIX = "omniroute-agentbridge-risk-dismissed-"; + +function hasAcceptedRisk(agentId: string): boolean { + try { + return localStorage.getItem(RISK_STORAGE_KEY_PREFIX + agentId) === "true"; + } catch { + return false; + } +} + +function markRiskAccepted(agentId: string): void { + try { + localStorage.setItem(RISK_STORAGE_KEY_PREFIX + agentId, "true"); + } catch { + // ignore storage errors + } +} + interface AgentCardProps { target: MitmTarget; agentState: AgentStateEntry | undefined; @@ -34,6 +53,7 @@ export function AgentCard({ const [expanded, setExpanded] = useState(false); const [wizardOpen, setWizardOpen] = useState(false); const [dnsLoading, setDnsLoading] = useState(false); + const [riskModalOpen, setRiskModalOpen] = useState(false); const dnsEnabled = agentState?.dns_enabled ?? false; const setupCompleted = agentState?.setup_completed ?? false; @@ -73,15 +93,30 @@ export function AgentCard({ ); }; - const handleDnsToggle = async () => { + const reallyToggleDns = async (enabled: boolean) => { setDnsLoading(true); try { - await onDnsToggle(target.id, !dnsEnabled); + await onDnsToggle(target.id, enabled); } finally { setDnsLoading(false); } }; + const handleDnsToggle = async () => { + const enabling = !dnsEnabled; + if (enabling && !hasAcceptedRisk(target.id)) { + setRiskModalOpen(true); + return; + } + await reallyToggleDns(enabling); + }; + + const handleRiskAccept = async () => { + markRiskAccepted(target.id); + setRiskModalOpen(false); + await reallyToggleDns(true); + }; + return ( <>
)} + + setRiskModalOpen(false)} + /> ); }