"use client"; require("../polyfill"); import React, { useState, useEffect } from "react"; import { HashRouter as Router, Routes, Route, useLocation } from "react-router-dom"; import styles from "./home.module.scss"; import loadingIcon from "../icons/loading.gif"; import { getCSSVar, useMobileScreen } from "../utils"; import dynamic from "next/dynamic"; import { Path, SlotID } from "../constant"; import { ErrorBoundary } from "./error"; import { getISOLang } from "../locales"; import { SideBar } from "./sidebar"; import { useAppConfig } from "../store/config"; import { getClientConfig } from "../config/client"; import { type ClientApi, getClientApi } from "../client/api"; import { useAccessStore } from "../store"; import api from "../api/api"; export function Loading() { return (
); } // 延时器 export const delayer = (): Promise => { // 延时时间-秒 const time: number = 0.1; return new Promise((resolve, reject) => { setTimeout(() => { resolve({}); }, time * 1000); }); } const Artifacts = dynamic( async () => { await delayer(); return (await import("./artifacts")).Artifacts }, { loading: () => , } ); const Settings = dynamic( async () => { await delayer(); return (await import("./settings")).Settings }, { loading: () => , } ); const Chat = dynamic( async () => { await delayer(); return (await import("./chat")).Chat }, { loading: () => , } ); const DeepSeekChat = dynamic( async () => { await delayer(); return (await import("./DeepSeekChat")).Chat }, { loading: () => , } ); const Record = dynamic( async () => { await delayer(); return (await import("./Record")) }, { loading: () => , } ); const HomeApp = dynamic( async () => { return (await import("./DeekSeekHome")) }, { loading: () => , } ); const MaskChat = dynamic( async () => { await delayer(); return (await import("./mask-chat")).MaskChat }, { loading: () => , } ); const MaskPage = dynamic( async () => { await delayer(); return (await import("./mask")).MaskPage }, { loading: () => , } ); 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*="dark"]', ); const metaDescriptionLight = document.querySelector( 'meta[name="theme-color"][media*="light"]', ); if (config.theme === "auto") { metaDescriptionDark?.setAttribute("content", "#151515"); metaDescriptionLight?.setAttribute("content", "#fafafa"); } else { const themeColor = getCSSVar("--theme-color"); metaDescriptionDark?.setAttribute("content", themeColor); metaDescriptionLight?.setAttribute("content", themeColor); } }, [config.theme]); } function useHtmlLang() { useEffect(() => { const lang = getISOLang(); const htmlLang = document.documentElement.lang; if (lang !== htmlLang) { document.documentElement.lang = lang; } }, []); } const useHasHydrated = () => { const [hasHydrated, setHasHydrated] = useState(false); useEffect(() => { setHasHydrated(true); }, []); return hasHydrated; }; const loadAsyncGoogleFont = () => { const linkEl = document.createElement("link"); const proxyFontUrl = "/google-fonts"; const remoteFontUrl = "https://fonts.googleapis.com"; const googleFontUrl = getClientConfig()?.buildMode === "export" ? remoteFontUrl : proxyFontUrl; linkEl.rel = "stylesheet"; linkEl.href = googleFontUrl + "/css2?family=" + encodeURIComponent("Noto Sans:wght@300;400;700;900") + "&display=swap"; document.head.appendChild(linkEl); }; export function WindowContent(props: { children: React.ReactNode }) { return (
{props?.children}
); } function Screen() { const config = useAppConfig(); const location = useLocation(); const isArtifact = location.pathname.includes(Path.Artifacts); const isMobileScreen = useMobileScreen(); const shouldTightBorder = getClientConfig()?.isApp || (config.tightBorder && !isMobileScreen); useEffect(() => { loadAsyncGoogleFont(); }, []); if (isArtifact) { return ( } /> ); } const renderContent = () => { return ( <> } /> {/* } /> */} } /> } /> } /> } /> {/* 关闭以下入口 后续有需求再开启*/} {/* } /> */} {/* } /> */} {/* } /> */} ); }; return (
{renderContent()}
); } export function useLoadData() { const config = useAppConfig(); const api: ClientApi = getClientApi(config.modelConfig.providerName); useEffect(() => { (async () => { const models = await api.llm.models(); config.mergeModels(models); })(); }, []); } export function Home() { useSwitchTheme(); useLoadData(); useHtmlLang(); useEffect(() => { useAccessStore.getState().fetch(); }, []); if (typeof window !== "undefined") { window.addEventListener("pageshow", (event) => { const perfEntries = performance.getEntriesByType("navigation"); if (perfEntries.length > 0) { const navEntry = perfEntries[0] as PerformanceNavigationTiming; if (navEntry.type === "back_forward") { window.location.reload(); } } }); } if (!useHasHydrated()) { return ; } return ( ); }