diff options
Diffstat (limited to 'static/navigator.js')
-rw-r--r-- | static/navigator.js | 87 |
1 files changed, 87 insertions, 0 deletions
diff --git a/static/navigator.js b/static/navigator.js new file mode 100644 index 0000000..a4385fa --- /dev/null +++ b/static/navigator.js @@ -0,0 +1,87 @@ +let pageTransitionLock = false; +let pageTransitionAnimating = false; +let pageTransitionCleared = false; + +function bindAllRelativeAnchors() { + document.querySelectorAll('a[href^="/"]:not([navigator-bind])').forEach((el) => { + el.setAttribute('navigator-bind', 'true'); + el.addEventListener('click', (e) => { + e.preventDefault(); + goToPage((new URL(e.target.href)).pathname); + }); + }); +} + +function showContentIfPageIsLoaded () { + if (!pageTransitionLock) { + showContent(() => { + pageTransitionAnimating = false; + bindAllRelativeAnchors(); + }); + } +} + +function goToPage(url, cb) { + if (pageTransitionLock) return; + pageTransitionLock = true; + pageTransitionAnimating = true; + pageTransitionCleared = false; + + let footerCommandPrompt = document.querySelector('#footer-command-prompt .text'); + history.pushState({date: "new url -> " + url}, url, url); + + fetch(url).then((response) => { + response.text().then(html => { + let parser = new DOMParser(); + let htmlDOM = parser.parseFromString(html, 'text/html'); + + let mainContainer = document.querySelector('main'); + + function swapHTMLContent() { + if (!pageTransitionCleared) { + window.requestAnimationFrame(swapHTMLContent); + return; + } + + mainContainer.innerHTML = ''; + mainContainer.innerHTML = htmlDOM.querySelector('main').innerHTML; + if (headerAnimationTerminated) showContent(bindAllRelativeAnchors); + pageTransitionLock = false; + } + + swapHTMLContent(); + }); + }); + + typingAnimation( + footerCommandPrompt, + 'clear', + 0, + () => { + clearHeaderTerminal(() => { + hideContent(); + pageTransitionCleared = true; + footerCommandPrompt.innerHTML = ''; + if (url == "/") { + headerTerminalExecute( + "source jefferson.sh", + "source jefferson.sh", + showContentIfPageIsLoaded, + ); + } else if (url == "/contato") { + headerTerminalExecute( + "source pages/contato.sh", + "source pages/contato.sh", + showContentIfPageIsLoaded, + ); + } else if (url.match(/\/artigos/)) { + headerTerminalExecute( + `ARTICLE_FILE=.${decodeURI(url).replace(' ', '\\ ')};source pages/article.sh`, + `ARTICLE_FILE=.${decodeURI(url).replace(' ', '\\ ')};source pages/article.sh`, + showContentIfPageIsLoaded, + ); + } + }); + } + ); +} |