|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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; |
|
|
|