2026-04-25 14:04:42 +08:00
|
|
|
// 聊天室页面初始状态恢复,负责首屏历史消息、入场特效和挂起婚姻事件。
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* DOM 就绪后执行回调。
|
|
|
|
|
*
|
|
|
|
|
* @param {Function} callback
|
|
|
|
|
* @returns {void}
|
|
|
|
|
*/
|
|
|
|
|
function onDomReady(callback) {
|
|
|
|
|
if (document.readyState === "loading") {
|
|
|
|
|
document.addEventListener("DOMContentLoaded", callback, { once: true });
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
callback();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 追加一条聊天消息,等待核心聊天脚本暴露 appendMessage。
|
|
|
|
|
*
|
|
|
|
|
* @param {object} message
|
|
|
|
|
* @returns {void}
|
|
|
|
|
*/
|
|
|
|
|
function appendInitialMessage(message) {
|
|
|
|
|
if (typeof window.appendMessage === "function") {
|
|
|
|
|
window.appendMessage(message);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 恢复页面初始历史消息。
|
|
|
|
|
*
|
|
|
|
|
* @param {object} initialState
|
|
|
|
|
* @returns {void}
|
|
|
|
|
*/
|
|
|
|
|
function restoreHistoryMessages(initialState) {
|
|
|
|
|
const messages = Array.isArray(initialState.historyMessages) ? initialState.historyMessages : [];
|
|
|
|
|
if (messages.length === 0) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const clearId = Number.parseInt(localStorage.getItem(initialState.localClearStorageKey || "") || "0", 10);
|
|
|
|
|
|
|
|
|
|
messages.forEach((message) => {
|
|
|
|
|
// 本地清屏后,只恢复清屏点之后的新消息。
|
|
|
|
|
if (Number(message.id || 0) > clearId) {
|
|
|
|
|
appendInitialMessage(message);
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 追加页面入场欢迎消息。
|
|
|
|
|
*
|
|
|
|
|
* @param {object} initialState
|
|
|
|
|
* @returns {void}
|
|
|
|
|
*/
|
|
|
|
|
function appendWelcomeMessage(initialState) {
|
2026-04-27 14:13:23 +08:00
|
|
|
const messages = Array.isArray(initialState.welcomeMessages) && initialState.welcomeMessages.length > 0
|
|
|
|
|
? initialState.welcomeMessages
|
|
|
|
|
: (initialState.welcomeMessage ? [initialState.welcomeMessage] : []);
|
|
|
|
|
if (messages.length === 0) {
|
2026-04-25 14:04:42 +08:00
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
2026-04-27 14:13:23 +08:00
|
|
|
window.setTimeout(() => {
|
|
|
|
|
// 本次进房欢迎绕过历史清屏过滤,确保新人礼包和 AI 欢迎能在当前屏看到。
|
|
|
|
|
messages.forEach((message) => appendInitialMessage(message));
|
|
|
|
|
}, 220);
|
2026-04-25 14:04:42 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 播放页面入场特效。
|
|
|
|
|
*
|
|
|
|
|
* @param {object} initialState
|
|
|
|
|
* @returns {void}
|
|
|
|
|
*/
|
|
|
|
|
function playEntryEffect(initialState) {
|
|
|
|
|
if (!initialState.entryEffect) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
window.setTimeout(() => {
|
|
|
|
|
window.EffectManager?.play?.(initialState.entryEffect);
|
|
|
|
|
}, 1000);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 显示会员进出场横幅。
|
|
|
|
|
*
|
|
|
|
|
* @param {object} initialState
|
|
|
|
|
* @returns {void}
|
|
|
|
|
*/
|
|
|
|
|
function showInitialPresenceBanner(initialState) {
|
|
|
|
|
if (!initialState.presenceTheme) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
window.setTimeout(() => {
|
|
|
|
|
window.showVipPresenceBanner?.(initialState.presenceTheme);
|
|
|
|
|
}, 700);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 派发挂起的求婚或离婚请求事件。
|
|
|
|
|
*
|
|
|
|
|
* @param {object} initialState
|
|
|
|
|
* @returns {void}
|
|
|
|
|
*/
|
|
|
|
|
function dispatchPendingMarriageEvents(initialState) {
|
|
|
|
|
if (!initialState.pendingProposal && !initialState.pendingDivorce) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
window.setTimeout(() => {
|
|
|
|
|
if (initialState.pendingProposal) {
|
|
|
|
|
window.dispatchEvent(new CustomEvent("chat:marriage-proposed", {
|
|
|
|
|
detail: initialState.pendingProposal,
|
|
|
|
|
}));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (initialState.pendingDivorce) {
|
|
|
|
|
window.dispatchEvent(new CustomEvent("chat:divorce-requested", {
|
|
|
|
|
detail: initialState.pendingDivorce,
|
|
|
|
|
}));
|
|
|
|
|
}
|
|
|
|
|
}, 800);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 绑定聊天室页面初始状态恢复。
|
|
|
|
|
*
|
|
|
|
|
* @returns {void}
|
|
|
|
|
*/
|
|
|
|
|
export function bindChatInitialStateControls() {
|
|
|
|
|
if (typeof window === "undefined") {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
onDomReady(() => {
|
|
|
|
|
const initialState = window.chatContext?.initialState || {};
|
|
|
|
|
|
|
|
|
|
restoreHistoryMessages(initialState);
|
|
|
|
|
appendWelcomeMessage(initialState);
|
|
|
|
|
playEntryEffect(initialState);
|
|
|
|
|
showInitialPresenceBanner(initialState);
|
|
|
|
|
dispatchPendingMarriageEvents(initialState);
|
|
|
|
|
});
|
|
|
|
|
}
|