refactor: Simplify import and topic deletion logic

- Updated import statement to remove unused type reference.
- Improved handling of deleting a topic.
This commit is contained in:
kangfenmao 2024-09-08 22:25:56 +08:00
parent 828bd71f22
commit bd194ff955
2 changed files with 81 additions and 32 deletions

View File

@ -1,7 +1,7 @@
import { useAssistants } from '@renderer/hooks/useAssistant' import { useAssistants } from '@renderer/hooks/useAssistant'
import { useShowAssistants } from '@renderer/hooks/useStore' import { useShowAssistants } from '@renderer/hooks/useStore'
import { useActiveTopic } from '@renderer/hooks/useTopic' import { useActiveTopic } from '@renderer/hooks/useTopic'
import { Assistant, Topic } from '@renderer/types' import { Assistant } from '@renderer/types'
import { FC, useState } from 'react' import { FC, useState } from 'react'
import styled from 'styled-components' import styled from 'styled-components'
@ -15,15 +15,10 @@ const HomePage: FC = () => {
const { assistants } = useAssistants() const { assistants } = useAssistants()
const [activeAssistant, setActiveAssistant] = useState(_activeAssistant || assistants[0]) const [activeAssistant, setActiveAssistant] = useState(_activeAssistant || assistants[0])
const { showAssistants } = useShowAssistants() const { showAssistants } = useShowAssistants()
const { activeTopic, setActiveTopic } = useActiveTopic(activeAssistant) const { activeTopic, setActiveTopic } = useActiveTopic(activeAssistant)
_activeAssistant = activeAssistant _activeAssistant = activeAssistant
const onSetActiveTopic = (topic: Topic) => {
setActiveTopic(topic)
}
return ( return (
<Container> <Container>
<Navbar activeAssistant={activeAssistant} setActiveAssistant={setActiveAssistant} activeTopic={activeTopic} /> <Navbar activeAssistant={activeAssistant} setActiveAssistant={setActiveAssistant} activeTopic={activeTopic} />
@ -40,7 +35,7 @@ const HomePage: FC = () => {
<Chat <Chat
assistant={activeAssistant} assistant={activeAssistant}
activeTopic={activeTopic} activeTopic={activeTopic}
setActiveTopic={onSetActiveTopic} setActiveTopic={setActiveTopic}
setActiveAssistant={setActiveAssistant} setActiveAssistant={setActiveAssistant}
/> />
</ContentContainer> </ContentContainer>

View File

@ -1,4 +1,4 @@
import { DeleteOutlined, EditOutlined, OpenAIOutlined } from '@ant-design/icons' import { CloseOutlined, DeleteOutlined, EditOutlined, OpenAIOutlined } from '@ant-design/icons'
import DragableList from '@renderer/components/DragableList' import DragableList from '@renderer/components/DragableList'
import PromptPopup from '@renderer/components/Popups/PromptPopup' import PromptPopup from '@renderer/components/Popups/PromptPopup'
import { useAssistant } from '@renderer/hooks/useAssistant' import { useAssistant } from '@renderer/hooks/useAssistant'
@ -7,7 +7,7 @@ import LocalStorage from '@renderer/services/storage'
import { useAppSelector } from '@renderer/store' import { useAppSelector } from '@renderer/store'
import { Assistant, Topic } from '@renderer/types' import { Assistant, Topic } from '@renderer/types'
import { Button, Dropdown, MenuProps } from 'antd' import { Button, Dropdown, MenuProps } from 'antd'
import { take } from 'lodash' import { findIndex, take } from 'lodash'
import { FC, useCallback, useState } from 'react' import { FC, useCallback, useState } from 'react'
import { useTranslation } from 'react-i18next' import { useTranslation } from 'react-i18next'
import styled from 'styled-components' import styled from 'styled-components'
@ -25,6 +25,28 @@ const Topics: FC<Props> = ({ assistant: _assistant, activeTopic, setActiveTopic
const { t } = useTranslation() const { t } = useTranslation()
const generating = useAppSelector((state) => state.runtime.generating) const generating = useAppSelector((state) => state.runtime.generating)
const onDeleteTopic = useCallback(
(topic: Topic) => {
if (assistant.topics.length > 1) {
const index = findIndex(assistant.topics, (t) => t.id === topic.id)
setActiveTopic(assistant.topics[index + 1 === assistant.topics.length ? 0 : index + 1])
removeTopic(topic)
}
},
[assistant.topics, removeTopic, setActiveTopic]
)
const onSwitchTopic = useCallback(
(topic: Topic) => {
if (generating) {
window.message.warning({ content: t('message.switch.disabled'), key: 'switch-assistant' })
return
}
setActiveTopic(topic)
},
[generating, setActiveTopic, t]
)
const getTopicMenuItems = useCallback( const getTopicMenuItems = useCallback(
(topic: Topic) => { (topic: Topic) => {
const menus: MenuProps['items'] = [ const menus: MenuProps['items'] = [
@ -66,28 +88,13 @@ const Topics: FC<Props> = ({ assistant: _assistant, activeTopic, setActiveTopic
danger: true, danger: true,
key: 'delete', key: 'delete',
icon: <DeleteOutlined />, icon: <DeleteOutlined />,
onClick() { onClick: () => onDeleteTopic(topic)
if (assistant.topics.length === 1) return
removeTopic(topic)
setActiveTopic(assistant.topics[0])
}
}) })
} }
return menus return menus
}, },
[assistant, removeTopic, setActiveTopic, t, updateTopic] [assistant, onDeleteTopic, t, updateTopic]
)
const onSwitchTopic = useCallback(
(topic: Topic) => {
if (generating) {
window.message.warning({ content: t('message.switch.disabled'), key: 'switch-assistant' })
return
}
setActiveTopic(topic)
},
[generating, setActiveTopic, t]
) )
return ( return (
@ -102,7 +109,17 @@ const Topics: FC<Props> = ({ assistant: _assistant, activeTopic, setActiveTopic
return ( return (
<Dropdown menu={{ items: getTopicMenuItems(topic) }} trigger={['contextMenu']} key={topic.id}> <Dropdown menu={{ items: getTopicMenuItems(topic) }} trigger={['contextMenu']} key={topic.id}>
<TopicListItem className={isActive ? 'active' : ''} onClick={() => onSwitchTopic(topic)}> <TopicListItem className={isActive ? 'active' : ''} onClick={() => onSwitchTopic(topic)}>
{topic.name} <TopicName>{topic.name}</TopicName>
{assistant.topics.length > 1 && (
<MenuButton
className="menu"
onClick={(e) => {
e.stopPropagation()
onDeleteTopic(topic)
}}>
<CloseOutlined />
</MenuButton>
)}
</TopicListItem> </TopicListItem>
</Dropdown> </Dropdown>
) )
@ -133,17 +150,54 @@ const TopicListItem = styled.div`
margin: 0 10px; margin: 0 10px;
cursor: pointer; cursor: pointer;
border-radius: 4px; border-radius: 4px;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
font-family: Ubuntu; font-family: Ubuntu;
font-size: 13px; font-size: 13px;
&:hover { display: flex;
background-color: var(--color-background-soft); flex-direction: row;
justify-content: space-between;
align-items: center;
position: relative;
.menu {
opacity: 0;
color: var(--color-text-3);
} }
&.active { &.active {
background-color: var(--color-background-mute); background-color: var(--color-background-mute);
font-weight: 500; font-weight: 500;
.menu {
opacity: 1;
background-color: var(--color-background-mute);
&:hover {
color: var(--color-text-2);
}
}
}
`
const TopicName = styled.div`
color: var(--color-text);
display: -webkit-box;
-webkit-line-clamp: 1;
-webkit-box-orient: vertical;
overflow: hidden;
font-size: 13px;
`
const MenuButton = styled.div`
display: flex;
flex-direction: row;
justify-content: center;
align-items: center;
width: 30px;
height: 24px;
min-width: 24px;
min-height: 24px;
border-radius: 4px;
position: absolute;
right: 10px;
top: 5px;
.anticon {
font-size: 12px;
} }
` `