diff --git a/app/entry.client.tsx b/app/entry.client.tsx index 8338545..af41138 100644 --- a/app/entry.client.tsx +++ b/app/entry.client.tsx @@ -1,19 +1,22 @@ -import { RemixBrowser } from "@remix-run/react"; -import { startTransition, StrictMode } from "react"; -import { hydrateRoot } from "react-dom/client"; +import { RemixBrowser } from '@remix-run/react'; +import { startTransition, StrictMode } from 'react'; +import { hydrateRoot } from 'react-dom/client'; +import { ClientProvider } from '@mantine/remix'; function hydrate() { startTransition(() => { hydrateRoot( document, - + + + ); }); } -if (typeof requestIdleCallback === "function") { +if (typeof requestIdleCallback === 'function') { requestIdleCallback(hydrate); } else { // Safari doesn't support requestIdleCallback diff --git a/app/entry.server.tsx b/app/entry.server.tsx index d349f8e..5fcb97b 100644 --- a/app/entry.server.tsx +++ b/app/entry.server.tsx @@ -1,11 +1,10 @@ -import { PassThrough } from "stream"; -import type { EntryContext } from "@remix-run/node"; -import { Response } from "@remix-run/node"; -import { RemixServer } from "@remix-run/react"; -import isbot from "isbot"; -import { renderToPipeableStream } from "react-dom/server"; +import type { EntryContext } from '@remix-run/node'; +import { Response } from '@remix-run/node'; +import { RemixServer } from '@remix-run/react'; +import { renderToString } from 'react-dom/server'; +import { injectStyles, createStylesServer } from '@mantine/remix'; -const ABORT_DELAY = 5000; +const server = createStylesServer(); export default function handleRequest( request: Request, @@ -13,99 +12,13 @@ export default function handleRequest( responseHeaders: Headers, remixContext: EntryContext ) { - return isbot(request.headers.get("user-agent")) - ? handleBotRequest( - request, - responseStatusCode, - responseHeaders, - remixContext - ) - : handleBrowserRequest( - request, - responseStatusCode, - responseHeaders, - remixContext - ); -} + let markup = renderToString( + + ); + responseHeaders.set('Content-Type', 'text/html'); -function handleBotRequest( - request: Request, - responseStatusCode: number, - responseHeaders: Headers, - remixContext: EntryContext -) { - return new Promise((resolve, reject) => { - let didError = false; - - const { pipe, abort } = renderToPipeableStream( - , - { - onAllReady() { - const body = new PassThrough(); - - responseHeaders.set("Content-Type", "text/html"); - - resolve( - new Response(body, { - headers: responseHeaders, - status: didError ? 500 : responseStatusCode, - }) - ); - - pipe(body); - }, - onShellError(error: unknown) { - reject(error); - }, - onError(error: unknown) { - didError = true; - - console.error(error); - }, - } - ); - - setTimeout(abort, ABORT_DELAY); - }); -} - -function handleBrowserRequest( - request: Request, - responseStatusCode: number, - responseHeaders: Headers, - remixContext: EntryContext -) { - return new Promise((resolve, reject) => { - let didError = false; - - const { pipe, abort } = renderToPipeableStream( - , - { - onShellReady() { - const body = new PassThrough(); - - responseHeaders.set("Content-Type", "text/html"); - - resolve( - new Response(body, { - headers: responseHeaders, - status: didError ? 500 : responseStatusCode, - }) - ); - - pipe(body); - }, - onShellError(err: unknown) { - reject(err); - }, - onError(error: unknown) { - didError = true; - - console.error(error); - }, - } - ); - - setTimeout(abort, ABORT_DELAY); + return new Response(`${injectStyles(markup, server)}`, { + status: responseStatusCode, + headers: responseHeaders }); }