diff --git a/source/js/schedule.js b/source/js/schedule.js index 8f0c26c..b15fb8a 100644 --- a/source/js/schedule.js +++ b/source/js/schedule.js @@ -92,13 +92,14 @@ return eventContent; } - function fetchData() { + async function fetchData() { const eventList = document.querySelector('.event-list'); if (!eventList) return; - fetch(request_url.href).then(response => { - return response.json(); - }).then(data => { + try { + const response = await fetch(request_url.href); + const data = await response.json(); + if (data.items.length === 0) { eventList.innerHTML = '
'; return; @@ -127,7 +128,10 @@ eventList.insertAdjacentHTML('beforeend', buildEventDOM(tense, event, start, end)); prevEnd = end; }); - }); + } catch (error) { + // eslint-disable-next-line no-console + console.error('Error fetching calendar data:', error); + } } fetchData(); diff --git a/source/js/third-party/addtoany.js b/source/js/third-party/addtoany.js index f9009f8..b0473aa 100644 --- a/source/js/third-party/addtoany.js +++ b/source/js/third-party/addtoany.js @@ -1,8 +1,6 @@ /* global NexT */ -document.addEventListener('page:loaded', () => { - NexT.utils.getScript('https://static.addtoany.com/menu/page.js', { condition: window.a2a }) - .then(() => { - window.a2a.init(); - }); +document.addEventListener('page:loaded', async () => { + await NexT.utils.getScript('https://static.addtoany.com/menu/page.js', { condition: window.a2a }); + window.a2a.init(); }); diff --git a/source/js/third-party/comments/changyan.js b/source/js/third-party/comments/changyan.js index 18a1be4..cac35c5 100644 --- a/source/js/third-party/comments/changyan.js +++ b/source/js/third-party/comments/changyan.js @@ -1,6 +1,6 @@ /* global NexT, CONFIG */ -document.addEventListener('page:loaded', () => { +document.addEventListener('page:loaded', async () => { const { appid, appkey } = CONFIG.changyan; const mainJs = 'https://cy-cdn.kuaizhan.com/upload/changyan.js'; const countJs = `https://cy-cdn.kuaizhan.com/upload/plugins/plugins.list.count.js?clientId=${appid}`; @@ -17,23 +17,20 @@ document.addEventListener('page:loaded', () => { // When scroll to comment section if (CONFIG.page.comments && !CONFIG.page.isHome) { - NexT.utils.loadComments('#SOHUCS') - .then(() => { - return NexT.utils.getScript(mainJs, { - attributes: { - async: true - } - }); - }) - .then(() => { - window.changyan.api.config({ - appid, - conf: appkey - }); - }) - .catch(error => { - // eslint-disable-next-line no-console - console.error('Failed to load Changyan', error); + try { + await NexT.utils.loadComments('#SOHUCS'); + await NexT.utils.getScript(mainJs, { + attributes: { + async: true + } }); + window.changyan.api.config({ + appid, + conf: appkey + }); + } catch (error) { + // eslint-disable-next-line no-console + console.error('Failed to load Changyan', error); + } } }); diff --git a/source/js/third-party/comments/disqus.js b/source/js/third-party/comments/disqus.js index 4d1ca9e..ce5b8c3 100644 --- a/source/js/third-party/comments/disqus.js +++ b/source/js/third-party/comments/disqus.js @@ -1,6 +1,6 @@ /* global NexT, CONFIG, DISQUS */ -document.addEventListener('page:loaded', () => { +document.addEventListener('page:loaded', async () => { if (CONFIG.disqus.count) { if (window.DISQUSWIDGETS) { @@ -24,18 +24,17 @@ document.addEventListener('page:loaded', () => { this.language = CONFIG.disqus.i18n.disqus; } }; - NexT.utils.loadComments('#disqus_thread').then(() => { - if (window.DISQUS) { - DISQUS.reset({ - reload: true, - config: window.disqus_config - }); - } else { - NexT.utils.getScript(`https://${CONFIG.disqus.shortname}.disqus.com/embed.js`, { - attributes: { dataset: { timestamp: '' + +new Date() } } - }); - } - }); + await NexT.utils.loadComments('#disqus_thread'); + if (window.DISQUS) { + DISQUS.reset({ + reload: true, + config: window.disqus_config + }); + } else { + NexT.utils.getScript(`https://${CONFIG.disqus.shortname}.disqus.com/embed.js`, { + attributes: { dataset: { timestamp: '' + +new Date() } } + }); + } } }); diff --git a/source/js/third-party/comments/disqusjs.js b/source/js/third-party/comments/disqusjs.js index d8401ee..4975d35 100644 --- a/source/js/third-party/comments/disqusjs.js +++ b/source/js/third-party/comments/disqusjs.js @@ -1,21 +1,19 @@ /* global NexT, CONFIG, DisqusJS */ -document.addEventListener('page:loaded', () => { +document.addEventListener('page:loaded', async () => { if (!CONFIG.page.comments) return; - NexT.utils.loadComments('#disqus_thread') - .then(() => NexT.utils.getScript(CONFIG.disqusjs.js, { condition: window.DisqusJS })) - .then(() => { - window.dsqjs = new DisqusJS({ - api : CONFIG.disqusjs.api || 'https://disqus.com/api/', - apikey : CONFIG.disqusjs.apikey, - shortname : CONFIG.disqusjs.shortname, - url : CONFIG.page.permalink, - identifier: CONFIG.page.path, - title : CONFIG.page.title - }); - window.dsqjs.render(document.querySelector('.disqusjs-container')); - }); + await NexT.utils.loadComments('#disqus_thread'); + await NexT.utils.getScript(CONFIG.disqusjs.js, { condition: window.DisqusJS }); + window.dsqjs = new DisqusJS({ + api : CONFIG.disqusjs.api || 'https://disqus.com/api/', + apikey : CONFIG.disqusjs.apikey, + shortname : CONFIG.disqusjs.shortname, + url : CONFIG.page.permalink, + identifier: CONFIG.page.path, + title : CONFIG.page.title + }); + window.dsqjs.render(document.querySelector('.disqusjs-container')); }); document.addEventListener('pjax:send', () => { diff --git a/source/js/third-party/comments/gitalk.js b/source/js/third-party/comments/gitalk.js index 08d07f4..983d539 100644 --- a/source/js/third-party/comments/gitalk.js +++ b/source/js/third-party/comments/gitalk.js @@ -1,24 +1,22 @@ /* global NexT, CONFIG, Gitalk */ -document.addEventListener('page:loaded', () => { +document.addEventListener('page:loaded', async () => { if (!CONFIG.page.comments) return; - NexT.utils.loadComments('.gitalk-container') - .then(() => NexT.utils.getScript(CONFIG.gitalk.js, { - condition: window.Gitalk - })) - .then(() => { - const gitalk = new Gitalk({ - clientID : CONFIG.gitalk.client_id, - clientSecret : CONFIG.gitalk.client_secret, - repo : CONFIG.gitalk.repo, - owner : CONFIG.gitalk.github_id, - admin : [CONFIG.gitalk.admin_user], - id : CONFIG.gitalk.path_md5, - proxy : CONFIG.gitalk.proxy, - language : CONFIG.gitalk.language || window.navigator.language, - distractionFreeMode: CONFIG.gitalk.distraction_free_mode - }); - gitalk.render(document.querySelector('.gitalk-container')); - }); + await NexT.utils.loadComments('.gitalk-container'); + await NexT.utils.getScript(CONFIG.gitalk.js, { + condition: window.Gitalk + }); + const gitalk = new Gitalk({ + clientID : CONFIG.gitalk.client_id, + clientSecret : CONFIG.gitalk.client_secret, + repo : CONFIG.gitalk.repo, + owner : CONFIG.gitalk.github_id, + admin : [CONFIG.gitalk.admin_user], + id : CONFIG.gitalk.path_md5, + proxy : CONFIG.gitalk.proxy, + language : CONFIG.gitalk.language || window.navigator.language, + distractionFreeMode: CONFIG.gitalk.distraction_free_mode + }); + gitalk.render(document.querySelector('.gitalk-container')); }); diff --git a/source/js/third-party/comments/isso.js b/source/js/third-party/comments/isso.js index 2c70601..ac70745 100644 --- a/source/js/third-party/comments/isso.js +++ b/source/js/third-party/comments/isso.js @@ -1,15 +1,15 @@ /* global NexT, CONFIG */ -document.addEventListener('page:loaded', () => { +document.addEventListener('page:loaded', async () => { if (!CONFIG.page.comments) return; - NexT.utils.loadComments('#isso-thread') - .then(() => NexT.utils.getScript(`${CONFIG.isso}js/embed.min.js`, { - attributes: { - dataset: { - isso: `${CONFIG.isso}` - } - }, - parentNode: document.querySelector('#isso-thread') - })); + await NexT.utils.loadComments('#isso-thread'); + await NexT.utils.getScript(`${CONFIG.isso}js/embed.min.js`, { + attributes: { + dataset: { + isso: `${CONFIG.isso}` + } + }, + parentNode: document.querySelector('#isso-thread') + }); }); diff --git a/source/js/third-party/comments/livere.js b/source/js/third-party/comments/livere.js index c4bcd2e..9166261 100644 --- a/source/js/third-party/comments/livere.js +++ b/source/js/third-party/comments/livere.js @@ -1,19 +1,18 @@ /* global NexT, CONFIG, LivereTower */ -document.addEventListener('page:loaded', () => { +document.addEventListener('page:loaded', async () => { if (!CONFIG.page.comments) return; - NexT.utils.loadComments('#lv-container').then(() => { - window.livereOptions = { - refer: CONFIG.page.path.replace(/index\.html$/, '') - }; + await NexT.utils.loadComments('#lv-container'); + window.livereOptions = { + refer: CONFIG.page.path.replace(/index\.html$/, '') + }; - if (typeof LivereTower === 'function') return; + if (typeof LivereTower === 'function') return; - NexT.utils.getScript('https://cdn-city.livere.com/js/embed.dist.js', { - attributes: { - async: true - } - }); + NexT.utils.getScript('https://cdn-city.livere.com/js/embed.dist.js', { + attributes: { + async: true + } }); }); diff --git a/source/js/third-party/comments/utterances.js b/source/js/third-party/comments/utterances.js index 332ee05..19af9d5 100644 --- a/source/js/third-party/comments/utterances.js +++ b/source/js/third-party/comments/utterances.js @@ -1,17 +1,17 @@ /* global NexT, CONFIG */ -document.addEventListener('page:loaded', () => { +document.addEventListener('page:loaded', async () => { if (!CONFIG.page.comments) return; - NexT.utils.loadComments('.utterances-container') - .then(() => NexT.utils.getScript('https://utteranc.es/client.js', { - attributes: { - async : true, - crossOrigin : 'anonymous', - 'repo' : CONFIG.utterances.repo, - 'issue-term': CONFIG.utterances.issue_term, - 'theme' : CONFIG.utterances.theme - }, - parentNode: document.querySelector('.utterances-container') - })); + await NexT.utils.loadComments('.utterances-container'); + await NexT.utils.getScript('https://utteranc.es/client.js', { + attributes: { + async : true, + crossOrigin : 'anonymous', + 'repo' : CONFIG.utterances.repo, + 'issue-term': CONFIG.utterances.issue_term, + 'theme' : CONFIG.utterances.theme + }, + parentNode: document.querySelector('.utterances-container') + }); }); diff --git a/source/js/third-party/search/algolia-search.js b/source/js/third-party/search/algolia-search.js index 047b6d3..e77dcf2 100644 --- a/source/js/third-party/search/algolia-search.js +++ b/source/js/third-party/search/algolia-search.js @@ -22,7 +22,7 @@ document.addEventListener('DOMContentLoaded', () => { let isSearching = false; let pendingQuery = null; - const searchAlgolia = async(searchText, page = 0) => { + const searchAlgolia = async (searchText, page = 0) => { if (isSearching) { pendingQuery = { searchText, page }; return; @@ -84,7 +84,7 @@ document.addEventListener('DOMContentLoaded', () => { } }; - const inputEventFunction = async() => { + const inputEventFunction = async () => { const searchText = input.value.trim(); if (searchText === '') { container.innerHTML = '
'; diff --git a/source/js/third-party/statistics/firestore.js b/source/js/third-party/statistics/firestore.js index 3ea7ba6..043df2f 100644 --- a/source/js/third-party/statistics/firestore.js +++ b/source/js/third-party/statistics/firestore.js @@ -6,27 +6,26 @@ firebase.initializeApp({ }); (function() { - const getCount = (doc, increaseCount) => { + const getCount = async (doc, increaseCount) => { // IncreaseCount will be false when not in article page - return doc.get().then(d => { - // Has no data, initialize count - let count = d.exists ? d.data().count : 0; - // If first view this article - if (increaseCount) { - // Increase count - count++; - doc.set({ - count - }); - } - return count; - }); + const d = await doc.get(); + // Has no data, initialize count + let count = d.exists ? d.data().count : 0; + // If first view this article + if (increaseCount) { + // Increase count + count++; + doc.set({ + count + }); + } + return count; }; const db = firebase.firestore(); const articles = db.collection(CONFIG.firestore.collection); - document.addEventListener('page:loaded', () => { + document.addEventListener('page:loaded', async () => { if (CONFIG.page.isPost) { // Fix issue #118 @@ -40,20 +39,18 @@ firebase.initializeApp({ // Mark as visited localStorage.setItem(title, true); } - getCount(doc, increaseCount).then(count => { - document.querySelector('.firestore-visitors-count').innerText = count; - }); + const count = await getCount(doc, increaseCount); + document.querySelector('.firestore-visitors-count').innerText = count; } else if (CONFIG.page.isHome) { const promises = [...document.querySelectorAll('.post-title')].map(element => { const title = element.textContent.trim(); const doc = articles.doc(title); return getCount(doc); }); - Promise.all(promises).then(counts => { - const metas = document.querySelectorAll('.firestore-visitors-count'); - counts.forEach((val, idx) => { - metas[idx].innerText = val; - }); + const counts = await Promise.all(promises); + const metas = document.querySelectorAll('.firestore-visitors-count'); + counts.forEach((val, idx) => { + metas[idx].innerText = val; }); } }); diff --git a/source/js/third-party/statistics/lean-analytics.js b/source/js/third-party/statistics/lean-analytics.js index 8397112..5c624ef 100644 --- a/source/js/third-party/statistics/lean-analytics.js +++ b/source/js/third-party/statistics/lean-analytics.js @@ -7,62 +7,60 @@ return document.getElementById(url).querySelector('.leancloud-visitors-count'); }; - const addCount = Counter => { + const addCount = async Counter => { const visitors = document.querySelector('.leancloud_visitors'); const url = decodeURI(visitors.id); const title = visitors.dataset.flagTitle; - Counter('get', `/classes/Counter?where=${encodeURIComponent(JSON.stringify({ url }))}`) - .then(response => response.json()) - .then(({ results }) => { - if (results.length > 0) { - const counter = results[0]; - leancloudSelector(url).innerText = counter.time + 1; - Counter('put', '/classes/Counter/' + counter.objectId, { + try { + const response = await Counter('get', `/classes/Counter?where=${encodeURIComponent(JSON.stringify({ url }))}`); + const { results } = await response.json(); + if (results.length > 0) { + const counter = results[0]; + leancloudSelector(url).innerText = counter.time + 1; + try { + await Counter('put', '/classes/Counter/' + counter.objectId, { time: { '__op' : 'Increment', 'amount': 1 } - }) - .catch(error => { - console.error('Failed to save visitor count', error); - }); - } else if (CONFIG.leancloud_visitors.security) { - leancloudSelector(url).innerText = 'Counter not initialized! More info at console err msg.'; - console.error('ATTENTION! LeanCloud counter has security bug, see how to solve it here: https://github.com/theme-next/hexo-leancloud-counter-security. \n However, you can still use LeanCloud without security, by setting `security` option to `false`.'); - } else { - Counter('post', '/classes/Counter', { title, url, time: 1 }) - .then(response => response.json()) - .then(() => { - leancloudSelector(url).innerText = 1; - }) - .catch(error => { - console.error('Failed to create', error); - }); + }); + } catch (error) { + console.error('Failed to save visitor count', error); } - }) - .catch(error => { - console.error('LeanCloud Counter Error', error); - }); + } else if (CONFIG.leancloud_visitors.security) { + leancloudSelector(url).innerText = 'Counter not initialized! More info at console err msg.'; + console.error('ATTENTION! LeanCloud counter has security bug, see how to solve it here: https://github.com/theme-next/hexo-leancloud-counter-security. \n However, you can still use LeanCloud without security, by setting `security` option to `false`.'); + } else { + try { + const response = await Counter('post', '/classes/Counter', { title, url, time: 1 }); + await response.json(); + leancloudSelector(url).innerText = 1; + } catch (error) { + console.error('Failed to create', error); + } + } + } catch (error) { + console.error('LeanCloud Counter Error', error); + } }; - const showTime = Counter => { + const showTime = async Counter => { const visitors = document.querySelectorAll('.leancloud_visitors'); const entries = [...visitors].map(element => { return decodeURI(element.id); }); - Counter('get', `/classes/Counter?where=${encodeURIComponent(JSON.stringify({ url: { '$in': entries } }))}`) - .then(response => response.json()) - .then(({ results }) => { - for (const url of entries) { - const target = results.find(item => item.url === url); - leancloudSelector(url).innerText = target ? target.time : 0; - } - }) - .catch(error => { - console.error('LeanCloud Counter Error', error); - }); + try { + const response = await Counter('get', `/classes/Counter?where=${encodeURIComponent(JSON.stringify({ url: { '$in': entries } }))}`); + const { results } = await response.json(); + for (const url of entries) { + const target = results.find(item => item.url === url); + leancloudSelector(url).innerText = target ? target.time : 0; + } + } catch (error) { + console.error('LeanCloud Counter Error', error); + } }; const { app_id, app_key, server_url } = CONFIG.leancloud_visitors; @@ -93,15 +91,17 @@ api_server = `https://${app_id.slice(0, 8).toLowerCase()}.api.lncldglobal.com`; } - document.addEventListener('page:loaded', () => { + document.addEventListener('page:loaded', async () => { if (api_server) { fetchData(api_server); } else { - fetch(`https://app-router.leancloud.cn/2/route?appId=${app_id}`) - .then(response => response.json()) - .then(({ api_server }) => { - fetchData(`https://${api_server}`); - }); + try { + const response = await fetch(`https://app-router.leancloud.cn/2/route?appId=${app_id}`); + const { api_server } = await response.json(); + fetchData(`https://${api_server}`); + } catch (error) { + console.error('Failed to fetch API server', error); + } } }); })(); diff --git a/source/js/third-party/tags/mermaid.js b/source/js/third-party/tags/mermaid.js index e913c0e..14e2445 100644 --- a/source/js/third-party/tags/mermaid.js +++ b/source/js/third-party/tags/mermaid.js @@ -1,32 +1,31 @@ /* global NexT, CONFIG, mermaid */ -document.addEventListener('page:loaded', () => { +document.addEventListener('page:loaded', async () => { const mermaidElements = document.querySelectorAll('pre > .mermaid'); if (mermaidElements.length) { - NexT.utils.getScript(CONFIG.mermaid.js, { + await NexT.utils.getScript(CONFIG.mermaid.js, { condition: window.mermaid - }).then(() => { - mermaidElements.forEach(element => { - const box = document.createElement('div'); - box.className = 'code-container'; - const newElement = document.createElement('div'); - newElement.innerHTML = element.innerHTML; - newElement.className = 'mermaid'; - box.appendChild(newElement); - if (CONFIG.codeblock.copy_button.enable) { - NexT.utils.registerCopyButton(box, box, element.textContent); - } - const parent = element.parentNode; - parent.parentNode.replaceChild(box, parent); - }); - mermaid.initialize({ - theme : CONFIG.darkmode && window.matchMedia('(prefers-color-scheme: dark)').matches ? CONFIG.mermaid.theme.dark : CONFIG.mermaid.theme.light, - logLevel : 4, - flowchart: { curve: 'linear' }, - gantt : { axisFormat: '%m/%d/%Y' }, - sequence : { actorMargin: 50 } - }); - mermaid.run(); }); + mermaidElements.forEach(element => { + const box = document.createElement('div'); + box.className = 'code-container'; + const newElement = document.createElement('div'); + newElement.innerHTML = element.innerHTML; + newElement.className = 'mermaid'; + box.appendChild(newElement); + if (CONFIG.codeblock.copy_button.enable) { + NexT.utils.registerCopyButton(box, box, element.textContent); + } + const parent = element.parentNode; + parent.parentNode.replaceChild(box, parent); + }); + mermaid.initialize({ + theme : CONFIG.darkmode && window.matchMedia('(prefers-color-scheme: dark)').matches ? CONFIG.mermaid.theme.dark : CONFIG.mermaid.theme.light, + logLevel : 4, + flowchart: { curve: 'linear' }, + gantt : { axisFormat: '%m/%d/%Y' }, + sequence : { actorMargin: 50 } + }); + mermaid.run(); } }); diff --git a/source/js/third-party/tags/pdf.js b/source/js/third-party/tags/pdf.js index 7e82891..47a6297 100644 --- a/source/js/third-party/tags/pdf.js +++ b/source/js/third-party/tags/pdf.js @@ -1,22 +1,21 @@ /* global NexT, CONFIG, PDFObject */ -document.addEventListener('page:loaded', () => { +document.addEventListener('page:loaded', async () => { if (document.querySelectorAll('.pdf-container').length) { - NexT.utils.getScript(CONFIG.pdf.object_url, { + await NexT.utils.getScript(CONFIG.pdf.object_url, { condition: window.PDFObject - }).then(() => { - document.querySelectorAll('.pdf-container').forEach(element => { - PDFObject.embed(element.dataset.target, element, { - pdfOpenParams: { - navpanes : 0, - toolbar : 0, - statusbar: 0, - pagemode : 'thumbs', - view : 'FitH' - }, - PDFJS_URL: CONFIG.pdf.url, - height : element.dataset.height - }); + }); + document.querySelectorAll('.pdf-container').forEach(element => { + PDFObject.embed(element.dataset.target, element, { + pdfOpenParams: { + navpanes : 0, + toolbar : 0, + statusbar: 0, + pagemode : 'thumbs', + view : 'FitH' + }, + PDFJS_URL: CONFIG.pdf.url, + height : element.dataset.height }); }); } diff --git a/source/js/third-party/tags/wavedrom.js b/source/js/third-party/tags/wavedrom.js index ddd9a1d..48998a9 100644 --- a/source/js/third-party/tags/wavedrom.js +++ b/source/js/third-party/tags/wavedrom.js @@ -1,13 +1,11 @@ /* global NexT, CONFIG, WaveDrom */ -document.addEventListener('page:loaded', () => { - NexT.utils.getScript(CONFIG.wavedrom.js, { +document.addEventListener('page:loaded', async () => { + await NexT.utils.getScript(CONFIG.wavedrom.js, { condition: window.WaveDrom - }).then(() => { - NexT.utils.getScript(CONFIG.wavedrom_skin.js, { - condition: window.WaveSkin - }).then(() => { - WaveDrom.ProcessAll(); - }); }); + await NexT.utils.getScript(CONFIG.wavedrom_skin.js, { + condition: window.WaveSkin + }); + WaveDrom.ProcessAll(); }); diff --git a/source/js/utils.js b/source/js/utils.js index 3dcf058..9844075 100644 --- a/source/js/utils.js +++ b/source/js/utils.js @@ -39,18 +39,19 @@ NexT.utils = { // One-click copy code support. target.insertAdjacentHTML('beforeend', '
'); const button = target.querySelector('.copy-btn'); - button.addEventListener('click', () => { + button.addEventListener('click', async () => { if (!code) { const lines = element.querySelector('.code') || element.querySelector('code'); code = lines.innerText; } if (navigator.clipboard) { // https://caniuse.com/mdn-api_clipboard_writetext - navigator.clipboard.writeText(code).then(() => { + try { + await navigator.clipboard.writeText(code); button.querySelector('i').className = 'fa fa-check-circle fa-fw'; - }, () => { + } catch { button.querySelector('i').className = 'fa fa-times-circle fa-fw'; - }); + } } else { button.querySelector('i').className = 'fa fa-times-circle fa-fw'; }