Aiden Bai
2022-05-03 d38f9bec70c7e46d9e7662ba3925abc9cdd9370a
Rename API and generalize router API
2 files modified
32 ■■■■■ changed files
assets/js/router.js 19 ●●●● patch | view | raw | blame | history
layouts/partials/head.html 13 ●●●● patch | view | raw | blame | history
assets/js/router.js
@@ -1,25 +1,12 @@
import { router, navigate } from "https://unpkg.com/million@1.8.9-0/dist/router.mjs"
export const init = (loader) => {
export const attachSPARouting = (draw) => {
  // SPA navigation for access later
  window.navigate = navigate
  // We only mutate document.title and content within .singlePage element
  router(".singlePage")
  // We need on initial load, then subsequent redirs
  window.addEventListener("million:navigate", () => callback(loader))
  window.addEventListener("DOMContentLoaded", () => callback(loader))
}
export const callback = (loader) => {
  // requestAnimationFrame() delays graph draw until SPA routing is finished
  const draw = () => {
    const container = document.getElementById("graph-container")
    // retry if the graph is not ready
    if (!container) return requestAnimationFrame(draw)
    // clear the graph in case there is anything within it
    container.textContent = ""
    loader()
  }
  requestAnimationFrame(draw)
  window.addEventListener("million:navigate", () => requestAnimationFrame(draw))
  window.addEventListener("DOMContentLoaded", () => requestAnimationFrame(draw))
}
layouts/partials/head.html
@@ -66,9 +66,15 @@
  {{ $router := resources.Get "js/router.js" | resources.Fingerprint "md5" |
  resources.Minify }}
  <script type="module">
    import { init } from '{{$router.Permalink}}';
    import { attachSPARouting } from '{{$router.Permalink}}';
    // NOTE: everything within this callback will be executed for every page navigation. This is a good place to put JavaScript that loads or modifies data on the page.
    init(() => {
    const draw = () => {
      const container = document.getElementById("graph-container")
      // retry if the graph is not ready
      if (!container) return requestAnimationFrame(draw)
      // clear the graph in case there is anything within it
      container.textContent = ""
      drawGraph(
        {{strings.TrimRight "/" .Page.Permalink}},
        {{strings.TrimRight "/" .Site.BaseURL}},
@@ -82,7 +88,8 @@
      {{if $.Site.Data.config.enableLinkPreview}}
        initPopover({{strings.TrimRight "/" .Site.BaseURL }})
      {{end}}
    });
    };
    attachSPARouting(draw);
  </script>
  {{else}}
  <script>window.navigate = (url) => window.location.href = url</script>