aboutsummaryrefslogtreecommitdiff
path: root/examples/hello-next/bun-framework-next/fallback.development.tsx
blob: 1cd5f847e121212f0632ec586080a5cea25e7ba1 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
import { insertStyleSheet } from "./page-loader";
import type {
  FallbackMessageContainer,
  FallbackStep,
} from "../../../src/api/schema";

var once = false;
function insertGlobalStyleSheet(detail) {
  if (!once) {
    document.head.insertAdjacentHTML(
      "beforeend",
      `<meta name="next-head-count" content="${document.head.childElementCount}">`
    );
    once = true;
  }
  pageLoader.cssQueue.push(insertStyleSheet(detail).then(() => {}));
}

[...globalThis["__BUN"].allImportedStyles].map((detail) =>
  insertGlobalStyleSheet(detail)
);

document.addEventListener("onimportcss", insertGlobalStyleSheet, {
  passive: true,
});

import { renderError, _boot, pageLoader } from "./client.development";
import { renderFallbackError } from "bun-error";

function renderFallback({
  router,
  reason,
  problems,
}: FallbackMessageContainer) {
  const route = router.routes[router.route];

  if (!document.getElementById("__next")) {
    const next = document.createElement("div");
    next.id = "__next";
    document.body.prepend(next);
  }

  document.removeEventListener("onimportcss", insertGlobalStyleSheet);
  document.addEventListener("onimportcss", pageLoader.onImportCSS, {
    passive: true,
  });

  globalThis.__NEXT_DATA__.pages["/_app"] = [
    ...globalThis.__NEXT_DATA__.pages["/_app"],
    ...globalThis["__BUN"].allImportedStyles,
  ];

  return import(route)
    .then((Namespace) => {
      return _boot(Namespace, true);
    })
    .then(() => {
      const cssQueue = pageLoader.cssQueue.slice();
      pageLoader.cssQueue = [];
      return Promise.all([...cssQueue]);
    })
    .finally(() => {
      document.body.style.visibility = "visible";
      document.removeEventListener("onimportcss", pageLoader.onImportCSS);
    });
}

export default function render(props: FallbackMessageContainer) {
  renderFallback(props).then(
    () => {
      Promise.all(pageLoader.cssQueue).finally(() => {
        renderFallbackError(props);
        document.body.style.visibility = "visible";
      });
    },
    (err) => {
      Promise.all(pageLoader.cssQueue).finally(() => {
        renderFallbackError(props);
      });
    }
  );
}