From 2f2a21e48f82b735d7d1436ecebf58b856297ee2 Mon Sep 17 00:00:00 2001 From: caojp Date: Thu, 11 Jun 2026 01:24:11 +0800 Subject: [PATCH 1/5] =?UTF-8?q?=E8=B0=83=E6=95=B4=E7=95=8C=E9=9D=A2?= =?UTF-8?q?=E5=B1=95=E7=A4=BA=E6=95=88=E6=9E=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docker-compose.yml | 7 +- web/classic/index.html | 2 +- web/classic/public/favicon.ico | Bin 15406 -> 370070 bytes web/classic/public/logo.png | Bin 9597 -> 3703 bytes web/classic/src/components/layout/Footer.jsx | 39 +--- .../src/components/layout/PageLayout.jsx | 30 --- .../layout/headerbar/ActionButtons.jsx | 14 -- .../src/components/layout/headerbar/index.jsx | 4 - .../components/settings/PersonalSetting.jsx | 3 - web/classic/src/context/Theme/index.jsx | 83 ++----- web/classic/src/context/User/index.jsx | 23 +- web/classic/src/i18n/i18n.js | 44 ++-- web/default/index.html | 4 +- web/default/public/favicon.ico | Bin 15406 -> 370070 bytes web/default/public/logo.png | Bin 9597 -> 3703 bytes web/default/src/components/config-drawer.tsx | 36 ---- .../layout/components/app-header.tsx | 14 +- .../components/layout/components/footer.tsx | 203 +----------------- .../layout/components/public-header.tsx | 56 ++--- .../layout/components/public-layout.tsx | 2 - web/default/src/context/theme-provider.tsx | 84 ++------ .../features/auth/hooks/use-auth-redirect.ts | 25 --- .../features/home/components/sections/cta.tsx | 12 -- .../home/components/sections/hero.tsx | 7 - web/default/src/features/profile/index.tsx | 5 - .../src/features/setup/setup-wizard.tsx | 4 - web/default/src/i18n/config.ts | 31 ++- .../routes/_authenticated/errors/$error.tsx | 4 - 28 files changed, 103 insertions(+), 633 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index 48c071f98fe..a3c8e5d19d9 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -16,7 +16,10 @@ version: '3.4' # For compatibility with older Docker versions services: new-api: - image: calciumion/new-api:latest + build: + context: . + dockerfile: Dockerfile + image: new-api:local container_name: new-api restart: always command: --log-dir /app/logs @@ -33,6 +36,8 @@ services: - ERROR_LOG_ENABLED=true # 是否启用错误日志记录 (Whether to enable error log recording) - BATCH_UPDATE_ENABLED=true # 是否启用批量更新 (Whether to enable batch update) - NODE_NAME=new-api-node-1 # 节点名称,用于审计日志中标识节点身份;多节点/容器部署时建议设置 (Node name used in audit logs; recommended when running multiple instances or in containers) + - GLOBAL_WEB_RATE_LIMIT=1000 # Web 静态资源请求限流,前端分片较多时避免首页被 429 拦截 (Web/static request rate limit) + - GLOBAL_WEB_RATE_LIMIT_DURATION=60 # Web 限流窗口秒数 (Web rate limit window in seconds) # - STREAMING_TIMEOUT=300 # 流模式无响应超时时间,单位秒,默认120秒,如果出现空补全可以尝试改为更大值 (Streaming timeout in seconds, default is 120s. Increase if experiencing empty completions) # - RELAY_IDLE_CONN_TIMEOUT=90 # Relay HTTP 客户端空闲连接超时时间,单位秒,默认跟随 Go 标准库,设置为0表示不限制 (Relay HTTP client idle keep-alive timeout in seconds, defaults to Go standard library; set 0 to disable) # - SESSION_SECRET=random_string # 多机部署时设置,必须修改这个随机字符串!! (multi-node deployment, set this to a random string!!!!!!!) diff --git a/web/classic/index.html b/web/classic/index.html index 814b8e6aff3..8219fae71b5 100644 --- a/web/classic/index.html +++ b/web/classic/index.html @@ -16,7 +16,7 @@ content="A unified AI model hub for aggregation & distribution. It supports cross-converting various LLMs into OpenAI-compatible, Claude-compatible, or Gemini-compatible formats. A centralized gateway for personal and enterprise model management." /> - New API + TokenBear diff --git a/web/classic/public/favicon.ico b/web/classic/public/favicon.ico index ab5f17bcdb35e96cf7673ca8fa7ba8d6a33bd7ce..32c4a8b2047df31f85536070f7e2691bd497158c 100644 GIT binary patch literal 370070 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 literal 15406 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 diff --git a/web/classic/public/logo.png b/web/classic/public/logo.png index 851556f62db58d4267e096a39d2e9de88e6688c5..1fe4be477749c6f8f30b748424cd277214d753b9 100644 GIT binary patch literal 3703 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 aG3a-DviBvqQ0G6M3ZNjPDqSUM7WzNIJEblF diff --git a/web/classic/src/components/layout/Footer.jsx b/web/classic/src/components/layout/Footer.jsx index f7442e2016b..3e28bff4ed6 100644 --- a/web/classic/src/components/layout/Footer.jsx +++ b/web/classic/src/components/layout/Footer.jsx @@ -188,26 +188,12 @@ const FooterBar = () => { )} -
+
© {currentYear} {systemName}. {t('版权所有')}
- -
- - {t('设计与开发由')}{' '} - - - New API - -
), @@ -222,25 +208,10 @@ const FooterBar = () => {
{footer ? ( ) : ( customFooter diff --git a/web/classic/src/components/layout/PageLayout.jsx b/web/classic/src/components/layout/PageLayout.jsx index 962a22e43ad..11040580ff0 100644 --- a/web/classic/src/components/layout/PageLayout.jsx +++ b/web/classic/src/components/layout/PageLayout.jsx @@ -27,7 +27,6 @@ import ErrorBoundary from '../common/ErrorBoundary'; import React, { useContext, useEffect, useState } from 'react'; import { useIsMobile } from '../../hooks/common/useIsMobile'; import { useSidebarCollapsed } from '../../hooks/common/useSidebarCollapsed'; -import { useTranslation } from 'react-i18next'; import { API, getLogo, @@ -38,7 +37,6 @@ import { import { UserContext } from '../../context/User'; import { StatusContext } from '../../context/Status'; import { useLocation } from 'react-router-dom'; -import { normalizeLanguage } from '../../i18n/language'; const { Sider, Content, Header } = Layout; const PageLayout = () => { @@ -47,7 +45,6 @@ const PageLayout = () => { const isMobile = useIsMobile(); const [collapsed, , setCollapsed] = useSidebarCollapsed(); const [drawerOpen, setDrawerOpen] = useState(false); - const { i18n } = useTranslation(); const location = useLocation(); const cardProPages = [ @@ -118,33 +115,6 @@ const PageLayout = () => { } }, []); - useEffect(() => { - let preferredLang; - - if (userState?.user?.setting) { - try { - const settings = JSON.parse(userState.user.setting); - preferredLang = normalizeLanguage(settings.language); - } catch (e) { - // Ignore parse errors - } - } - - if (!preferredLang) { - const savedLang = localStorage.getItem('i18nextLng'); - if (savedLang) { - preferredLang = normalizeLanguage(savedLang); - } - } - - if (preferredLang) { - localStorage.setItem('i18nextLng', preferredLang); - if (preferredLang !== i18n.language) { - i18n.changeLanguage(preferredLang); - } - } - }, [i18n, userState?.user?.setting]); - return ( - - - - { isNewYear={isNewYear} unreadCount={unreadCount} onNoticeOpen={handleNoticeOpen} - theme={theme} - onThemeToggle={handleThemeToggle} - currentLang={currentLang} - onLanguageChange={handleLanguageChange} userState={userState} isLoading={isLoading} isMobile={isMobile} diff --git a/web/classic/src/components/settings/PersonalSetting.jsx b/web/classic/src/components/settings/PersonalSetting.jsx index e735c877c49..a679dc5039a 100644 --- a/web/classic/src/components/settings/PersonalSetting.jsx +++ b/web/classic/src/components/settings/PersonalSetting.jsx @@ -39,7 +39,6 @@ import { useTranslation } from 'react-i18next'; import UserInfoHeader from './personal/components/UserInfoHeader'; import AccountManagement from './personal/cards/AccountManagement'; import NotificationSettings from './personal/cards/NotificationSettings'; -import PreferencesSettings from './personal/cards/PreferencesSettings'; import CheckinCalendar from './personal/cards/CheckinCalendar'; import EmailBindModal from './personal/modals/EmailBindModal'; import WeChatBindModal from './personal/modals/WeChatBindModal'; @@ -583,8 +582,6 @@ const PersonalSetting = () => { onPasskeyDelete={handleRemovePasskey} /> - {/* 偏好设置(语言等) */} -
{/* 右侧:其他设置 */} diff --git a/web/classic/src/context/Theme/index.jsx b/web/classic/src/context/Theme/index.jsx index bdd5a651db7..e179478c096 100644 --- a/web/classic/src/context/Theme/index.jsx +++ b/web/classic/src/context/Theme/index.jsx @@ -21,93 +21,34 @@ import { createContext, useCallback, useContext, - useState, useEffect, } from 'react'; -const ThemeContext = createContext(null); +const FORCED_THEME = 'light'; + +const ThemeContext = createContext(FORCED_THEME); export const useTheme = () => useContext(ThemeContext); -const ActualThemeContext = createContext(null); +const ActualThemeContext = createContext(FORCED_THEME); export const useActualTheme = () => useContext(ActualThemeContext); -const SetThemeContext = createContext(null); +const SetThemeContext = createContext(() => {}); export const useSetTheme = () => useContext(SetThemeContext); -// 检测系统主题偏好 -const getSystemTheme = () => { - if (typeof window !== 'undefined' && window.matchMedia) { - return window.matchMedia('(prefers-color-scheme: dark)').matches - ? 'dark' - : 'light'; - } - return 'light'; -}; - export const ThemeProvider = ({ children }) => { - const [theme, _setTheme] = useState(() => { - try { - return localStorage.getItem('theme-mode') || 'auto'; - } catch { - return 'auto'; - } - }); - - const [systemTheme, setSystemTheme] = useState(getSystemTheme()); - - // 计算实际应用的主题 - const actualTheme = theme === 'auto' ? systemTheme : theme; - - // 监听系统主题变化 useEffect(() => { - if (typeof window !== 'undefined' && window.matchMedia) { - const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)'); - - const handleSystemThemeChange = (e) => { - setSystemTheme(e.matches ? 'dark' : 'light'); - }; - - mediaQuery.addEventListener('change', handleSystemThemeChange); - - return () => { - mediaQuery.removeEventListener('change', handleSystemThemeChange); - }; - } + document.body.removeAttribute('theme-mode'); + document.documentElement.classList.remove('dark'); }, []); - // 应用主题到DOM - useEffect(() => { - const body = document.body; - if (actualTheme === 'dark') { - body.setAttribute('theme-mode', 'dark'); - document.documentElement.classList.add('dark'); - } else { - body.removeAttribute('theme-mode'); - document.documentElement.classList.remove('dark'); - } - }, [actualTheme]); - - const setTheme = useCallback((newTheme) => { - let themeValue; - - if (typeof newTheme === 'boolean') { - // 向后兼容原有的 boolean 参数 - themeValue = newTheme ? 'dark' : 'light'; - } else if (typeof newTheme === 'string') { - // 新的字符串参数支持 'light', 'dark', 'auto' - themeValue = newTheme; - } else { - themeValue = 'auto'; - } - - _setTheme(themeValue); - localStorage.setItem('theme-mode', themeValue); - }, []); + const setTheme = useCallback(() => {}, []); return ( - - {children} + + + {children} + ); diff --git a/web/classic/src/context/User/index.jsx b/web/classic/src/context/User/index.jsx index 42bad9432ee..a57aab1ba74 100644 --- a/web/classic/src/context/User/index.jsx +++ b/web/classic/src/context/User/index.jsx @@ -17,10 +17,8 @@ along with this program. If not, see . For commercial licensing, please contact support@quantumnous.com */ -import React, { useEffect } from 'react'; -import { useTranslation } from 'react-i18next'; +import React from 'react'; import { reducer, initialState } from './reducer'; -import { normalizeLanguage } from '../../i18n/language'; export const UserContext = React.createContext({ state: initialState, @@ -29,25 +27,6 @@ export const UserContext = React.createContext({ export const UserProvider = ({ children }) => { const [state, dispatch] = React.useReducer(reducer, initialState); - const { i18n } = useTranslation(); - - // Sync language preference when user data is loaded - useEffect(() => { - if (state.user?.setting) { - try { - const settings = JSON.parse(state.user.setting); - const normalizedLanguage = normalizeLanguage(settings.language); - if (normalizedLanguage && normalizedLanguage !== i18n.language) { - i18n.changeLanguage(normalizedLanguage); - } - if (normalizedLanguage) { - localStorage.setItem('i18nextLng', normalizedLanguage); - } - } catch (e) { - // Ignore parse errors - } - } - }, [state.user?.setting, i18n]); return ( diff --git a/web/classic/src/i18n/i18n.js b/web/classic/src/i18n/i18n.js index 357ae592fbb..671c059474f 100644 --- a/web/classic/src/i18n/i18n.js +++ b/web/classic/src/i18n/i18n.js @@ -19,7 +19,6 @@ For commercial licensing, please contact support@quantumnous.com import i18n from 'i18next'; import { initReactI18next } from 'react-i18next'; -import LanguageDetector from 'i18next-browser-languagedetector'; import enTranslation from './locales/en.json'; import frTranslation from './locales/fr.json'; @@ -28,29 +27,26 @@ import zhTWTranslation from './locales/zh-TW.json'; import ruTranslation from './locales/ru.json'; import jaTranslation from './locales/ja.json'; import viTranslation from './locales/vi.json'; -import { supportedLanguages } from './language'; - -i18n - .use(LanguageDetector) - .use(initReactI18next) - .init({ - load: 'currentOnly', - supportedLngs: supportedLanguages, - resources: { - en: enTranslation, - 'zh-CN': zhCNTranslation, - 'zh-TW': zhTWTranslation, - fr: frTranslation, - ru: ruTranslation, - ja: jaTranslation, - vi: viTranslation, - }, - fallbackLng: 'zh-CN', - nsSeparator: false, - interpolation: { - escapeValue: false, - }, - }); + +i18n.use(initReactI18next).init({ + load: 'currentOnly', + lng: 'zh-CN', + fallbackLng: 'zh-CN', + supportedLngs: ['zh-CN'], + resources: { + en: enTranslation, + 'zh-CN': zhCNTranslation, + 'zh-TW': zhTWTranslation, + fr: frTranslation, + ru: ruTranslation, + ja: jaTranslation, + vi: viTranslation, + }, + nsSeparator: false, + interpolation: { + escapeValue: false, + }, +}); window.__i18n = i18n; diff --git a/web/default/index.html b/web/default/index.html index d3468f19179..f6eaa2c5ee5 100644 --- a/web/default/index.html +++ b/web/default/index.html @@ -6,8 +6,8 @@ - New API - + TokenBear + gxH;F_; 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 literal 15406 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 diff --git a/web/default/public/logo.png b/web/default/public/logo.png index 851556f62db58d4267e096a39d2e9de88e6688c5..1fe4be477749c6f8f30b748424cd277214d753b9 100644 GIT binary patch literal 3703 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 aG3a-DviBvqQ0G6M3ZNjPDqSUM7WzNIJEblF diff --git a/web/default/src/components/config-drawer.tsx b/web/default/src/components/config-drawer.tsx index 102736787db..d1e578fa150 100644 --- a/web/default/src/components/config-drawer.tsx +++ b/web/default/src/components/config-drawer.tsx @@ -28,9 +28,6 @@ import { IconLayoutFull } from '@/assets/custom/icon-layout-full' import { IconSidebarFloating } from '@/assets/custom/icon-sidebar-floating' import { IconSidebarInset } from '@/assets/custom/icon-sidebar-inset' import { IconSidebarSidebar } from '@/assets/custom/icon-sidebar-sidebar' -import { IconThemeDark } from '@/assets/custom/icon-theme-dark' -import { IconThemeLight } from '@/assets/custom/icon-theme-light' -import { IconThemeSystem } from '@/assets/custom/icon-theme-system' import { type ContentLayout, THEME_PRESETS, @@ -103,7 +100,6 @@ export function ConfigDrawer() {
- @@ -209,38 +205,6 @@ function RadioGroupItem(props: { ) } -function ThemeConfig() { - const { t } = useTranslation() - const { defaultTheme, theme, setTheme } = useTheme() - return ( -
- setTheme(defaultTheme)} - /> - - {[ - { value: 'system', label: t('System'), icon: IconThemeSystem }, - { value: 'light', label: t('Light'), icon: IconThemeLight }, - { value: 'dark', label: t('Dark'), icon: IconThemeDark }, - ].map((item) => ( - - ))} - -
- {t('Choose between system preference, light mode, or dark mode')} -
-
- ) -} - function PresetConfig() { const { t } = useTranslation() const { defaults, customization, setPreset } = useThemeCustomization() diff --git a/web/default/src/components/layout/components/app-header.tsx b/web/default/src/components/layout/components/app-header.tsx index 43a3b5b7e34..a043cb33960 100644 --- a/web/default/src/components/layout/components/app-header.tsx +++ b/web/default/src/components/layout/components/app-header.tsx @@ -18,8 +18,6 @@ For commercial licensing, please contact support@quantumnous.com */ import { useNotifications } from '@/hooks/use-notifications' import { useTopNavLinks } from '@/hooks/use-top-nav-links' -import { ConfigDrawer } from '@/components/config-drawer' -import { LanguageSwitcher } from '@/components/language-switcher' import { NotificationPopover } from '@/components/notification-popover' import { ProfileDropdown } from '@/components/profile-dropdown' import { Search } from '@/components/search' @@ -59,7 +57,7 @@ type AppHeaderProps = { navLinks?: TopNavLink[] /** * Whether to show top navigation bar - * @default true + * @default false */ showTopNav?: boolean /** @@ -80,11 +78,6 @@ type AppHeaderProps = { * @default true */ showNotifications?: boolean - /** - * Whether to show config drawer - * @default true - */ - showConfigDrawer?: boolean /** * Whether to show profile dropdown * @default true @@ -98,8 +91,7 @@ export function AppHeader({ leftContent, showSearch = true, rightContent, - showNotifications = true, - showConfigDrawer = true, + showNotifications = false, showProfileDropdown = true, }: AppHeaderProps) { // Prioritize dynamically generated links from backend @@ -138,8 +130,6 @@ export function AppHeader({ loading={notifications.loading} /> )} - - {showConfigDrawer && } {showProfileDropdown && }
)} diff --git a/web/default/src/components/layout/components/footer.tsx b/web/default/src/components/layout/components/footer.tsx index be4e612fd42..79fd978adeb 100644 --- a/web/default/src/components/layout/components/footer.tsx +++ b/web/default/src/components/layout/components/footer.tsx @@ -16,65 +16,19 @@ along with this program. If not, see . For commercial licensing, please contact support@quantumnous.com */ -import { Fragment, useMemo } from 'react' +import { Fragment } from 'react' import { Link } from '@tanstack/react-router' import { useTranslation } from 'react-i18next' import { cn } from '@/lib/utils' import { useStatus } from '@/hooks/use-status' import { useSystemConfig } from '@/hooks/use-system-config' -interface FooterLink { - text: string - href: string -} - -interface FooterColumnProps { - title: string - links: FooterLink[] -} - interface FooterProps { - logo?: string name?: string - columns?: FooterColumnProps[] copyright?: string className?: string } -const NEW_API_FOOTER_ATTRIBUTION_KEY = [ - 'footer', - 'new' + 'api', - 'projectAttributionSuffix', -].join('.') - -function FooterLinkItem(props: { link: FooterLink }) { - const { t } = useTranslation() - const isExternal = props.link.href.startsWith('http') - const label = t(props.link.text) - - if (isExternal) { - return ( - - {label} - - ) - } - - return ( - - {label} - - ) -} - // Renders User Agreement / Privacy Policy links inline with the parent's // copyright row when either is configured in System Settings → Site. Emits // fragmented siblings so the parent flex container's gap controls spacing. @@ -120,107 +74,13 @@ function LegalLinks(props: { leadingSeparator?: boolean }) { ) } -// inline=true returns just the inner span for composition in a parent flex -// row. inline=false wraps in a centered/right-aligned div (default). -function ProjectAttribution(props: { currentYear: number; inline?: boolean }) { - const { t } = useTranslation() - const content = ( - - © {props.currentYear}{' '} - - {t('New API')} - - . {t(NEW_API_FOOTER_ATTRIBUTION_KEY)} - - ) - if (props.inline) { - return content - } - return ( -
- {content} -
- ) -} - export function Footer(props: FooterProps) { const { t } = useTranslation() - const { - systemName, - logo: systemLogo, - footerHtml, - demoSiteEnabled, - } = useSystemConfig() + const { systemName, footerHtml } = useSystemConfig() - const displayLogo = systemLogo || props.logo || '/logo.png' const displayName = systemName || props.name || 'New API' - const isDemoSiteMode = Boolean(demoSiteEnabled) const currentYear = new Date().getFullYear() - const fallbackColumns = useMemo( - () => [ - { - title: t('footer.columns.about.title'), - links: [ - { - text: t('footer.columns.about.links.aboutProject'), - href: 'https://docs.newapi.pro/wiki/project-introduction/', - }, - { - text: t('footer.columns.about.links.contact'), - href: 'https://docs.newapi.pro/support/community-interaction/', - }, - { - text: t('footer.columns.about.links.features'), - href: 'https://docs.newapi.pro/wiki/features-introduction/', - }, - ], - }, - { - title: t('footer.columns.docs.title'), - links: [ - { - text: t('footer.columns.docs.links.quickStart'), - href: 'https://docs.newapi.pro/getting-started/', - }, - { - text: t('footer.columns.docs.links.installation'), - href: 'https://docs.newapi.pro/installation/', - }, - { - text: t('footer.columns.docs.links.apiDocs'), - href: 'https://docs.newapi.pro/api/', - }, - ], - }, - { - title: t('footer.columns.related.title'), - links: [ - { - text: t('footer.columns.related.links.oneApi'), - href: 'https://github.com/songquanpeng/one-api', - }, - { - text: t('footer.columns.related.links.midjourney'), - href: 'https://github.com/novicezk/midjourney-proxy', - }, - { - text: t('footer.columns.related.links.newApiKeyTool'), - href: 'https://github.com/Calcium-Ion/new-api-key-tool', - }, - ], - }, - ], - [t] - ) - - const displayColumns = props.columns ?? fallbackColumns - if (footerHtml) { return (
-
@@ -249,57 +108,13 @@ export function Footer(props: FooterProps) {
-
-
- {/* Brand column */} -
- - {displayName} - - {displayName} - - -

- {t('Powerful API Management Platform')} -

-
- - {/* Links columns */} - {isDemoSiteMode && ( -
- {displayColumns.map((column, index) => ( -
-

- {t(column.title)} -

-
    - {column.links.map((link, linkIndex) => ( -
  • - -
  • - ))} -
-
- ))} -
- )} -
- - {/* Copyright + optional legal links inline on the left, project - attribution on the right; wraps on narrow screens. */} -
-
- - © {currentYear} {displayName}.{' '} - {props.copyright ?? t('footer.defaultCopyright')} - - -
- +
+
+ + © {currentYear} {displayName}.{' '} + {props.copyright ?? t('footer.defaultCopyright')} + +
diff --git a/web/default/src/components/layout/components/public-header.tsx b/web/default/src/components/layout/components/public-header.tsx index 7030a7c5404..3af7c9c0de1 100644 --- a/web/default/src/components/layout/components/public-header.tsx +++ b/web/default/src/components/layout/components/public-header.tsx @@ -27,10 +27,8 @@ import { useTopNavLinks } from '@/hooks/use-top-nav-links' import { Button } from '@/components/ui/button' import { Skeleton } from '@/components/ui/skeleton' import { Dialog } from '@/components/dialog' -import { LanguageSwitcher } from '@/components/language-switcher' import { NotificationPopover } from '@/components/notification-popover' import { ProfileDropdown } from '@/components/profile-dropdown' -import { ThemeSwitch } from '@/components/theme-switch' import { defaultTopNavLinks } from '../config/top-nav.config' import type { TopNavLink } from '../types' import { HeaderLogo } from './header-logo' @@ -46,8 +44,6 @@ export interface PublicHeaderProps { navLinks?: TopNavLink[] mobileLinks?: TopNavLink[] navContent?: React.ReactNode - showThemeSwitch?: boolean - showLanguageSwitcher?: boolean logo?: React.ReactNode siteName?: string homeUrl?: string @@ -62,18 +58,15 @@ export interface PublicHeaderProps { export function PublicHeader(props: PublicHeaderProps) { const { navLinks = defaultTopNavLinks, - showThemeSwitch = true, - showLanguageSwitcher = true, logo: customLogo, siteName: customSiteName, homeUrl = '/', showAuthButtons = true, - showNotifications = true, + showNotifications = false, } = props const { t } = useTranslation() const navigate = useNavigate() - const [scrolled, setScrolled] = useState(false) const [mobileOpen, setMobileOpen] = useState(false) const [authPromptTarget, setAuthPromptTarget] = useState(null) @@ -96,13 +89,6 @@ export function PublicHeader(props: PublicHeaderProps) { const displaySiteName = customSiteName || systemName const links = dynamicLinks.length > 0 ? dynamicLinks : navLinks - useEffect(() => { - const onScroll = () => setScrolled(window.scrollY > 20) - onScroll() - window.addEventListener('scroll', onScroll, { passive: true }) - return () => window.removeEventListener('scroll', onScroll) - }, []) - useEffect(() => { document.body.style.overflow = mobileOpen ? 'hidden' : '' return () => { @@ -173,19 +159,17 @@ export function PublicHeader(props: PublicHeaderProps) { return ( <> -
+