feat: 新增暗黑/明亮模式一键切换功能

This commit is contained in:
gujiangjiang committed 2025-10-10 03:58:37 +08:00
1 parent d4462671ae
commit 2c898069a6
4 files changed
+57 -2

No files matched your search

+2 -1
View File
@@ -90,7 +90,8 @@
"messages": "messages"
},
"settings": {
"language": "Language"
"language": "Language",
"toggleTheme": "Toggle Theme"
},
"errors": {
"generic": "An error occurred, please try again later",
+2 -1
View File
@@ -90,7 +90,8 @@
"messages": "封邮件"
},
"settings": {
"language": "语言"
"language": "语言",
"toggleTheme": "切换主题"
},
"errors": {
"generic": "发生错误,请稍后重试",
+3
View File
@@ -5,6 +5,7 @@ import LanguageSwitcher from './LanguageSwitcher';
import HeaderMailbox from './HeaderMailbox';
import Container from './Container';
import { getEmailDomains, getDefaultEmailDomain, EMAIL_DOMAINS, DEFAULT_EMAIL_DOMAIN } from '../config';
import ThemeSwitcher from './ThemeSwitcher'; // 导入新增的主题切换组件
interface HeaderProps {
mailbox: Mailbox | null;
@@ -56,6 +57,8 @@ const Header: React.FC<HeaderProps> = ({
isLoading={isLoading}
/>
<div className="ml-3 pl-3 border-l border-muted-foreground/20 flex items-center">
{/* 在这里添加主题切换组件 */}
<ThemeSwitcher />
<LanguageSwitcher />
<a
href="https://github.com/zaunist/zmail"
+50
View File
@@ -0,0 +1,50 @@
import React, { useState, useEffect } from 'react';
import { useTranslation } from 'react-i18next';
/**
* 主题切换组件
* 用于在明亮和暗黑模式之间切换
*/
const ThemeSwitcher: React.FC = () => {
const { t } = useTranslation();
// 从 localStorage 获取初始主题,如果不存在则默认为 'light'
const [theme, setTheme] = useState(() => {
const savedTheme = localStorage.getItem('theme');
return savedTheme || 'light';
});
// 使用 useEffect 监听 theme 状态的变化,并应用到 <html> 元素上
useEffect(() => {
const root = window.document.documentElement;
// 先移除旧的 class,以防万一
root.classList.remove(theme === 'light' ? 'dark' : 'light');
// 添加当前主题的 class
root.classList.add(theme);
// 将当前主题保存到 localStorage
localStorage.setItem('theme', theme);
}, [theme]);
// 定义切换主题的函数
const toggleTheme = () => {
setTheme(prevTheme => (prevTheme === 'light' ? 'dark' : 'light'));
};
return (
<button
onClick={toggleTheme}
className="w-8 h-8 flex items-center justify-center rounded-md transition-all duration-200 hover:bg-primary/20 hover:text-primary hover:scale-110"
aria-label={t('settings.toggleTheme', '切换主题')}
title={t('settings.toggleTheme', '切换主题')}
>
{/* 根据当前主题显示不同的图标 */}
{theme === 'light' ? (
<i className="fas fa-moon text-base"></i> // 亮色模式下,显示月亮图标以切换到暗色
) : (
<i className="fas fa-sun text-base"></i> // 暗色模式下,显示太阳图标以切换到亮色
)}
</button>
);
};
export default ThemeSwitcher;