import "@szhsin/react-menu/dist/index.css"; import "./index.css"; import "./fonts/outfit/outfit.css"; import React, { Suspense, lazy } from "react"; import ReactDOM from "react-dom/client"; import { NostrSystem } from "@snort/system"; import { SnortContext } from "@snort/system-react"; import { SnortSystemDb } from "@snort/system-web"; import { RouterProvider, createBrowserRouter } from "react-router-dom"; import { RootPage } from "@/pages/root"; import { TagPage } from "@/pages/tag"; import { LayoutPage } from "@/pages/layout"; import { ProfilePage } from "@/pages/profile-page"; import { StreamPageHandler } from "@/pages/stream-page"; import { ChatPopout } from "@/pages/chat-popout"; import { StreamProvidersPage } from "@/pages/providers"; import { defaultRelays } from "@/const"; import { CatchAllRoutePage } from "@/pages/catch-all"; import { IntlProvider } from "@/intl"; import { WidgetsPage } from "@/pages/widgets"; import { AlertsPage } from "@/pages/alerts"; import { StreamSummaryPage } from "@/pages/summary"; import { EmbededPage } from "./pages/embed"; import Markdown from "./element/markdown"; import { Async } from "./element/async-loader"; import { WasmOptimizer, WasmPath, wasmInit } from "./wasm"; const DashboardPage = lazy(() => import("./pages/dashboard")); import MockPage from "./pages/mock"; import { syncClock } from "./time-sync"; import SettingsPage from "./pages/settings"; import AccountSettingsTab from "./pages/settings/account"; import { StreamSettingsTab } from "./pages/settings/stream"; import Faq from "@/faq.md"; import { WorkerRelayInterface } from "@snort/worker-relay"; import WorkerVite from "@snort/worker-relay/src/worker?worker" const hasWasm = "WebAssembly" in globalThis; const db = new SnortSystemDb(); const workerRelay = new WorkerRelayInterface(import.meta.env.DEV ? new URL("@snort/worker-relay/dist/esm/worker.mjs", import.meta.url) : new WorkerVite()); const System = new NostrSystem({ db, optimizer: hasWasm ? WasmOptimizer : undefined, automaticOutboxModel: false, cachingRelay: workerRelay, }); System.on("event", (_, ev) => { workerRelay.event(ev); }) Object.entries(defaultRelays).forEach(params => { const [relay, settings] = params; System.ConnectToRelay(relay, settings); }); let hasInit = false; async function doInit() { if (hasInit) return; hasInit = true; if (hasWasm) { await wasmInit(WasmPath); } try { await workerRelay.debug("*"); await workerRelay.init("relay.db"); const stat = await workerRelay.summary(); console.log(stat); } catch (e) { console.error(e); } db.ready = await db.isAvailable(); await System.Init(); syncClock(); } const router = createBrowserRouter([ { element: , loader: async () => { await doInit(); return null; }, children: [ { path: "/mock", element: , }, { path: "/", element: , }, { path: "/t/:tag", element: , }, { path: "/p/:npub", element: , }, { path: "/:id", element: , }, { path: "/providers/:id?", element: , }, { path: "/settings", element: , children: [ { path: "", element: , }, { path: "stream", element: , }, ], }, { path: "/widgets", element: , }, { path: "/summary/:id", element: , }, { path: "/dashboard", element: ( ), }, { path: "/faq", element: ( { const req = await fetch(Faq); return await req.text(); }} then={v => } /> ), }, { path: "*", element: , }, ], }, { path: "/chat/:id", element: , loader: async () => { await doInit(); return null; }, }, { path: "/alert/:id/:type", element: , loader: async () => { await doInit(); return null; }, }, { path: "/embed/:id", element: , loader: async () => { await doInit(); return null; }, }, ]); const root = ReactDOM.createRoot(document.getElementById("root") as HTMLDivElement); root.render( );