code-share/renderer/+onRenderClient.tsx

38 lines
913 B
TypeScript
Raw Permalink Normal View History

2024-02-22 12:14:58 +00:00
import ReactDOM from "react-dom/client";
2024-03-03 18:55:51 +07:00
import { getPageTitle } from "./utils";
2024-02-22 12:14:58 +00:00
import type { OnRenderClientAsync } from "vike/types";
2024-02-23 19:36:10 +07:00
import Layout from "./app";
2024-02-22 12:14:58 +00:00
let root: ReactDOM.Root;
export const onRenderClient: OnRenderClientAsync = async (
pageContext
): ReturnType<OnRenderClientAsync> => {
const { Page } = pageContext;
if (!Page)
throw new Error(
"My onRenderClient() hook expects pageContext.Page to be defined"
);
const container = document.getElementById("react-root");
if (!container) throw new Error("DOM element #react-root not found");
const page = (
<Layout pageContext={pageContext}>
<Page />
</Layout>
);
if (pageContext.isHydration) {
root = ReactDOM.hydrateRoot(container, page);
} else {
if (!root) {
root = ReactDOM.createRoot(container);
}
root.render(page);
}
2024-03-03 18:55:51 +07:00
document.title = getPageTitle(pageContext);
2024-02-22 12:14:58 +00:00
};