| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
|
|
|
|
| import React, { useMemo } from 'react';
|
| import { Button, Dropdown } from '@douyinfe/semi-ui';
|
| import { Sun, Moon, Monitor } from 'lucide-react';
|
| import { useActualTheme } from '../../../context/Theme';
|
|
|
| const ThemeToggle = ({ theme, onThemeToggle, t }) => {
|
| const actualTheme = useActualTheme();
|
|
|
| const themeOptions = useMemo(
|
| () => [
|
| {
|
| key: 'light',
|
| icon: <Sun size={18} />,
|
| buttonIcon: <Sun size={18} />,
|
| label: t('浅色模式'),
|
| description: t('始终使用浅色主题'),
|
| },
|
| {
|
| key: 'dark',
|
| icon: <Moon size={18} />,
|
| buttonIcon: <Moon size={18} />,
|
| label: t('深色模式'),
|
| description: t('始终使用深色主题'),
|
| },
|
| {
|
| key: 'auto',
|
| icon: <Monitor size={18} />,
|
| buttonIcon: <Monitor size={18} />,
|
| label: t('自动模式'),
|
| description: t('跟随系统主题设置'),
|
| },
|
| ],
|
| [t],
|
| );
|
|
|
| const getItemClassName = (isSelected) =>
|
| isSelected
|
| ? '!bg-semi-color-primary-light-default !font-semibold'
|
| : 'hover:!bg-semi-color-fill-1';
|
|
|
| const currentButtonIcon = useMemo(() => {
|
| const currentOption = themeOptions.find((option) => option.key === theme);
|
| return currentOption?.buttonIcon || themeOptions[2].buttonIcon;
|
| }, [theme, themeOptions]);
|
|
|
| return (
|
| <Dropdown
|
| position='bottomRight'
|
| render={
|
| <Dropdown.Menu>
|
| {themeOptions.map((option) => (
|
| <Dropdown.Item
|
| key={option.key}
|
| icon={option.icon}
|
| onClick={() => onThemeToggle(option.key)}
|
| className={getItemClassName(theme === option.key)}
|
| >
|
| <div className='flex flex-col'>
|
| <span>{option.label}</span>
|
| <span className='text-xs text-semi-color-text-2'>
|
| {option.description}
|
| </span>
|
| </div>
|
| </Dropdown.Item>
|
| ))}
|
|
|
| {theme === 'auto' && (
|
| <>
|
| <Dropdown.Divider />
|
| <div className='px-3 py-2 text-xs text-semi-color-text-2'>
|
| {t('当前跟随系统')}:
|
| {actualTheme === 'dark' ? t('深色') : t('浅色')}
|
| </div>
|
| </>
|
| )}
|
| </Dropdown.Menu>
|
| }
|
| >
|
| <Button
|
| icon={currentButtonIcon}
|
| aria-label={t('切换主题')}
|
| theme='borderless'
|
| type='tertiary'
|
| className='!p-1.5 !text-current focus:!bg-semi-color-fill-1 !rounded-full !bg-semi-color-fill-0 hover:!bg-semi-color-fill-1'
|
| />
|
| </Dropdown>
|
| );
|
| };
|
|
|
| export default ThemeToggle;
|
|
|