chore: setup app entries with mantine
This commit is contained in:
parent
a10816e43c
commit
13017299cf
|
|
@ -1,19 +1,22 @@
|
||||||
import { RemixBrowser } from "@remix-run/react";
|
import { RemixBrowser } from '@remix-run/react';
|
||||||
import { startTransition, StrictMode } from "react";
|
import { startTransition, StrictMode } from 'react';
|
||||||
import { hydrateRoot } from "react-dom/client";
|
import { hydrateRoot } from 'react-dom/client';
|
||||||
|
import { ClientProvider } from '@mantine/remix';
|
||||||
|
|
||||||
function hydrate() {
|
function hydrate() {
|
||||||
startTransition(() => {
|
startTransition(() => {
|
||||||
hydrateRoot(
|
hydrateRoot(
|
||||||
document,
|
document,
|
||||||
<StrictMode>
|
<StrictMode>
|
||||||
|
<ClientProvider>
|
||||||
<RemixBrowser />
|
<RemixBrowser />
|
||||||
|
</ClientProvider>
|
||||||
</StrictMode>
|
</StrictMode>
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
if (typeof requestIdleCallback === "function") {
|
if (typeof requestIdleCallback === 'function') {
|
||||||
requestIdleCallback(hydrate);
|
requestIdleCallback(hydrate);
|
||||||
} else {
|
} else {
|
||||||
// Safari doesn't support requestIdleCallback
|
// Safari doesn't support requestIdleCallback
|
||||||
|
|
|
||||||
|
|
@ -1,11 +1,10 @@
|
||||||
import { PassThrough } from "stream";
|
import type { EntryContext } from '@remix-run/node';
|
||||||
import type { EntryContext } from "@remix-run/node";
|
import { Response } from '@remix-run/node';
|
||||||
import { Response } from "@remix-run/node";
|
import { RemixServer } from '@remix-run/react';
|
||||||
import { RemixServer } from "@remix-run/react";
|
import { renderToString } from 'react-dom/server';
|
||||||
import isbot from "isbot";
|
import { injectStyles, createStylesServer } from '@mantine/remix';
|
||||||
import { renderToPipeableStream } from "react-dom/server";
|
|
||||||
|
|
||||||
const ABORT_DELAY = 5000;
|
const server = createStylesServer();
|
||||||
|
|
||||||
export default function handleRequest(
|
export default function handleRequest(
|
||||||
request: Request,
|
request: Request,
|
||||||
|
|
@ -13,99 +12,13 @@ export default function handleRequest(
|
||||||
responseHeaders: Headers,
|
responseHeaders: Headers,
|
||||||
remixContext: EntryContext
|
remixContext: EntryContext
|
||||||
) {
|
) {
|
||||||
return isbot(request.headers.get("user-agent"))
|
let markup = renderToString(
|
||||||
? handleBotRequest(
|
<RemixServer context={remixContext} url={request.url} />
|
||||||
request,
|
|
||||||
responseStatusCode,
|
|
||||||
responseHeaders,
|
|
||||||
remixContext
|
|
||||||
)
|
|
||||||
: handleBrowserRequest(
|
|
||||||
request,
|
|
||||||
responseStatusCode,
|
|
||||||
responseHeaders,
|
|
||||||
remixContext
|
|
||||||
);
|
);
|
||||||
}
|
responseHeaders.set('Content-Type', 'text/html');
|
||||||
|
|
||||||
function handleBotRequest(
|
return new Response(`<!DOCTYPE html>${injectStyles(markup, server)}`, {
|
||||||
request: Request,
|
status: responseStatusCode,
|
||||||
responseStatusCode: number,
|
headers: responseHeaders
|
||||||
responseHeaders: Headers,
|
|
||||||
remixContext: EntryContext
|
|
||||||
) {
|
|
||||||
return new Promise((resolve, reject) => {
|
|
||||||
let didError = false;
|
|
||||||
|
|
||||||
const { pipe, abort } = renderToPipeableStream(
|
|
||||||
<RemixServer context={remixContext} url={request.url} />,
|
|
||||||
{
|
|
||||||
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(
|
|
||||||
<RemixServer context={remixContext} url={request.url} />,
|
|
||||||
{
|
|
||||||
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);
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue