portal-dashboard/app/root.tsx

104 lines
2.8 KiB
TypeScript
Raw Normal View History

2024-03-22 17:53:39 +00:00
import {
Links,
Meta,
Outlet,
Scripts,
ScrollRestoration,
} from "@remix-run/react";
2024-03-05 16:56:17 +00:00
import stylesheet from "./tailwind.css?url";
2024-03-22 17:53:39 +00:00
import type { LinksFunction } from "@remix-run/node";
2024-03-05 16:56:17 +00:00
// Supports weights 200-800
2024-03-22 17:53:39 +00:00
import "@fontsource-variable/manrope";
import { Refine } from "@refinedev/core";
2024-03-13 13:38:01 +00:00
import routerProvider from "@refinedev/remix-router";
2024-03-22 17:53:39 +00:00
import { notificationProvider } from "~/data/notification-provider";
import { SdkContextProvider, useSdk } from "~/components/lib/sdk-context";
import { Toaster } from "~/components/ui/toaster";
import { getProviders } from "~/data/providers.js";
import { Sdk } from "@lumeweb/portal-sdk";
import resources from "~/data/resources.js";
import { QueryClient, QueryClientProvider } from "@tanstack/react-query";
import {useEffect, useMemo, useState} from "react";
import {PinningProcess} from "~/data/pinning.js";
2024-03-05 16:56:17 +00:00
export const links: LinksFunction = () => [
2024-03-22 17:53:39 +00:00
{ rel: "stylesheet", href: stylesheet },
2024-03-05 16:56:17 +00:00
];
const queryClient = new QueryClient();
2024-03-22 17:53:39 +00:00
export function Layout({ children }: { children: React.ReactNode }) {
return (
<html lang="en">
<head>
<meta charSet="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<Meta />
<Links />
</head>
<body className="overflow-hidden">
2024-03-05 16:56:17 +00:00
{children}
2024-03-22 17:53:39 +00:00
<Toaster />
<ScrollRestoration />
<Scripts />
</body>
</html>
);
2024-03-05 16:56:17 +00:00
}
function App() {
2024-03-22 17:53:39 +00:00
const sdk = useSdk();
const providers = useMemo(() => getProviders(sdk as Sdk), [sdk]);
useMemo(() => PinningProcess.setupSdk(sdk as Sdk), [sdk]);
2024-03-22 17:53:39 +00:00
return (
<QueryClientProvider client={queryClient}>
<Refine
authProvider={providers.auth}
routerProvider={routerProvider}
notificationProvider={notificationProvider}
dataProvider={{
default: providers.default,
files: providers.files,
}}
resources={resources}
options={{ disableTelemetry: true }}>
<Outlet />
</Refine>
</QueryClientProvider>
);
2024-03-05 16:56:17 +00:00
}
export default function Root() {
const [portalUrl, setPortalUrl] = useState(import.meta.env.VITE_PORTAL_URL);
useEffect(() => {
if (!portalUrl) {
fetch('/api/meta')
.then(response => response.json())
.then(data => {
2024-03-26 05:18:12 +00:00
setPortalUrl(`https://${data.domain}`);
})
.catch((error: any) => {
console.error('Failed to fetch portal url:', error);
});
}
}, [portalUrl]);
if (!portalUrl) {
return <p>Loading...</p>;
}
const sdk = Sdk.create(portalUrl);
2024-03-22 17:53:39 +00:00
return (
<SdkContextProvider sdk={sdk}>
<App />
</SdkContextProvider>
);
}
2024-03-05 16:56:17 +00:00
export function HydrateFallback() {
2024-03-22 17:53:39 +00:00
return <p>Loading...</p>;
2024-03-05 16:56:17 +00:00
}