| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140 | "use client";require("../polyfill");import { useState, useEffect } from "react";import styles from "./home.module.scss";import BotIcon from "../icons/bot.svg";import LoadingIcon from "../icons/three-dots.svg";import { getCSSVar, useMobileScreen } from "../utils";import dynamic from "next/dynamic";import { Path, SlotID } from "../constant";import { ErrorBoundary } from "./error";import {  HashRouter as Router,  Routes,  Route,  useLocation,} from "react-router-dom";import { SideBar } from "./sidebar";import { useAppConfig } from "../store/config";import { useMaskStore } from "../store/mask";export function Loading(props: { noLogo?: boolean }) {  return (    <div className={styles["loading-content"] + " no-dark"}>      {!props.noLogo && <BotIcon />}      <LoadingIcon />    </div>  );}const Settings = dynamic(async () => (await import("./settings")).Settings, {  loading: () => <Loading noLogo />,});const Chat = dynamic(async () => (await import("./chat")).Chat, {  loading: () => <Loading noLogo />,});const NewChat = dynamic(async () => (await import("./new-chat")).NewChat, {  loading: () => <Loading noLogo />,});const MaskPage = dynamic(async () => (await import("./mask")).MaskPage, {  loading: () => <Loading noLogo />,});export function useSwitchTheme() {  const config = useAppConfig();  useEffect(() => {    document.body.classList.remove("light");    document.body.classList.remove("dark");    if (config.theme === "dark") {      document.body.classList.add("dark");    } else if (config.theme === "light") {      document.body.classList.add("light");    }    const metaDescriptionDark = document.querySelector(      'meta[name="theme-color"][media]',    );    const metaDescriptionLight = document.querySelector(      'meta[name="theme-color"]:not([media])',    );    if (config.theme === "auto") {      metaDescriptionDark?.setAttribute("content", "#151515");      metaDescriptionLight?.setAttribute("content", "#fafafa");    } else {      const themeColor = getCSSVar("--themeColor");      metaDescriptionDark?.setAttribute("content", themeColor);      metaDescriptionLight?.setAttribute("content", themeColor);    }  }, [config.theme]);}const useHasHydrated = () => {  const [hasHydrated, setHasHydrated] = useState<boolean>(false);  useEffect(() => {    setHasHydrated(true);  }, []);  return hasHydrated;};function Screen() {  const config = useAppConfig();  const location = useLocation();  const isHome = location.pathname === Path.Home;  const isMobileScreen = useMobileScreen();  return (    <div      className={        styles.container +        ` ${          config.tightBorder && !isMobileScreen            ? styles["tight-container"]            : styles.container        }`      }    >      <SideBar className={isHome ? styles["sidebar-show"] : ""} />      <div className={styles["window-content"]} id={SlotID.AppBody}>        <Routes>          <Route path={Path.Home} element={<Chat />} />          <Route path={Path.NewChat} element={<NewChat />} />          <Route path={Path.Masks} element={<MaskPage />} />          <Route path={Path.Chat} element={<Chat />} />          <Route path={Path.Settings} element={<Settings />} />        </Routes>      </div>    </div>  );}export function Home() {  useSwitchTheme();  if (!useHasHydrated()) {    return <Loading />;  }  return (    <ErrorBoundary>      <Router>        <Screen />      </Router>    </ErrorBoundary>  );}
 |