Commit b8758181 by Liu

fix: 选中工具时刷新逻辑

parent c398ed18
...@@ -8,7 +8,7 @@ import SendIcon from '@/assets/svg/send.svg?react' ...@@ -8,7 +8,7 @@ import SendIcon from '@/assets/svg/send.svg?react'
import { type WithAuthProps, withAuth } from '@/auth/withAuth' import { type WithAuthProps, withAuth } from '@/auth/withAuth'
import { useAppDispatch, useAppSelector } from '@/store/hook' import { useAppDispatch, useAppSelector } from '@/store/hook'
import { fetchToolList } from '@/api/home' import { fetchToolList } from '@/api/home'
import { createConversation } from '@/store/conversationSlice' import { clearCurrentToolId, createConversation, setCurrentToolId } from '@/store/conversationSlice'
interface ChatEditorProps { interface ChatEditorProps {
onChange?: (value: string) => void onChange?: (value: string) => void
...@@ -138,6 +138,10 @@ const ChatEditorBase: React.FC<ChatEditorProps & WithAuthProps> = ({ checkAuth, ...@@ -138,6 +138,10 @@ const ChatEditorBase: React.FC<ChatEditorProps & WithAuthProps> = ({ checkAuth,
if (!checkAuth()) if (!checkAuth())
return return
try { try {
// 先清除 toolId,确保创建会话时能获取到正确的状态
dispatch(clearCurrentToolId())
// 清除 sessionStorage 中的 toolId
sessionStorage.removeItem('currentToolId')
await dispatch(createConversation({ await dispatch(createConversation({
conversationData: {}, conversationData: {},
shouldNavigate: true, shouldNavigate: true,
...@@ -157,6 +161,8 @@ const ChatEditorBase: React.FC<ChatEditorProps & WithAuthProps> = ({ checkAuth, ...@@ -157,6 +161,8 @@ const ChatEditorBase: React.FC<ChatEditorProps & WithAuthProps> = ({ checkAuth,
if (!checkAuth()) if (!checkAuth())
return return
try { try {
// 先设置 toolId,确保创建会话时能获取到正确的状态
dispatch(setCurrentToolId(tool.toolId))
await dispatch(createConversation({ await dispatch(createConversation({
conversationData: {}, conversationData: {},
shouldNavigate: true, shouldNavigate: true,
...@@ -276,13 +282,13 @@ const ChatEditorBase: React.FC<ChatEditorProps & WithAuthProps> = ({ checkAuth, ...@@ -276,13 +282,13 @@ const ChatEditorBase: React.FC<ChatEditorProps & WithAuthProps> = ({ checkAuth,
{toolList && toolList.length > 0 && ( {toolList && toolList.length > 0 && (
<div className="absolute left-4 bottom-2 flex items-center gap-3 pointer-events-auto pl-[16px]"> <div className="absolute left-4 bottom-2 flex items-center gap-3 pointer-events-auto pl-[16px]">
{toolList.map((tool: any, index: number) => { {toolList.map((tool: any, index: number) => {
// index === 1 的按钮(通用模式)在默认状态下高亮 // (index === 1 || tool.toolName === '通用模式')在默认状态下高亮
const isSelected = (selectedToolId === tool.toolId && !isToolBtnActive) || (index === 1 && isToolBtnActive) const isSelected = (selectedToolId === tool.toolId && !isToolBtnActive) || ((index === 1 || tool.toolName === '通用模式') && isToolBtnActive)
const handleButtonPress = async () => { const handleButtonPress = async () => {
// 高亮状态直接返回,避免重复触发 // 高亮状态直接返回,避免重复触发
if (isSelected) if (isSelected)
return return
if (index === 1) if ((index === 1 || tool.toolName === '通用模式'))
await handleGeneralClick() await handleGeneralClick()
else else
await handleToolClick(tool) await handleToolClick(tool)
......
...@@ -24,9 +24,11 @@ export const HistoryBarList: React.FC<HistoryBarListProps> = ({ searchValue, onS ...@@ -24,9 +24,11 @@ export const HistoryBarList: React.FC<HistoryBarListProps> = ({ searchValue, onS
if (isMobile()) { if (isMobile()) {
onSetHistoryVisible(false) onSetHistoryVisible(false)
} }
// 直接导航到历史记录,不设置shouldSendQuestion // 直接导航到历史记录,不设置shouldSendQuestion
navigate(`/chat/${conversation.conversationId}`) // 将 toolId 拼接到路由上,默认为空字符串
const toolId = conversation.toolId || ''
const toolIdParam = `?toolId=${toolId}`
navigate(`/chat/${conversation.conversationId}${toolIdParam}`)
} }
const handleFilter = useDebounceFn(() => { const handleFilter = useDebounceFn(() => {
......
...@@ -22,7 +22,7 @@ const NavbarBase: React.FC<NavbarProps & WithAuthProps> = ({ isHistoryVisible, c ...@@ -22,7 +22,7 @@ const NavbarBase: React.FC<NavbarProps & WithAuthProps> = ({ isHistoryVisible, c
const dispatch = useAppDispatch() const dispatch = useAppDispatch()
const navigate = useNavigate() const navigate = useNavigate()
const { currentConversationId, shouldNavigateToNewConversation } = useAppSelector(state => state.conversation) const { currentConversationId, shouldNavigateToNewConversation, currentToolId } = useAppSelector(state => state.conversation)
const handleCreateConversation = () => { const handleCreateConversation = () => {
dispatch(createConversation({ dispatch(createConversation({
...@@ -77,6 +77,12 @@ const NavbarBase: React.FC<NavbarProps & WithAuthProps> = ({ isHistoryVisible, c ...@@ -77,6 +77,12 @@ const NavbarBase: React.FC<NavbarProps & WithAuthProps> = ({ isHistoryVisible, c
if (conversationId) { if (conversationId) {
sessionStorage.setItem('currentConversationId', conversationId) sessionStorage.setItem('currentConversationId', conversationId)
} }
// 从URL参数中提取toolId并保存到sessionStorage
const urlParams = new URLSearchParams(location.search)
const toolId = urlParams.get('toolId')
if (toolId && toolId !== '') {
sessionStorage.setItem('currentToolId', toolId)
}
navigate('/collect') navigate('/collect')
} }
...@@ -103,10 +109,12 @@ const NavbarBase: React.FC<NavbarProps & WithAuthProps> = ({ isHistoryVisible, c ...@@ -103,10 +109,12 @@ const NavbarBase: React.FC<NavbarProps & WithAuthProps> = ({ isHistoryVisible, c
useEffect(() => { useEffect(() => {
if (shouldNavigateToNewConversation && currentConversationId) { if (shouldNavigateToNewConversation && currentConversationId) {
navigate(`/chat/${currentConversationId}`) // 将 toolId 拼接到路由上,默认为空字符串
const toolIdParam = currentToolId ? `?toolId=${currentToolId}` : '?toolId='
navigate(`/chat/${currentConversationId}${toolIdParam}`)
dispatch(clearNavigationFlag()) dispatch(clearNavigationFlag())
} }
}, [shouldNavigateToNewConversation, currentConversationId, navigate, dispatch]) }, [shouldNavigateToNewConversation, currentConversationId, currentToolId, navigate, dispatch])
// keep latest conversation id in sessionStorage for cross-page returns (e.g., from collect) // keep latest conversation id in sessionStorage for cross-page returns (e.g., from collect)
useEffect(() => { useEffect(() => {
......
...@@ -14,10 +14,12 @@ import QIcon from '@/assets/svg/qicon.svg?react' ...@@ -14,10 +14,12 @@ import QIcon from '@/assets/svg/qicon.svg?react'
import EmptyIcon from '@/assets/svg/empty.svg?react' import EmptyIcon from '@/assets/svg/empty.svg?react'
import ShineBorder from '@/components/ShineBorder' import ShineBorder from '@/components/ShineBorder'
import SdreamLoading from '@/components/SdreamLoading' import SdreamLoading from '@/components/SdreamLoading'
import { useAppSelector } from '@/store/hook'
export const Collect: React.FC = () => { export const Collect: React.FC = () => {
const navigate = useNavigate() const navigate = useNavigate()
const hasLoaded = useRef(false) const hasLoaded = useRef(false)
const { conversations } = useAppSelector(state => state.conversation)
const [isLoading, setIsLoading] = useState(false) const [isLoading, setIsLoading] = useState(false)
const [isOpen, setIsOpen] = useState(false) const [isOpen, setIsOpen] = useState(false)
...@@ -86,7 +88,15 @@ export const Collect: React.FC = () => { ...@@ -86,7 +88,15 @@ export const Collect: React.FC = () => {
// 添加返回上一页的函数 // 添加返回上一页的函数
const handleGoBack = () => { const handleGoBack = () => {
const conversationId = sessionStorage.getItem('currentConversationId') || '' const conversationId = sessionStorage.getItem('currentConversationId') || ''
navigate(`/chat/${conversationId}`, { state: { fromCollect: true } }) // 优先从 sessionStorage 中获取 toolId
let toolId = sessionStorage.getItem('currentToolId') || ''
// 如果 sessionStorage 中没有,则从会话列表中查找
if (!toolId) {
const targetConversation = conversations.find(conv => conv.conversationId === conversationId)
toolId = targetConversation?.toolId || ''
}
const toolIdParam = `?toolId=${toolId}`
navigate(`/chat/${conversationId}${toolIdParam}`, { state: { fromCollect: true } })
} }
useEffect(() => { useEffect(() => {
...@@ -131,11 +141,11 @@ export const Collect: React.FC = () => { ...@@ -131,11 +141,11 @@ export const Collect: React.FC = () => {
}} }}
className="flex flex-col gap-[24px]" className="flex flex-col gap-[24px]"
> >
{collectList.map((item: any, index: number) => ( {collectList.map((item: any) => (
<ShineBorder <ShineBorder
borderRadius={20} borderRadius={20}
className="text-[#27353C] w-full mx-auto bg-white rounded-[20px] box-border px-[24px] py-[20px]" className="text-[#27353C] w-full mx-auto bg-white rounded-[20px] box-border px-[24px] py-[20px]"
key={`${item.collectionId}_${index}`} key={item.collectionId ?? `${item.question}-${item.collectionTime}`}
> >
<div className="flex mb-[20px]"> <div className="flex mb-[20px]">
<div className="mr-[20px]"> <div className="mr-[20px]">
......
...@@ -144,6 +144,21 @@ finally { ...@@ -144,6 +144,21 @@ finally {
} }
}, [originalOtherQuestions]) }, [originalOtherQuestions])
// 进入页面时,如果路由中有 toolId 且不为空,执行工具点击逻辑
useEffect(() => {
if (location.pathname.startsWith('/chat/')) {
const urlParams = new URLSearchParams(window.location.search)
const toolIdFromUrl = urlParams.get('toolId')
if (toolIdFromUrl && toolIdFromUrl !== '') {
// 有 toolId,执行工具点击逻辑
dispatch(setCurrentToolId(toolIdFromUrl))
setShouldChangeStyle(true)
setIsToolBtnActive(false)
_handleToolClick(false, toolIdFromUrl)
}
}
}, [location.pathname, location.search, dispatch, _handleToolClick])
// 监听工具按钮点击事件 // 监听工具按钮点击事件
useEffect(() => { useEffect(() => {
const handleToolClickEvent = (event: CustomEvent) => { const handleToolClickEvent = (event: CustomEvent) => {
......
...@@ -98,7 +98,11 @@ const QuestionListBase: React.FC<QuestionListProps & WithAuthProps> = ({ ...@@ -98,7 +98,11 @@ const QuestionListBase: React.FC<QuestionListProps & WithAuthProps> = ({
// 使用现有会话 // 使用现有会话
dispatch(setCurrentConversation(targetConversationId)) dispatch(setCurrentConversation(targetConversationId))
dispatch(setShouldSendQuestion(item)) dispatch(setShouldSendQuestion(item))
navigate(`/chat/${targetConversationId}`) // 从会话列表中查找对应的 toolId,默认为空字符串
const targetConversation = conversations.find(conv => conv.conversationId === targetConversationId)
const toolId = targetConversation?.toolId || ''
const toolIdParam = `?toolId=${toolId}`
navigate(`/chat/${targetConversationId}${toolIdParam}`)
} }
else { else {
// 如果没有现有会话,仍然创建新会话(向后兼容) // 如果没有现有会话,仍然创建新会话(向后兼容)
......
...@@ -62,8 +62,10 @@ export const createConversation = createAsyncThunk< ...@@ -62,8 +62,10 @@ export const createConversation = createAsyncThunk<
{ state: { conversation: ConversationState } } { state: { conversation: ConversationState } }
>( >(
'conversation/createConversation', 'conversation/createConversation',
async ({ conversationData, shouldNavigate, shouldSendQuestion }, { dispatch }) => { async ({ conversationData, shouldNavigate, shouldSendQuestion }, { dispatch, getState }) => {
const response = await fetchCreateConversation(conversationData) const state = getState()
const toolId = state.conversation.currentToolId || ''
const response = await fetchCreateConversation({ ...conversationData, toolId })
const newConversation = response.data const newConversation = response.data
dispatch(fetchConversations()) dispatch(fetchConversations())
......
...@@ -5,6 +5,7 @@ export interface Conversation { ...@@ -5,6 +5,7 @@ export interface Conversation {
endTime: string endTime: string
startTime: string startTime: string
qaNum: number qaNum: number
toolId?: string
} }
export interface ConversationState { export interface ConversationState {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment