"use client"; import { useSearchParams, useRouter } from "next/navigation"; import { useState } from "react"; import { Button } from "@/components/ui/button"; import { useIframeSkill } from "@/hooks/use-iframe-skill"; import { cn } from "@/lib/utils"; /** * IframeTestPanel —— 仅用于开发阶段测试 iframe 通信功能 * * 测试场景: * 1. mode=skill 侧边栏隐藏 * 2. useSpecificChatMode 注入提示词 * 3. sendSelectSkill / openSkillDialog / clearSkill */ export function IframeTestPanel() { const router = useRouter(); const searchParams = useSearchParams(); const iframeSkill = useIframeSkill(); const [log, setLog] = useState([]); const [open, setOpen] = useState(true); const isSkillMode = searchParams.get("mode") === "skill"; function addLog(msg: string) { setLog((prev) => [ `[${new Date().toLocaleTimeString()}] ${msg}`, ...prev.slice(0, 9), ]); } function handleEnterSkillMode() { router.push(`?mode=skill&skill_id=123&title=测试技能`); addLog("进入 mode=skill,URL 已更新"); } function handleExitSkillMode() { router.push(`?`); addLog("退出 skill 模式"); } function handleSendSelectSkill() { iframeSkill.sendSelectSkill("skill_001"); addLog("postMessage → selectSkill (skill_id=skill_001)"); } function handleOpenSkillDialog() { iframeSkill.openSkillDialog(); addLog("postMessage → openSkillDialog"); } function handleClearSkill() { iframeSkill.clearSkill(); addLog("clearSkill 已调用,postMessage → skill_id=0"); } if (!open) { return ( ); } return (
{/* 标题栏 */}
🧪 iframe 通信测试
{/* 当前状态 */}
当前状态
mode: {isSkillMode ? "skill ✅" : "普通"} selectedSkill: {iframeSkill.selectedSkill ? `${iframeSkill.selectedSkill.skill_id} / ${iframeSkill.selectedSkill.title}` : "无"}
{/* 场景 1:侧边栏隐藏 */}
① 侧边栏隐藏(layout)
{/* 场景 2:skill 选择通信 */}
② postMessage 通信(发送到宿主)
{/* 场景 3:接收宿主页 selectedSkill */}
③ 接收宿主页 selectedSkill
{/* 日志 */} {log.length > 0 && (
操作日志
{log.map((l, i) => (
{l}
))}
)}
); }