let lastPageID = ''; let aiReactionsEffect = null; let aiPanel = zui.AIPanel.shared; let lastParamsID = ($.parseLink($.apps.getAppUrl()).vars || []).map(x => x[1]).join(); const takeOverFlag = 'aiapp-conversation.takeOverToggles'; const toggleEleClass = 'aiapp-conversation-toggle'; function openInAIPanel(chat, params) { if(!aiPanel) return; if(typeof params === 'string') try {params = JSON.parse(params);} catch {} params = params || {}; if(typeof params !== 'object') return; const options = {}; if(params.postMessage) { options.postMessage = params.postMessage; delete params.postMessage; } if(!chat || chat === 'NEW') options.chat = params; else if(typeof chat === 'string') options.chat = chat; aiPanel.open(options); } function injectEmbedStyle() { const $$ = window.parent.$; if($$('body').hasClass('ai-embed-injected')) return; $$('body').addClass('ai-embed-injected'); $$('head').append([ '' ].join('\n')); } function showToggleInParent(event) { event.stopPropagation(); event.preventDefault(); const $$ = window.parent.$; const $toggle = $(this); let id = $toggle.attr('id') || $toggle.data('takeOverToggleID'); if(!id) { id = zui.nextGid(); $toggle.data('takeOverToggleID', id); } const isMessageBar = id === 'messageBar'; const toggleID = isMessageBar ? id : `${toggleEleClass}_${id}`; let $trigger = $$(toggleID); if(!$trigger.length) { const data = $toggle.data(); if(data.call === 'fetchMessage' && !data.params) data.params = 'false, options.fetcher'; $trigger = $$(`
`) .attr('zui-toggle-dropdown', $toggle.attr('zui-toggle-dropdown')) .css({position: 'fixed', cursor: 'pointer'}); Object.keys(data).forEach(key => $trigger.attr(`data-${key}`, data[key])); $trigger.appendTo($$('body')); $trigger.on('hidden', () => { $trigger.next('.dropdown-menu').remove(); $trigger.remove(); }); if(isMessageBar) { const $menu = $toggle.next('.dropdown-menu'); const $$menu = $$('').attr('class', $menu.attr('class')).attr('style', $menu.attr('style')).addClass(toggleEleClass).html($menu.html()); $trigger.after($$menu); } } const boundRect = $toggle[0].getBoundingClientRect(); $trigger.css({left: boundRect.left + $$('#menu').width(), top: boundRect.top, width: boundRect.width, height: boundRect.height}); $trigger.trigger('click'); } function takeOverToggles() { const $toolbar = $('#toolbar > .toolbar'); if($toolbar.data(takeOverFlag)) return; $toolbar.data(takeOverFlag, true); $toolbar.children('[zui-toggle-dropdown]').on('click.takeOverToggles', showToggleInParent); } window.initAIConversations = function(chat, initialParams) { aiPanel = aiPanel || zui.AIPanel.shared; if(!aiPanel) { $('#noZaiConfigTip').removeClass('hidden'); return; } aiPanel.toggleEmbed(true); $('#noZaiConfigTip').remove(); const currentPageID = getPageInfo().id; lastPageID = currentPageID; aiReactionsEffect = aiPanel.reactions.state$.subscribe((state) => { if(!state.zentaoPage || lastPageID === state.zentaoPage.id) return; lastPageID = state.zentaoPage.id; aiPanel.toggleEmbed(lastPageID === currentPageID); }); if(initialParams || chat) setTimeout(() => openInAIPanel(chat, initialParams), 600); injectEmbedStyle(); takeOverToggles(); } window.onPageUnmount = function() { if(aiReactionsEffect) { aiReactionsEffect(); aiReactionsEffect = null; } if(aiPanel) aiPanel.toggleEmbed(false); $('#toolbar > .toolbar').data(takeOverFlag, false).children('[zui-toggle-dropdown]').off('click.takeOverToggles'); window.parent.$('.aiapp-conversation-toggle').remove(); }; window.beforePageLoad = function(options) { if(options.id !== 'page') return; const link = $.parseLink(options.url); if(link.moduleName !== 'aiapp' || link.methodName !== 'conversation') return; const paramsID = link.vars.map(x => x[1]).join(); if(paramsID === lastParamsID) return false; lastParamsID = paramsID; const params = link.vars[1][1]; if(params) params = atob(params); openInAIPanel(link.vars[0][1], params); return false; };