mirror of
https://github.com/CherryHQ/cherry-studio.git
synced 2026-01-05 12:29:44 +08:00
fix: remove Event Emitter
This commit is contained in:
parent
f1ecb16f2b
commit
232b57f7e8
@ -1,8 +1,7 @@
|
|||||||
import { CloseOutlined, CopyOutlined, DeleteOutlined, SaveOutlined } from '@ant-design/icons'
|
import { CloseOutlined, CopyOutlined, DeleteOutlined, SaveOutlined } from '@ant-design/icons'
|
||||||
import { EventEmitter } from '@renderer/services/EventService'
|
import { useChatContext } from '@renderer/pages/home/Messages/ChatContext'
|
||||||
import type { Message } from '@renderer/types/newMessage'
|
|
||||||
import { Button, Tooltip } from 'antd'
|
import { Button, Tooltip } from 'antd'
|
||||||
import { FC, useEffect, useState } from 'react'
|
import { FC } from 'react'
|
||||||
import { useTranslation } from 'react-i18next'
|
import { useTranslation } from 'react-i18next'
|
||||||
import styled from 'styled-components'
|
import styled from 'styled-components'
|
||||||
|
|
||||||
@ -12,50 +11,9 @@ interface MultiSelectActionPopupProps {
|
|||||||
onAction?: (action: string, messageIds: string[]) => void
|
onAction?: (action: string, messageIds: string[]) => void
|
||||||
topic: any
|
topic: any
|
||||||
}
|
}
|
||||||
|
|
||||||
interface MessageTypeInfo {
|
|
||||||
hasUserMessages: boolean
|
|
||||||
hasAssistantMessages: boolean
|
|
||||||
messageIds: string[]
|
|
||||||
}
|
|
||||||
|
|
||||||
const MultiSelectActionPopup: FC<MultiSelectActionPopupProps> = ({ visible, onClose, onAction }) => {
|
const MultiSelectActionPopup: FC<MultiSelectActionPopupProps> = ({ visible, onClose, onAction }) => {
|
||||||
const { t } = useTranslation()
|
const { t } = useTranslation()
|
||||||
const [, setSelectedMessages] = useState<Message[]>([])
|
const { toggleMultiSelectMode, selectedMessageIds } = useChatContext()
|
||||||
const [selectedMessageIds, setSelectedMessageIds] = useState<string[]>([])
|
|
||||||
const [, setMessageTypeInfo] = useState<MessageTypeInfo>({
|
|
||||||
hasUserMessages: false,
|
|
||||||
hasAssistantMessages: false,
|
|
||||||
messageIds: []
|
|
||||||
})
|
|
||||||
|
|
||||||
useEffect(() => {
|
|
||||||
const handleSelectedMessagesChanged = (messageIds: string[]) => {
|
|
||||||
setSelectedMessageIds(messageIds)
|
|
||||||
EventEmitter.emit('REQUEST_SELECTED_MESSAGE_DETAILS', messageIds)
|
|
||||||
}
|
|
||||||
|
|
||||||
const handleSelectedMessageDetails = (messages: Message[]) => {
|
|
||||||
setSelectedMessages(messages)
|
|
||||||
|
|
||||||
const hasUserMessages = messages.some((msg) => msg.role === 'user')
|
|
||||||
const hasAssistantMessages = messages.some((msg) => msg.role === 'assistant')
|
|
||||||
|
|
||||||
setMessageTypeInfo({
|
|
||||||
hasUserMessages,
|
|
||||||
hasAssistantMessages,
|
|
||||||
messageIds: selectedMessageIds
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
EventEmitter.on('SELECTED_MESSAGES_CHANGED', handleSelectedMessagesChanged)
|
|
||||||
EventEmitter.on('SELECTED_MESSAGE_DETAILS', handleSelectedMessageDetails)
|
|
||||||
|
|
||||||
return () => {
|
|
||||||
EventEmitter.off('SELECTED_MESSAGES_CHANGED', handleSelectedMessagesChanged)
|
|
||||||
EventEmitter.off('SELECTED_MESSAGE_DETAILS', handleSelectedMessageDetails)
|
|
||||||
}
|
|
||||||
}, [selectedMessageIds])
|
|
||||||
|
|
||||||
const handleAction = (action: string) => {
|
const handleAction = (action: string) => {
|
||||||
if (onAction) {
|
if (onAction) {
|
||||||
@ -64,7 +22,7 @@ const MultiSelectActionPopup: FC<MultiSelectActionPopupProps> = ({ visible, onCl
|
|||||||
}
|
}
|
||||||
|
|
||||||
const handleClose = () => {
|
const handleClose = () => {
|
||||||
EventEmitter.emit('MESSAGE_MULTI_SELECT', false)
|
toggleMultiSelectMode(false)
|
||||||
onClose()
|
onClose()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -9,8 +9,10 @@ import { useDispatch, useSelector } from 'react-redux'
|
|||||||
|
|
||||||
interface ChatContextProps {
|
interface ChatContextProps {
|
||||||
isMultiSelectMode: boolean
|
isMultiSelectMode: boolean
|
||||||
|
selectedMessageIds: string[]
|
||||||
toggleMultiSelectMode: (value: boolean) => void
|
toggleMultiSelectMode: (value: boolean) => void
|
||||||
handleMultiSelectAction: (actionType: string, messageIds: string[]) => void
|
handleMultiSelectAction: (actionType: string, messageIds: string[]) => void
|
||||||
|
handleSelectMessage: (messageId: string, selected: boolean) => void
|
||||||
activeTopic: Topic
|
activeTopic: Topic
|
||||||
locateMessage: (messageId: string) => void
|
locateMessage: (messageId: string) => void
|
||||||
messageRefs: Map<string, HTMLElement>
|
messageRefs: Map<string, HTMLElement>
|
||||||
@ -36,6 +38,7 @@ export const ChatProvider: FC<ChatProviderProps> = ({ children, activeTopic }) =
|
|||||||
const { t } = useTranslation()
|
const { t } = useTranslation()
|
||||||
const dispatch = useDispatch()
|
const dispatch = useDispatch()
|
||||||
const [isMultiSelectMode, setIsMultiSelectMode] = useState(false)
|
const [isMultiSelectMode, setIsMultiSelectMode] = useState(false)
|
||||||
|
const [selectedMessageIds, setSelectedMessageIds] = useState<string[]>([])
|
||||||
const [confirmDeleteVisible, setConfirmDeleteVisible] = useState(false)
|
const [confirmDeleteVisible, setConfirmDeleteVisible] = useState(false)
|
||||||
const [messagesToDelete, setMessagesToDelete] = useState<string[]>([])
|
const [messagesToDelete, setMessagesToDelete] = useState<string[]>([])
|
||||||
const [messageRefs, setMessageRefs] = useState<Map<string, HTMLElement>>(new Map())
|
const [messageRefs, setMessageRefs] = useState<Map<string, HTMLElement>>(new Map())
|
||||||
@ -45,6 +48,9 @@ export const ChatProvider: FC<ChatProviderProps> = ({ children, activeTopic }) =
|
|||||||
|
|
||||||
const toggleMultiSelectMode = (value: boolean) => {
|
const toggleMultiSelectMode = (value: boolean) => {
|
||||||
setIsMultiSelectMode(value)
|
setIsMultiSelectMode(value)
|
||||||
|
if (!value) {
|
||||||
|
setSelectedMessageIds([])
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const registerMessageElement = useCallback((id: string, element: HTMLElement | null) => {
|
const registerMessageElement = useCallback((id: string, element: HTMLElement | null) => {
|
||||||
@ -80,6 +86,18 @@ export const ChatProvider: FC<ChatProviderProps> = ({ children, activeTopic }) =
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const handleSelectMessage = (messageId: string, selected: boolean) => {
|
||||||
|
setSelectedMessageIds((prev) => {
|
||||||
|
const newSet = new Set(prev)
|
||||||
|
if (selected) {
|
||||||
|
newSet.add(messageId)
|
||||||
|
} else {
|
||||||
|
newSet.delete(messageId)
|
||||||
|
}
|
||||||
|
return Array.from(newSet)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
const handleMultiSelectAction = (actionType: string, messageIds: string[]) => {
|
const handleMultiSelectAction = (actionType: string, messageIds: string[]) => {
|
||||||
if (messageIds.length === 0) {
|
if (messageIds.length === 0) {
|
||||||
window.message.warning(t('chat.multiple.select.empty'))
|
window.message.warning(t('chat.multiple.select.empty'))
|
||||||
@ -169,8 +187,10 @@ export const ChatProvider: FC<ChatProviderProps> = ({ children, activeTopic }) =
|
|||||||
|
|
||||||
const value = {
|
const value = {
|
||||||
isMultiSelectMode,
|
isMultiSelectMode,
|
||||||
|
selectedMessageIds,
|
||||||
toggleMultiSelectMode,
|
toggleMultiSelectMode,
|
||||||
handleMultiSelectAction,
|
handleMultiSelectAction,
|
||||||
|
handleSelectMessage,
|
||||||
activeTopic,
|
activeTopic,
|
||||||
locateMessage,
|
locateMessage,
|
||||||
messageRefs,
|
messageRefs,
|
||||||
|
|||||||
@ -49,6 +49,7 @@ interface MessagesProps {
|
|||||||
const Messages: FC<MessagesProps> = ({ assistant, topic, setActiveTopic, onComponentUpdate, onFirstUpdate }) => {
|
const Messages: FC<MessagesProps> = ({ assistant, topic, setActiveTopic, onComponentUpdate, onFirstUpdate }) => {
|
||||||
const { t } = useTranslation()
|
const { t } = useTranslation()
|
||||||
const { showPrompt, showTopics, topicPosition, showAssistants, messageNavigation } = useSettings()
|
const { showPrompt, showTopics, topicPosition, showAssistants, messageNavigation } = useSettings()
|
||||||
|
const { isMultiSelectMode, selectedMessageIds, handleSelectMessage } = useChatContext()
|
||||||
const { updateTopic, addTopic } = useAssistant(assistant.id)
|
const { updateTopic, addTopic } = useAssistant(assistant.id)
|
||||||
const dispatch = useAppDispatch()
|
const dispatch = useAppDispatch()
|
||||||
const containerRef = useRef<HTMLDivElement>(null)
|
const containerRef = useRef<HTMLDivElement>(null)
|
||||||
@ -57,9 +58,6 @@ const Messages: FC<MessagesProps> = ({ assistant, topic, setActiveTopic, onCompo
|
|||||||
const [isLoadingMore, setIsLoadingMore] = useState(false)
|
const [isLoadingMore, setIsLoadingMore] = useState(false)
|
||||||
const [isProcessingContext, setIsProcessingContext] = useState(false)
|
const [isProcessingContext, setIsProcessingContext] = useState(false)
|
||||||
|
|
||||||
const { isMultiSelectMode } = useChatContext()
|
|
||||||
|
|
||||||
const [selectedMessages, setSelectedMessages] = useState<Set<string>>(new Set())
|
|
||||||
const [isDragging, setIsDragging] = useState(false)
|
const [isDragging, setIsDragging] = useState(false)
|
||||||
const [dragStart, setDragStart] = useState({ x: 0, y: 0 })
|
const [dragStart, setDragStart] = useState({ x: 0, y: 0 })
|
||||||
const [dragCurrent, setDragCurrent] = useState({ x: 0, y: 0 })
|
const [dragCurrent, setDragCurrent] = useState({ x: 0, y: 0 })
|
||||||
@ -68,23 +66,12 @@ const Messages: FC<MessagesProps> = ({ assistant, topic, setActiveTopic, onCompo
|
|||||||
const { displayCount, clearTopicMessages, deleteMessage, createTopicBranch } = useMessageOperations(topic)
|
const { displayCount, clearTopicMessages, deleteMessage, createTopicBranch } = useMessageOperations(topic)
|
||||||
const messagesRef = useRef<Message[]>(messages)
|
const messagesRef = useRef<Message[]>(messages)
|
||||||
|
|
||||||
|
const selectedMessagesSet = useMemo(() => new Set(selectedMessageIds), [selectedMessageIds])
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
messagesRef.current = messages
|
messagesRef.current = messages
|
||||||
}, [messages])
|
}, [messages])
|
||||||
|
|
||||||
const handleSelectMessage = useCallback((messageId: string, selected: boolean) => {
|
|
||||||
setSelectedMessages((prev) => {
|
|
||||||
const newSet = new Set(prev)
|
|
||||||
if (selected) {
|
|
||||||
newSet.add(messageId)
|
|
||||||
} else {
|
|
||||||
newSet.delete(messageId)
|
|
||||||
}
|
|
||||||
EventEmitter.emit('SELECTED_MESSAGES_CHANGED', Array.from(newSet))
|
|
||||||
return newSet
|
|
||||||
})
|
|
||||||
}, [])
|
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (!isMultiSelectMode) return
|
if (!isMultiSelectMode) return
|
||||||
|
|
||||||
@ -157,25 +144,6 @@ const Messages: FC<MessagesProps> = ({ assistant, topic, setActiveTopic, onCompo
|
|||||||
}
|
}
|
||||||
}, [])
|
}, [])
|
||||||
|
|
||||||
useEffect(() => {
|
|
||||||
if (!isMultiSelectMode) {
|
|
||||||
setSelectedMessages(new Set())
|
|
||||||
}
|
|
||||||
}, [isMultiSelectMode])
|
|
||||||
|
|
||||||
useEffect(() => {
|
|
||||||
const handleRequestSelectedMessageDetails = (messageIds: string[]) => {
|
|
||||||
const selectedMessages = messages.filter((msg) => messageIds.includes(msg.id))
|
|
||||||
EventEmitter.emit('SELECTED_MESSAGE_DETAILS', selectedMessages)
|
|
||||||
}
|
|
||||||
|
|
||||||
EventEmitter.on('REQUEST_SELECTED_MESSAGE_DETAILS', handleRequestSelectedMessageDetails)
|
|
||||||
|
|
||||||
return () => {
|
|
||||||
EventEmitter.off('REQUEST_SELECTED_MESSAGE_DETAILS', handleRequestSelectedMessageDetails)
|
|
||||||
}
|
|
||||||
}, [messages])
|
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
const newDisplayMessages = computeDisplayMessages(messages, 0, displayCount)
|
const newDisplayMessages = computeDisplayMessages(messages, 0, displayCount)
|
||||||
setDisplayMessages(newDisplayMessages)
|
setDisplayMessages(newDisplayMessages)
|
||||||
@ -397,7 +365,7 @@ const Messages: FC<MessagesProps> = ({ assistant, topic, setActiveTopic, onCompo
|
|||||||
topic={topic}
|
topic={topic}
|
||||||
hidePresetMessages={assistant.settings?.hideMessages}
|
hidePresetMessages={assistant.settings?.hideMessages}
|
||||||
isMultiSelectMode={isMultiSelectMode}
|
isMultiSelectMode={isMultiSelectMode}
|
||||||
selectedMessages={selectedMessages}
|
selectedMessages={selectedMessagesSet}
|
||||||
onSelectMessage={handleSelectMessage}
|
onSelectMessage={handleSelectMessage}
|
||||||
registerMessageElement={registerMessageElement}
|
registerMessageElement={registerMessageElement}
|
||||||
/>
|
/>
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user