feat: update sidebar menu with interactive tooltips and painting terminology

This commit is contained in:
kangfenmao 2024-11-09 22:26:35 +08:00
parent 8a8deda002
commit 61ceca2363
4 changed files with 82 additions and 64 deletions

View File

@ -5,6 +5,7 @@ import { useTheme } from '@renderer/context/ThemeProvider'
import useAvatar from '@renderer/hooks/useAvatar' import useAvatar from '@renderer/hooks/useAvatar'
import { useRuntime } from '@renderer/hooks/useRuntime' import { useRuntime } from '@renderer/hooks/useRuntime'
import { useSettings } from '@renderer/hooks/useSettings' import { useSettings } from '@renderer/hooks/useSettings'
import { Tooltip } from 'antd'
import { Avatar } from 'antd' import { Avatar } from 'antd'
import { FC } from 'react' import { FC } from 'react'
import { useTranslation } from 'react-i18next' import { useTranslation } from 'react-i18next'
@ -50,57 +51,74 @@ const Sidebar: FC = () => {
<AvatarImg src={avatar || UserAvatar} draggable={false} className="nodrag" onClick={onEditUser} /> <AvatarImg src={avatar || UserAvatar} draggable={false} className="nodrag" onClick={onEditUser} />
<MainMenus> <MainMenus>
<Menus onClick={MinApp.onClose}> <Menus onClick={MinApp.onClose}>
<StyledLink onClick={() => to('/')}> <Tooltip title={t('assistants.title')} mouseEnterDelay={0.5} placement="right">
<Icon className={isRoute('/')}> <StyledLink onClick={() => to('/')}>
<i className="iconfont icon-chat" /> <Icon className={isRoute('/')}>
</Icon> <i className="iconfont icon-chat" />
</StyledLink> </Icon>
<StyledLink onClick={() => to('/agents')}> </StyledLink>
<Icon className={isRoutes('/agents')}> </Tooltip>
<i className="iconfont icon-business-smart-assistant" /> <Tooltip title={t('agents.title')} mouseEnterDelay={0.5} placement="right">
</Icon> <StyledLink onClick={() => to('/agents')}>
</StyledLink> <Icon className={isRoutes('/agents')}>
<StyledLink onClick={() => to('/paintings')}> <i className="iconfont icon-business-smart-assistant" />
<Icon className={isRoute('/paintings')}> </Icon>
<PictureOutlined style={{ fontSize: 16 }} /> </StyledLink>
</Icon> </Tooltip>
</StyledLink> <Tooltip title={t('paintings.title')} mouseEnterDelay={0.5} placement="right">
<StyledLink onClick={() => to('/translate')}> <StyledLink onClick={() => to('/paintings')}>
<Icon className={isRoute('/translate')}> <Icon className={isRoute('/paintings')}>
<TranslationOutlined /> <PictureOutlined style={{ fontSize: 16 }} />
</Icon> </Icon>
</StyledLink> </StyledLink>
<StyledLink onClick={() => to('/apps')}> </Tooltip>
<Icon className={isRoute('/apps')}> <Tooltip title={t('translate.title')} mouseEnterDelay={0.5} placement="right">
<i className="iconfont icon-appstore" /> <StyledLink onClick={() => to('/translate')}>
</Icon> <Icon className={isRoute('/translate')}>
</StyledLink> <TranslationOutlined />
<StyledLink onClick={() => to('/files')}> </Icon>
<Icon className={isRoute('/files')}> </StyledLink>
<FolderOutlined /> </Tooltip>
</Icon> <Tooltip title={t('minapp.title')} mouseEnterDelay={0.5} placement="right">
</StyledLink> <StyledLink onClick={() => to('/apps')}>
<StyledLink onClick={() => to('/messages')}> <Icon className={isRoute('/apps')}>
<Icon className={isRoutes('/messages')}> <i className="iconfont icon-appstore" />
<FileSearchOutlined /> </Icon>
</Icon> </StyledLink>
</StyledLink> </Tooltip>
<Tooltip title={t('files.title')} mouseEnterDelay={0.5} placement="right">
<StyledLink onClick={() => to('/files')}>
<Icon className={isRoute('/files')}>
<FolderOutlined />
</Icon>
</StyledLink>
</Tooltip>
<Tooltip title={t('history.title')} mouseEnterDelay={0.5} placement="right">
<StyledLink onClick={() => to('/messages')}>
<Icon className={isRoutes('/messages')}>
<FileSearchOutlined />
</Icon>
</StyledLink>
</Tooltip>
</Menus> </Menus>
</MainMenus> </MainMenus>
<Menus onClick={MinApp.onClose}> <Menus onClick={MinApp.onClose}>
<Icon onClick={() => toggleTheme()}> <Tooltip title={t('settings.theme.title')} mouseEnterDelay={0.5} placement="right">
{theme === 'dark' ? ( <Icon onClick={() => toggleTheme()}>
<i className="iconfont icon-theme icon-dark1" /> {theme === 'dark' ? (
) : ( <i className="iconfont icon-theme icon-dark1" />
<i className="iconfont icon-theme icon-theme-light" /> ) : (
)} <i className="iconfont icon-theme icon-theme-light" />
</Icon> )}
<StyledLink onClick={() => to(isLocalAi ? '/settings/assistant' : '/settings/provider')}>
<Icon className={pathname.startsWith('/settings') ? 'active' : ''}>
<i className="iconfont icon-setting" />
</Icon> </Icon>
</StyledLink> </Tooltip>
<Tooltip title={t('settings.title')} mouseEnterDelay={0.5} placement="right">
<StyledLink onClick={() => to(isLocalAi ? '/settings/assistant' : '/settings/provider')}>
<Icon className={pathname.startsWith('/settings') ? 'active' : ''}>
<i className="iconfont icon-setting" />
</Icon>
</StyledLink>
</Tooltip>
</Menus> </Menus>
</Container> </Container>
) )

