heartwood every commit a ring
1.8 KB raw
import React, { useEffect } from "react";
import { TransitionGroup, CSSTransition } from "react-transition-group";
import { ToastContainer } from "react-toastify";
import "react-toastify/dist/ReactToastify.css";

import { ContextProvider } from "../components/context";

import HotKeysMapping from "../components/HotKeysMapping";
import Sidebar from "../components/sidebar";

import "../styles/globals.css";

const MyApp = ({ Component, pageProps, router }) => {
  const pageNodeRef = React.useMemo(() => React.createRef(), [router.route]);

  // Clean up any stale service worker registered by the old Workbox sw.js
  // that used to ship with this project. Without this, browsers that
  // visited an earlier version keep a dead SW cached and log filesystem
  // / precache errors on every load.
  useEffect(() => {
    if (typeof window === "undefined" || !("serviceWorker" in navigator))
      return;
    navigator.serviceWorker
      .getRegistrations()
      .then((regs) => regs.forEach((r) => r.unregister()))
      .catch(() => {});
    if (window.caches && caches.keys) {
      caches.keys().then((keys) => keys.forEach((k) => caches.delete(k))).catch(() => {});
    }
  }, []);

  return (
    <ContextProvider>
      <HotKeysMapping>
        <ToastContainer position="top-right" />
        <TransitionGroup component={null}>
          <CSSTransition
            key={router.route}
            appear
            timeout={{
              appear: 500,
              enter: 500,
              exit: 250,
            }}
            classNames="page-transition"
            nodeRef={pageNodeRef}
          >
            <div className="page-transition" ref={pageNodeRef}>
              <Component {...pageProps} />
            </div>
          </CSSTransition>
        </TransitionGroup>
        <Sidebar />
      </HotKeysMapping>
    </ContextProvider>
  );
};

export default MyApp;