import { ChatContext } from '@/app/chat-context'; import { DarkSvg, SunnySvg } from '@/components/icons'; import UserBar from '@/new-components/layout/UserBar'; import { STORAGE_LANG_KEY, STORAGE_THEME_KEY } from '@/utils/constants/index'; import Icon, { GlobalOutlined, MenuFoldOutlined, MenuUnfoldOutlined } from '@ant-design/icons'; import { Layout, Popover } from 'antd'; import moment from 'moment'; import Image from 'next/image'; import Link from 'next/link'; import React, { ReactNode, useCallback, useContext, useMemo, useState } from 'react'; import { useTranslation } from 'react-i18next'; interface SettingItem { key: string; name: string; icon: ReactNode; onClick?: () => void; placement?: 'top' | 'topLeft'; } const Sider: React.FC = () => { const { mode, setMode } = useContext(ChatContext); const { t, i18n } = useTranslation(); const [collapsed, setCollapsed] = useState(false); // 切换主题 const handleToggleTheme = useCallback(() => { const theme = mode === 'light' ? 'dark' : 'light'; setMode(theme); localStorage.setItem(STORAGE_THEME_KEY, theme); }, [mode, setMode]); // 切换语言 const handleChangeLang = useCallback(() => { const language = i18n.language === 'en' ? 'zh' : 'en'; i18n.changeLanguage(language); if (language === 'zh') { moment.locale('zh-cn'); } if (language === 'en') { moment.locale('en'); } localStorage.setItem(STORAGE_LANG_KEY, language); }, [i18n]); // 展开或收起 const handleToggleMenu = useCallback(() => { setCollapsed(!collapsed); }, [collapsed]); const settings: SettingItem[] = useMemo(() => { return [ { key: 'theme', name: t('Theme'), icon: mode === 'dark' ? : , onClick: handleToggleTheme, }, { key: 'language', name: t('language'), icon: , onClick: handleChangeLang, }, { key: 'fold', name: t(collapsed ? 'Show_Sidebar' : 'Close_Sidebar'), icon: collapsed ? : , onClick: handleToggleMenu, }, ]; }, [collapsed, handleChangeLang, handleToggleMenu, handleToggleTheme, mode, t]); return ( {collapsed ? ( <> ) : ( <> DB-GPT
{settings.map(item => (
{item.icon}
))}
)}
); }; export default Sider;