Spaces:
Build error
Build error
| // custom javascript here | |
| const MAX_HISTORY_LENGTH = 32; | |
| var key_down_history = []; | |
| var currentIndex = -1; | |
| var user_input_ta; | |
| var gradioContainer = null; | |
| var user_input_ta = null; | |
| var user_input_tb = null; | |
| var userInfoDiv = null; | |
| var appTitleDiv = null; | |
| var chatbot = null; | |
| var apSwitch = null; | |
| var ga = document.getElementsByTagName("gradio-app"); | |
| var targetNode = ga[0]; | |
| var isInIframe = (window.self !== window.top); | |
| // gradio 页面加载好了么??? 我能动你的元素了么?? | |
| function gradioLoaded(mutations) { | |
| for (var i = 0; i < mutations.length; i++) { | |
| if (mutations[i].addedNodes.length) { | |
| gradioContainer = document.querySelector(".gradio-container"); | |
| user_input_tb = document.getElementById('user_input_tb'); | |
| userInfoDiv = document.getElementById("user_info"); | |
| appTitleDiv = document.getElementById("app_title"); | |
| chatbot = document.querySelector('#chuanhu_chatbot'); | |
| apSwitch = document.querySelector('.apSwitch input[type="checkbox"]'); | |
| if (gradioContainer && apSwitch) { // gradioCainter 加载出来了没? | |
| adjustDarkMode(); | |
| } | |
| if (user_input_tb) { // user_input_tb 加载出来了没? | |
| selectHistory(); | |
| } | |
| if (userInfoDiv && appTitleDiv) { // userInfoDiv 和 appTitleDiv 加载出来了没? | |
| setTimeout(showOrHideUserInfo(), 2000); | |
| } | |
| if (chatbot) { // chatbot 加载出来了没? | |
| setChatbotHeight() | |
| } | |
| } | |
| } | |
| } | |
| function selectHistory() { | |
| user_input_ta = user_input_tb.querySelector("textarea"); | |
| if (user_input_ta) { | |
| observer.disconnect(); // 停止监听 | |
| // 在 textarea 上监听 keydown 事件 | |
| user_input_ta.addEventListener("keydown", function (event) { | |
| var value = user_input_ta.value.trim(); | |
| // 判断按下的是否为方向键 | |
| if (event.code === 'ArrowUp' || event.code === 'ArrowDown') { | |
| // 如果按下的是方向键,且输入框中有内容,且历史记录中没有该内容,则不执行操作 | |
| if (value && key_down_history.indexOf(value) === -1) | |
| return; | |
| // 对于需要响应的动作,阻止默认行为。 | |
| event.preventDefault(); | |
| var length = key_down_history.length; | |
| if (length === 0) { | |
| currentIndex = -1; // 如果历史记录为空,直接将当前选中的记录重置 | |
| return; | |
| } | |
| if (currentIndex === -1) { | |
| currentIndex = length; | |
| } | |
| if (event.code === 'ArrowUp' && currentIndex > 0) { | |
| currentIndex--; | |
| user_input_ta.value = key_down_history[currentIndex]; | |
| } else if (event.code === 'ArrowDown' && currentIndex < length - 1) { | |
| currentIndex++; | |
| user_input_ta.value = key_down_history[currentIndex]; | |
| } | |
| user_input_ta.selectionStart = user_input_ta.value.length; | |
| user_input_ta.selectionEnd = user_input_ta.value.length; | |
| const input_event = new InputEvent("input", { bubbles: true, cancelable: true }); | |
| user_input_ta.dispatchEvent(input_event); | |
| } else if (event.code === "Enter") { | |
| if (value) { | |
| currentIndex = -1; | |
| if (key_down_history.indexOf(value) === -1) { | |
| key_down_history.push(value); | |
| if (key_down_history.length > MAX_HISTORY_LENGTH) { | |
| key_down_history.shift(); | |
| } | |
| } | |
| } | |
| } | |
| }); | |
| } | |
| } | |
| function toggleUserInfoVisibility(shouldHide) { | |
| if (userInfoDiv) { | |
| if (shouldHide) { | |
| userInfoDiv.classList.add("hideK"); | |
| } else { | |
| userInfoDiv.classList.remove("hideK"); | |
| } | |
| } | |
| } | |
| function showOrHideUserInfo() { | |
| var sendBtn = document.getElementById("submit_btn"); | |
| // Bind mouse/touch events to show/hide user info | |
| appTitleDiv.addEventListener("mouseenter", function () { | |
| toggleUserInfoVisibility(false); | |
| }); | |
| userInfoDiv.addEventListener("mouseenter", function () { | |
| toggleUserInfoVisibility(false); | |
| }); | |
| sendBtn.addEventListener("mouseenter", function () { | |
| toggleUserInfoVisibility(false); | |
| }); | |
| appTitleDiv.addEventListener("mouseleave", function () { | |
| toggleUserInfoVisibility(true); | |
| }); | |
| userInfoDiv.addEventListener("mouseleave", function () { | |
| toggleUserInfoVisibility(true); | |
| }); | |
| sendBtn.addEventListener("mouseleave", function () { | |
| toggleUserInfoVisibility(true); | |
| }); | |
| appTitleDiv.ontouchstart = function () { | |
| toggleUserInfoVisibility(false); | |
| }; | |
| userInfoDiv.ontouchstart = function () { | |
| toggleUserInfoVisibility(false); | |
| }; | |
| sendBtn.ontouchstart = function () { | |
| toggleUserInfoVisibility(false); | |
| }; | |
| appTitleDiv.ontouchend = function () { | |
| setTimeout(function () { | |
| toggleUserInfoVisibility(true); | |
| }, 3000); | |
| }; | |
| userInfoDiv.ontouchend = function () { | |
| setTimeout(function () { | |
| toggleUserInfoVisibility(true); | |
| }, 3000); | |
| }; | |
| sendBtn.ontouchend = function () { | |
| setTimeout(function () { | |
| toggleUserInfoVisibility(true); | |
| }, 3000); // Delay 1 second to hide user info | |
| }; | |
| // Hide user info after 2 second | |
| setTimeout(function () { | |
| toggleUserInfoVisibility(true); | |
| }, 2000); | |
| } | |
| function toggleDarkMode(isEnabled) { | |
| if (isEnabled) { | |
| gradioContainer.classList.add("dark"); | |
| document.body.style.setProperty("background-color", "var(--neutral-950)", "important"); | |
| } else { | |
| gradioContainer.classList.remove("dark"); | |
| document.body.style.backgroundColor = ""; | |
| } | |
| } | |
| function adjustDarkMode() { | |
| const darkModeQuery = window.matchMedia("(prefers-color-scheme: dark)"); | |
| // 根据当前颜色模式设置初始状态 | |
| apSwitch.checked = darkModeQuery.matches; | |
| toggleDarkMode(darkModeQuery.matches); | |
| // 监听颜色模式变化 | |
| darkModeQuery.addEventListener("change", (e) => { | |
| apSwitch.checked = e.matches; | |
| toggleDarkMode(e.matches); | |
| }); | |
| // apSwitch = document.querySelector('.apSwitch input[type="checkbox"]'); | |
| apSwitch.addEventListener("change", (e) => { | |
| toggleDarkMode(e.target.checked); | |
| }); | |
| } | |
| function setChatbotHeight() { | |
| const screenWidth = window.innerWidth; | |
| const statusDisplay = document.querySelector('#status_display'); | |
| const statusDisplayHeight = statusDisplay ? statusDisplay.offsetHeight : 0; | |
| const wrap = chatbot.querySelector('.wrap'); | |
| const vh = window.innerHeight * 0.01; | |
| document.documentElement.style.setProperty('--vh', `${vh}px`); | |
| if (isInIframe) { | |
| chatbot.style.height = `700px`; | |
| wrap.style.maxHeight = `calc(700px - var(--line-sm) * 1rem - 2 * var(--block-label-margin))` | |
| } else { | |
| if (screenWidth <= 320) { | |
| chatbot.style.height = `calc(var(--vh, 1vh) * 100 - ${statusDisplayHeight + 150}px)`; | |
| wrap.style.maxHeight = `calc(var(--vh, 1vh) * 100 - ${statusDisplayHeight + 150}px - var(--line-sm) * 1rem - 2 * var(--block-label-margin))`; | |
| } else if (screenWidth <= 499) { | |
| chatbot.style.height = `calc(var(--vh, 1vh) * 100 - ${statusDisplayHeight + 100}px)`; | |
| wrap.style.maxHeight = `calc(var(--vh, 1vh) * 100 - ${statusDisplayHeight + 100}px - var(--line-sm) * 1rem - 2 * var(--block-label-margin))`; | |
| } else { | |
| chatbot.style.height = `calc(var(--vh, 1vh) * 100 - ${statusDisplayHeight + 160}px)`; | |
| wrap.style.maxHeight = `calc(var(--vh, 1vh) * 100 - ${statusDisplayHeight + 160}px - var(--line-sm) * 1rem - 2 * var(--block-label-margin))`; | |
| } | |
| } | |
| } | |
| // 监视页面内部 DOM 变动 | |
| var observer = new MutationObserver(function (mutations) { | |
| gradioLoaded(mutations); | |
| }); | |
| observer.observe(targetNode, { childList: true, subtree: true }); | |
| // 监视页面变化 | |
| window.addEventListener("DOMContentLoaded", function () { | |
| isInIframe = (window.self !== window.top); | |
| }); | |
| window.addEventListener('resize', setChatbotHeight); | |
| window.addEventListener('scroll', setChatbotHeight); | |
| window.matchMedia("(prefers-color-scheme: dark)").addEventListener("change", adjustDarkMode); |