// 聊天室上下文初始化模块,从 Blade 输出的 JSON 数据节点恢复 window.chatContext。 const CHAT_CONTEXT_ELEMENT_ID = "chat-context-data"; /** * 读取并解析 Blade 注入的聊天室上下文 JSON。 * * @returns {Record} */ function readChatContextPayload() { const element = document.getElementById(CHAT_CONTEXT_ELEMENT_ID); if (!element) { return {}; } try { return JSON.parse(element.textContent || "{}"); } catch (error) { console.error("[chatContext] 初始化数据解析失败", error); return {}; } } /** * 使用模板生成带 ID 的 URL。 * * @param {string} template URL 模板 * @param {number|string} id 资源 ID * @returns {string} */ function fillIdTemplate(template, id) { return String(template || "").replace("__ID__", encodeURIComponent(id)); } /** * 恢复婚姻系统 URL 工厂函数,兼容存量调用方式。 * * @param {Record} context 聊天室上下文 * @returns {void} */ function hydrateMarriageUrlFactories(context) { const marriage = context.marriage || {}; marriage.acceptUrl = (id) => fillIdTemplate(marriage.acceptUrlTemplate, id); marriage.rejectUrl = (id) => fillIdTemplate(marriage.rejectUrlTemplate, id); marriage.divorceUrl = (id) => fillIdTemplate(marriage.divorceUrlTemplate, id); marriage.confirmDivorceUrl = (id) => fillIdTemplate(marriage.confirmDivorceUrlTemplate, id); marriage.rejectDivorceUrl = (id) => fillIdTemplate(marriage.rejectDivorceUrlTemplate, id); marriage.weddingSetupUrl = (id) => fillIdTemplate(marriage.weddingSetupUrlTemplate, id); marriage.claimEnvelopeUrl = (id, ceremonyId) => fillIdTemplate( fillIdTemplate(marriage.claimEnvelopeUrlTemplate, id), ceremonyId, ); marriage.envelopeStatusUrl = (id) => fillIdTemplate(marriage.envelopeStatusUrlTemplate, id); context.marriage = marriage; } /** * 初始化 window.chatContext,供后续聊天室模块和存量 Blade 脚本读取。 * * @returns {Record} */ export function initializeChatContext() { // Blade 底部仍有同步脚本会立即读取 chatContext;若兼容桥已初始化,这里只做函数补齐。 const context = window.chatContext || readChatContextPayload(); hydrateMarriageUrlFactories(context); window.chatContext = context; return context; } initializeChatContext();