"use client"; require("../polyfill"); import { useState, useEffect } from "react"; import { IconButton } from "./button"; import styles from "./home.module.scss"; import SettingsIcon from "../icons/settings.svg"; import GithubIcon from "../icons/github.svg"; import ChatGptIcon from "../icons/chatgpt.svg"; import BotIcon from "../icons/bot.svg"; import AddIcon from "../icons/add.svg"; import LoadingIcon from "../icons/three-dots.svg"; import CloseIcon from "../icons/close.svg"; import { useChatStore } from "../store"; import { isMobileScreen } from "../utils"; import Locale from "../locales"; import { Chat } from "./chat"; import dynamic from "next/dynamic"; import { REPO_URL } from "../constant"; import { ErrorBoundary } from "./error"; export function Loading(props: { noLogo?: boolean }) { return (
{!props.noLogo && }
); } const Settings = dynamic(async () => (await import("./settings")).Settings, { loading: () => , }); const ChatList = dynamic(async () => (await import("./chat-list")).ChatList, { loading: () => , }); function useSwitchTheme() { const config = useChatStore((state) => state.config); 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 = getComputedStyle(document.body) .getPropertyValue("--theme-color") .trim(); metaDescriptionDark?.setAttribute("content", themeColor); metaDescriptionLight?.setAttribute("content", themeColor); } }, [config.theme]); } const useHasHydrated = () => { const [hasHydrated, setHasHydrated] = useState(false); useEffect(() => { setHasHydrated(true); }, []); return hasHydrated; }; function _Home() { const [createNewSession, currentIndex, removeSession] = useChatStore( (state) => [ state.newSession, state.currentSessionIndex, state.removeSession, ], ); const loading = !useHasHydrated(); const [showSideBar, setShowSideBar] = useState(true); // setting const [openSettings, setOpenSettings] = useState(false); const config = useChatStore((state) => state.config); useSwitchTheme(); if (loading) { return ; } return (
ChatGPT Next
Build your own AI assistant.
{ setOpenSettings(false); setShowSideBar(false); }} >
} onClick={() => { if (confirm(Locale.Home.DeleteChat)) { removeSession(currentIndex); } }} />
} onClick={() => { setOpenSettings(true); setShowSideBar(false); }} shadow />
} text={Locale.Home.NewChat} onClick={() => { createNewSession(); setShowSideBar(false); }} shadow />
{openSettings ? ( { setOpenSettings(false); setShowSideBar(true); }} /> ) : ( setShowSideBar(true)} sideBarShowing={showSideBar} /> )}
); } export function Home() { return ( <_Home> ); }