import "core-js/stable"; import "./stores/__old/imports"; import "@/setup/ga"; import "@/assets/css/index.css"; import React, { Suspense, useCallback } from "react"; import type { ReactNode } from "react"; import ReactDOM from "react-dom"; import { HelmetProvider } from "react-helmet-async"; import { useTranslation } from "react-i18next"; import { BrowserRouter, HashRouter } from "react-router-dom"; import { useAsync } from "react-use"; import { registerSW } from "virtual:pwa-register"; import { Button } from "@/components/buttons/Button"; import { Icon, Icons } from "@/components/Icon"; import { Loading } from "@/components/layout/Loading"; import { useAuthRestore } from "@/hooks/auth/useAuthRestore"; import { useBackendUrl } from "@/hooks/auth/useBackendUrl"; import { ErrorBoundary } from "@/pages/errors/ErrorBoundary"; import { MigrationPart } from "@/pages/parts/migrations/MigrationPart"; import { LargeTextPart } from "@/pages/parts/util/LargeTextPart"; import App from "@/setup/App"; import { conf } from "@/setup/config"; import i18n from "@/setup/i18n"; import { useAuthStore } from "@/stores/auth"; import { BookmarkSyncer } from "@/stores/bookmarks/BookmarkSyncer"; import { useLanguageStore } from "@/stores/language"; import { ProgressSyncer } from "@/stores/progress/ProgressSyncer"; import { SettingsSyncer } from "@/stores/subtitles/SettingsSyncer"; import { useThemeStore } from "@/stores/theme"; import { initializeChromecast } from "./setup/chromecast"; import { initializeOldStores } from "./stores/__old/migrations"; // initialize const key = (window as any)?.__CONFIG__?.VITE_KEY ?? import.meta.env.VITE_KEY ?? null; if (key) { (window as any).initMW(conf().PROXY_URLS, key); } initializeChromecast(); registerSW({ immediate: true, }); function LoadingScreen(props: { type: "user" | "lazy" }) { const mapping = { user: "screens.loadingUser", lazy: "screens.loadingApp", }; const { t } = useTranslation(); return ( }> {t(mapping[props.type] ?? "unknown.translation")} ); } function ErrorScreen(props: { children: ReactNode; showResetButton?: boolean; }) { const { t } = useTranslation(); const setBackendUrl = useAuthStore((s) => s.setBackendUrl); const resetBackend = useCallback(() => { setBackendUrl(null); // eslint-disable-next-line no-restricted-globals location.reload(); }, [setBackendUrl]); return ( } > {props.children} {props.showResetButton ? (
) : null}
); } function AuthWrapper() { const status = useAuthRestore(); const backendUrl = conf().BACKEND_URL; const userBackendUrl = useBackendUrl(); const { t } = useTranslation(); if (status.loading) return ; if (status.error) return ( {t( backendUrl !== userBackendUrl ? "screens.loadingUserError.textWithReset" : "screens.loadingUserError.text" )} ); return ; } function MigrationRunner() { const status = useAsync(async () => { i18n.changeLanguage(useLanguageStore.getState().language); await initializeOldStores(); }, []); const { t } = useTranslation(); if (status.loading) return ; if (status.error) return {t("screens.migration.failed")}; return ; } function TheRouter(props: { children: ReactNode }) { const normalRouter = conf().NORMAL_ROUTER; if (normalRouter) return {props.children}; return {props.children}; } function ThemeProvider(props: { children: ReactNode }) { const theme = useThemeStore((s) => s.theme); const themeSelector = theme ? `theme-${theme}` : undefined; return
{props.children}
; } ReactDOM.render( }> , document.getElementById("root") );