var updateInfoGotten = false; var isLatestVersion = localStorage.getItem('isLatestVersion') === "true" || false; var shouldCheckUpdate = false; function setUpdater() { const enableCheckUpdate = gradioApp().querySelector('#enableCheckUpdate_config').innerText; if (enableCheckUpdate == "False" || enableCheckUpdate == "false") { gradioApp().classList.add('disable-update'); return; } if (!isLatestVersion) { gradioApp().classList.add('is-outdated'); } const lastCheckTime = localStorage.getItem('lastCheckTime') || 0; currentTime = new Date().getTime(); const longTimeNoCheck = currentTime - lastCheckTime > 3 * 24 * 60 * 60 * 1000; shouldCheckUpdate = !updateInfoGotten && (!isLatestVersion && longTimeNoCheck || isLatestVersion); // console.log(`shouldCheckUpdate`, shouldCheckUpdate); if (shouldCheckUpdate) updateLatestVersion(); } var statusObserver = new MutationObserver(function (mutationsList) { for (const mutation of mutationsList) { if (mutation.type === 'attributes' || mutation.type === 'childList') { if (statusDisplay.innerHTML.includes('id="update-status"')) { if (getUpdateStatus() === "success") { // noUpdateHtml(); updateSuccessHtml(); localStorage.setItem('isLatestVersion', 'true'); isLatestVersion = true; gradioApp().classList.remove('is-outdated'); enableUpdateBtns(); } else if (getUpdateStatus() === "failure") { updatingInfoElement.innerHTML = marked.parse(updateFailure_i18n, {mangle: false, headerIds: false}); disableUpdateBtn_enableCancelBtn(); } else if (getUpdateStatus() != "") { updatingInfoElement.innerText = getUpdateStatus(); enableUpdateBtns(); } updateStatus.parentNode.removeChild(updateStatus); if (updateSpinner) updateSpinner.stop(); } } } }); var showingUpdateInfo = false; async function getLatestRelease() { try { const response = await fetch('https://api.github.com/repos/gaizhenbiao/chuanhuchatgpt/releases/latest'); if (!response.ok) { console.log(`Error: ${response.status} - ${response.statusText}`); updateInfoGotten = true; return null; } const data = await response.json(); updateInfoGotten = true; return data; } catch (error) { console.log(`Error: ${error}`); updateInfoGotten = true; return null; } } var releaseNoteElement = document.getElementById('release-note-content'); var updatingInfoElement = document.getElementById('updating-info'); async function updateLatestVersion() { const currentVersionElement = document.getElementById('current-version'); const reVersion = /]*>([^<]*)<\/a>/g; const versionMatch = reVersion.exec(currentVersionElement.innerHTML); const currentVersion = (versionMatch && versionMatch[1].length == 8) ? versionMatch[1] : null; const latestVersionElement = document.getElementById('latest-version-title'); const versionInfoElement = document.getElementById('version-info-title'); releaseNoteElement = document.getElementById('release-note-content'); updatingInfoElement = document.getElementById('updating-info'); const versionTime = document.getElementById('version-time').innerText; const localVersionTime = versionTime !== "unknown" ? (new Date(versionTime)).getTime() : 0; disableUpdateBtns(); updateInfoGotten = true; //无论成功与否都只执行一次,否则容易api超限... try { const data = await getLatestRelease(); const releaseNote = data.body; if (releaseNote) { releaseNoteElement.innerHTML = marked.parse(releaseNote, {mangle: false, headerIds: false}); } const latestVersion = data.tag_name; if (currentVersion) { if (latestVersion <= currentVersion) { noUpdate(); localStorage.setItem('isLatestVersion', 'true'); isLatestVersion = true; gradioApp().classList.remove('is-outdated'); } else { latestVersionElement.textContent = latestVersion; console.log(`New version ${latestVersion} found!`); if (!isInIframe) openUpdateToast(); gradioApp().classList.add('is-outdated'); localStorage.setItem('isLatestVersion', 'false'); isLatestVersion = false; } enableUpdateBtns(); } else { //如果当前版本号获取失败,使用时间比较 const latestVersionTime = (new Date(data.created_at)).getTime(); if (latestVersionTime) { const latestVersionInfo = `${latestVersion}` const manualUpdateInfo = `manual update` if (localVersionTime == 0) { const infoMessage = `Local version check failed. \nBut latest revision is ${latestVersionInfo}. \n\nWhen Update needed, \n- If you are using Docker, try to update package. \n- If you didn't use git, try ${manualUpdateInfo}.` versionInfoElement.innerHTML = marked.parse(infoMessage, {mangle: false, headerIds: false}); console.log(`New version ${latestVersion} found!`); disableUpdateBtn_enableCancelBtn(); localStorage.setItem('isLatestVersion', 'false'); isLatestVersion = false; gradioApp().classList.add('is-outdated'); } else if (localVersionTime < latestVersionTime) { const infoMessage = `Local version check failed, it seems to be a local rivision. \n\nBut latest revision is ${latestVersionInfo}. Try ${manualUpdateInfo}.` versionInfoElement.innerHTML = marked.parse(infoMessage, {mangle: false, headerIds: false}); console.log(`New version ${latestVersion} found!`); disableUpdateBtn_enableCancelBtn(); // if (!isInIframe) openUpdateToast(); localStorage.setItem('isLatestVersion', 'false'); isLatestVersion = false; gradioApp().classList.add('is-outdated'); } else { noUpdate("Local version check failed, it seems to be a local rivision.
But your revision is newer than the latest release."); gradioApp().classList.add('is-outdated'); enableUpdateBtns() localStorage.setItem('isLatestVersion', 'false'); isLatestVersion = false; } } } currentTime = new Date().getTime(); localStorage.setItem('lastCheckTime', currentTime); } catch (error) { console.error(error); disableUpdateBtn_enableCancelBtn() } } function getUpdateInfo() { window.open('https://github.com/gaizhenbiao/chuanhuchatgpt/releases/latest', '_blank'); closeUpdateToast(); } var updateSpinner = null; function bgUpdateChuanhu() { updateChuanhuBtn.click(); updatingInfoElement.innerText = i18n(updatingMsg_i18n); var updatingSpinner = document.getElementById('updating-spinner'); try { updateSpinner = new Spin.Spinner({color:'#06AE56',top:'45%',lines:9}).spin(updatingSpinner); } catch (error) { console.error("Can't create spinner") } updatingInfoElement.classList.remove('hideK'); disableUpdateBtns(); const releaseNoteWrap = document.getElementById('release-note-wrap'); releaseNoteWrap.style.setProperty('display', 'none'); statusObserver.observe(statusDisplay, { childList: true, subtree: true, characterData: true}); } function cancelUpdate() { closeUpdateToast(); } function openUpdateToast() { showingUpdateInfo = true; updateToast.style.setProperty('top', '0px'); showMask("update-toast"); } function closeUpdateToast() { updateToast.style.setProperty('top', '-600px'); showingUpdateInfo = false; if (updatingInfoElement.classList.contains('hideK') === false) { updatingInfoElement.classList.add('hideK'); } document.querySelector('.chuanhu-mask')?.remove(); } function manualCheckUpdate() { openUpdateToast(); updateLatestVersion(); currentTime = new Date().getTime(); localStorage.setItem('lastCheckTime', currentTime); } function updateSuccessHtml() { updatingInfoElement.innerText = i18n(updateSuccess_i18n); const gotoUpdateBtn = document.getElementById('goto-update-btn'); const successUpdateBtn = document.getElementById('success-update-btn'); gotoUpdateBtn.classList.add('hideK'); successUpdateBtn.classList.remove('hideK'); } function noUpdate(message="") { localStorage.setItem('isLatestVersion', 'true'); isLatestVersion = true; noUpdateHtml(message); } function noUpdateHtml(message="") { const versionInfoElement = document.getElementById('version-info-title'); const gotoUpdateBtn = document.getElementById('goto-update-btn'); const closeUpdateBtn = document.getElementById('close-update-btn'); const releaseNoteWrap = document.getElementById('release-note-wrap'); releaseNoteWrap.style.setProperty('display', 'none'); if (message === "") { versionInfoElement.textContent = i18n(usingLatest_i18n) } else { versionInfoElement.innerHTML = message; } gotoUpdateBtn.classList.add('hideK'); closeUpdateBtn.classList.remove('hideK'); } var updateStatus = null; function getUpdateStatus() { updateStatus = statusDisplay.querySelector("#update-status"); if (updateStatus) { return updateStatus.innerText; } else { return "unknown"; } } function disableUpdateBtns() { const updatesButtons = document.querySelectorAll('.btn-update'); updatesButtons.forEach( function (btn) { btn.disabled = true; }); } function enableUpdateBtns() { const updatesButtons = document.querySelectorAll('.btn-update'); updatesButtons.forEach( function (btn) { btn.disabled = false; }); } function disableUpdateBtn_enableCancelBtn() { document.querySelector('#update-button.btn-update').disabled = true; document.querySelector('#cancel-button.btn-update').disabled = false; } // function setUpdateWindowHeight() { // if (!showingUpdateInfo) {return;} // const scrollPosition = window.scrollY; // // const originalTop = updateToast.style.getPropertyValue('top'); // const resultTop = scrollPosition - 20 + 'px'; // updateToast.style.setProperty('top', resultTop); // }