import { useSearchParams } from "next/navigation"; import { useState, useEffect, useCallback } from "react"; // 消息类型常量 const MESSAGE_TYPES = { SELECT_SKILL: "selectSkill", OPEN_SKILL_DIALOG: "openSkillDialog", } as const; // Skill 数据类型 interface SkillData { skill_id: string; title: string; } // Hook 返回类型 interface UseIframeSkillReturn { selectedSkill: SkillData | null; sendSelectSkill: (skill_id: string) => void; openSkillDialog: () => void; clearSkill: () => void; } export function useIframeSkill(): UseIframeSkillReturn { const searchParams = useSearchParams(); const skillIdFromQuery = searchParams.get("skill_id"); const titleFromQuery = searchParams.get("title"); const [selectedSkill, setSelectedSkill] = useState(null); // 1. 监听 query 参数变化 useEffect(() => { if (skillIdFromQuery && titleFromQuery) { setSelectedSkill({ skill_id: skillIdFromQuery, title: titleFromQuery }); } }, [skillIdFromQuery, titleFromQuery]); // 2. 监听宿主页 postMessage useEffect(() => { const handleMessage = (event: MessageEvent) => { if (event.data?.type === "selectedSkill") { const { id, title } = event.data; setSelectedSkill({ skill_id: String(id), title }); } }; window.addEventListener("message", handleMessage); return () => window.removeEventListener("message", handleMessage); }, []); // 发送选择预定义 skill const sendSelectSkill = useCallback((skill_id: string) => { const message = { type: MESSAGE_TYPES.SELECT_SKILL, skill_id }; console.log("[useIframeSkill] sendSelectSkill:", message); window.parent.postMessage(message, "*"); }, []); // 打开 skill 选择对话框 const openSkillDialog = useCallback(() => { const message = { type: MESSAGE_TYPES.OPEN_SKILL_DIALOG, openSkillDialog: true, }; console.log("[useIframeSkill] openSkillDialog:", message); window.parent.postMessage(message, "*"); }, []); // 清除选中并发送 skill_id=0 给主页 const clearSkill = useCallback(() => { setSelectedSkill(null); // 发送 skill_id=0 给主页,通知取消选择 const message = { type: MESSAGE_TYPES.SELECT_SKILL, skill_id: "0" }; console.log("[useIframeSkill] clearSkill, sending skill_id=0:", message); window.parent.postMessage(message, "*"); }, []); return { selectedSkill, sendSelectSkill, openSkillDialog, clearSkill }; }