View File

@ -145,7 +145,7 @@
"stream_output": "流式输出", "stream_output": "流式输出",
"search": "搜索模型..." "search": "搜索模型..."
}, },
"images": { "paintings": {
"title": "图片", "title": "图片",
"image.size": "图片尺寸", "image.size": "图片尺寸",
"button.new.image": "新建图片", "button.new.image": "新建图片",

View File

@ -45,7 +45,7 @@ const PaintingsList: FC<PaintingsListProps> = ({
</Canvas> </Canvas>
<DeleteButton> <DeleteButton>
<Popconfirm <Popconfirm
title={t('images.button.delete.image.confirm')} title={t('paintings.button.delete.image.confirm')}
onConfirm={() => onDeletePainting(item)} onConfirm={() => onDeletePainting(item)}
okButtonProps={{ danger: true }} okButtonProps={{ danger: true }}
placement="left"> placement="left">

View File

@ -107,7 +107,7 @@ const PaintingsPage: FC = () => {
const onGenerate = async () => { const onGenerate = async () => {
if (painting.files.length > 0) { if (painting.files.length > 0) {
const confirmed = await window.modal.confirm({ const confirmed = await window.modal.confirm({
content: t('images.regenerate.confirm'), content: t('paintings.regenerate.confirm'),
centered: true centered: true
}) })
@ -252,11 +252,11 @@ const PaintingsPage: FC = () => {
return ( return (
<Container> <Container>
<Navbar> <Navbar>
<NavbarCenter style={{ borderRight: 'none' }}>{t('images.title')}</NavbarCenter> <NavbarCenter style={{ borderRight: 'none' }}>{t('paintings.title')}</NavbarCenter>
{isMac && ( {isMac && (
<NavbarRight style={{ justifyContent: 'flex-end' }}> <NavbarRight style={{ justifyContent: 'flex-end' }}>
<Button size="small" className="nodrag" icon={<PlusOutlined />} onClick={() => setPainting(addPainting())}> <Button size="small" className="nodrag" icon={<PlusOutlined />} onClick={() => setPainting(addPainting())}>
{t('images.button.new.image')} {t('paintings.button.new.image')}
</Button> </Button>
</NavbarRight> </NavbarRight>
)} )}
@ -271,7 +271,7 @@ const PaintingsPage: FC = () => {
/> />
<SettingTitle style={{ marginBottom: 5, marginTop: 15 }}>{t('common.model')}</SettingTitle> <SettingTitle style={{ marginBottom: 5, marginTop: 15 }}>{t('common.model')}</SettingTitle>
<Select value={painting.model} options={modelOptions} onChange={onSelectModel} /> <Select value={painting.model} options={modelOptions} onChange={onSelectModel} />
<SettingTitle style={{ marginBottom: 5, marginTop: 15 }}>{t('images.image.size')}</SettingTitle> <SettingTitle style={{ marginBottom: 5, marginTop: 15 }}>{t('paintings.image.size')}</SettingTitle>
<Radio.Group <Radio.Group
value={painting.imageSize} value={painting.imageSize}
onChange={(e) => onSelectImageSize(e.target.value)} onChange={(e) => onSelectImageSize(e.target.value)}
@ -287,8 +287,8 @@ const PaintingsPage: FC = () => {
</Radio.Group> </Radio.Group>
<SettingTitle style={{ marginBottom: 5, marginTop: 15 }}> <SettingTitle style={{ marginBottom: 5, marginTop: 15 }}>
{t('images.number_images')} {t('paintings.number_images')}
<Tooltip title={t('images.number_images_tip')}> <Tooltip title={t('paintings.number_images_tip')}>
<InfoIcon /> <InfoIcon />
</Tooltip> </Tooltip>
</SettingTitle> </SettingTitle>
@ -300,8 +300,8 @@ const PaintingsPage: FC = () => {
/> />
<SettingTitle style={{ marginBottom: 5, marginTop: 15 }}> <SettingTitle style={{ marginBottom: 5, marginTop: 15 }}>
{t('images.seed')} {t('paintings.seed')}
<Tooltip title={t('images.seed_tip')}> <Tooltip title={t('paintings.seed_tip')}>
<InfoIcon /> <InfoIcon />
</Tooltip> </Tooltip>
</SettingTitle> </SettingTitle>
@ -312,8 +312,8 @@ const PaintingsPage: FC = () => {
/> />
<SettingTitle style={{ marginBottom: 5, marginTop: 15 }}> <SettingTitle style={{ marginBottom: 5, marginTop: 15 }}>
{t('images.inference_steps')} {t('paintings.inference_steps')}
<Tooltip title={t('images.inference_steps_tip')}> <Tooltip title={t('paintings.inference_steps_tip')}>
<InfoIcon /> <InfoIcon />
</Tooltip> </Tooltip>
</SettingTitle> </SettingTitle>
@ -326,8 +326,8 @@ const PaintingsPage: FC = () => {
/> />
<SettingTitle style={{ marginBottom: 5, marginTop: 15 }}> <SettingTitle style={{ marginBottom: 5, marginTop: 15 }}>
{t('images.guidance_scale')} {t('paintings.guidance_scale')}
<Tooltip title={t('images.guidance_scale_tip')}> <Tooltip title={t('paintings.guidance_scale_tip')}>
<InfoIcon /> <InfoIcon />
</Tooltip> </Tooltip>
</SettingTitle> </SettingTitle>
@ -347,8 +347,8 @@ const PaintingsPage: FC = () => {
/> />
<SettingTitle style={{ marginBottom: 5, marginTop: 15 }}> <SettingTitle style={{ marginBottom: 5, marginTop: 15 }}>
{t('images.negative_prompt')} {t('paintings.negative_prompt')}
<Tooltip title={t('images.negative_prompt_tip')}> <Tooltip title={t('paintings.negative_prompt_tip')}>
<InfoIcon /> <InfoIcon />
</Tooltip> </Tooltip>
</SettingTitle> </SettingTitle>
@ -374,7 +374,7 @@ const PaintingsPage: FC = () => {
disabled={isLoading} disabled={isLoading}
value={painting.prompt} value={painting.prompt}
onChange={(e) => updatePaintingState({ prompt: e.target.value })} onChange={(e) => updatePaintingState({ prompt: e.target.value })}
placeholder={t('images.prompt_placeholder')} placeholder={t('paintings.prompt_placeholder')}
/> />
<Toolbar> <Toolbar>
<ToolbarMenu> <ToolbarMenu>