Commit c4b8c5a6 by HoMeTown

feat: 管理对话记录

parent 3e81b31f
...@@ -23,3 +23,13 @@ export function fetchCreateConversation<T>(data: T) { ...@@ -23,3 +23,13 @@ export function fetchCreateConversation<T>(data: T) {
export function fetchUserQaRecordPage(conversationId: string) { export function fetchUserQaRecordPage(conversationId: string) {
return http.post('/conversation/api/conversation/mobile/v1/query_user_qa_record_list', { conversationId }) return http.post('/conversation/api/conversation/mobile/v1/query_user_qa_record_list', { conversationId })
} }
/**
* 删除用户历史会话
* @params
*/
export function fetchDeleteUserConversation(conversationIdList: string[]) {
return http.post('/conversation/api/conversation/mobile/v1/delete_user_conversation', {
conversationIdList,
})
}
import { Button, Modal, ModalBody, ModalContent, ModalFooter, ModalHeader, Table, TableBody, TableCell, TableColumn, TableHeader, TableRow, getKeyValue } from '@nextui-org/react' import { Button, Modal, ModalBody, ModalContent, ModalFooter, ModalHeader, Table, TableBody, TableCell, TableColumn, TableHeader, TableRow, getKeyValue } from '@nextui-org/react'
import React from 'react' import React from 'react'
import { useDispatch } from 'react-redux'
import { useAppSelector } from '@/store/hook' import { useAppSelector } from '@/store/hook'
import { deleteConversations } from '@/store/conversationSlice'
import useToast from '@/hooks/useToast'
interface ConversationModalProps { interface ConversationModalProps {
isOpen: boolean isOpen: boolean
...@@ -8,6 +11,9 @@ interface ConversationModalProps { ...@@ -8,6 +11,9 @@ interface ConversationModalProps {
} }
export const ConversationModal: React.FC<ConversationModalProps> = ({ isOpen, onClose }) => { export const ConversationModal: React.FC<ConversationModalProps> = ({ isOpen, onClose }) => {
const dispatch = useDispatch()
const showToast = useToast()
const tableColumns = [ const tableColumns = [
{ {
key: 'conversationTitle', key: 'conversationTitle',
...@@ -26,8 +32,17 @@ export const ConversationModal: React.FC<ConversationModalProps> = ({ isOpen, on ...@@ -26,8 +32,17 @@ export const ConversationModal: React.FC<ConversationModalProps> = ({ isOpen, on
setSelectedKeys(new Set([])) setSelectedKeys(new Set([]))
onClose() onClose()
} }
const handleDelete = () => { const handleDelete = async () => {
// console.log(selectedKeys, 'asd') const selectedKeysArray = Array.from(selectedKeys) as string[]
if (selectedKeysArray.length > 0) {
const resultAction = await dispatch(deleteConversations(selectedKeysArray))
if (deleteConversations.fulfilled.match(resultAction)) {
showToast('删除成功', 'success')
}
else {
showToast('删除失败', 'error')
}
}
} }
return ( return (
<Modal backdrop="blur" size="3xl" isOpen={isOpen} onClose={handleClose}> <Modal backdrop="blur" size="3xl" isOpen={isOpen} onClose={handleClose}>
...@@ -37,7 +52,11 @@ export const ConversationModal: React.FC<ConversationModalProps> = ({ isOpen, on ...@@ -37,7 +52,11 @@ export const ConversationModal: React.FC<ConversationModalProps> = ({ isOpen, on
<ModalHeader className="flex flex-col gap-1"> <ModalHeader className="flex flex-col gap-1">
<div> <div>
管理对话记录 管理对话记录
<span className="text-[#8D9795] text-[14px]">(共11条)</span> <span className="text-[#8D9795] text-[14px]">
(共
{allItems.length}
条)
</span>
</div> </div>
</ModalHeader> </ModalHeader>
<ModalBody className="text-[#27353C]"> <ModalBody className="text-[#27353C]">
...@@ -65,7 +84,7 @@ export const ConversationModal: React.FC<ConversationModalProps> = ({ isOpen, on ...@@ -65,7 +84,7 @@ export const ConversationModal: React.FC<ConversationModalProps> = ({ isOpen, on
<Button onPress={onClose}> <Button onPress={onClose}>
取消 取消
</Button> </Button>
<Button color="primary" onClick={handleDelete}> <Button isDisabled={[...selectedKeys].length === 0} color="primary" onClick={handleDelete}>
删除所选 删除所选
</Button> </Button>
</ModalFooter> </ModalFooter>
......
...@@ -2,7 +2,7 @@ import type { PayloadAction } from '@reduxjs/toolkit' ...@@ -2,7 +2,7 @@ import type { PayloadAction } from '@reduxjs/toolkit'
import { createAsyncThunk, createSlice } from '@reduxjs/toolkit' import { createAsyncThunk, createSlice } from '@reduxjs/toolkit'
import { processConversationData } from './conversationSlice.helper' import { processConversationData } from './conversationSlice.helper'
import type { Conversation, ConversationState } from '@/types/conversation' import type { Conversation, ConversationState } from '@/types/conversation'
import { fetchCreateConversation, fetchQueryUserConversationPage } from '@/api/conversation' import { fetchCreateConversation, fetchDeleteUserConversation, fetchQueryUserConversationPage } from '@/api/conversation'
const initialState: ConversationState = { const initialState: ConversationState = {
conversations: [], conversations: [],
...@@ -32,6 +32,29 @@ export const fetchConversations = createAsyncThunk( ...@@ -32,6 +32,29 @@ export const fetchConversations = createAsyncThunk(
}, },
) )
export const deleteConversations = createAsyncThunk<
boolean,
string[],
{ rejectValue: boolean }
>(
'conversation/deleteConversations',
async (conversationIds, { dispatch, rejectWithValue }) => {
try {
// 调用删除会话的 API,传入 ID 集合
await fetchDeleteUserConversation(conversationIds)
// 删除成功后,重新获取会话列表
await dispatch(fetchConversations())
return true // 删除成功
}
catch (error) {
console.error('Failed to delete conversations:', error)
return rejectWithValue(false) // 删除失败
}
},
)
export const createConversation = createAsyncThunk< export const createConversation = createAsyncThunk<
{ conversation: Conversation, shouldNavigate: boolean, shouldSendQuestion: string }, { conversation: Conversation, shouldNavigate: boolean, shouldSendQuestion: string },
{ conversationData: Partial<Conversation>, shouldNavigate: boolean, shouldSendQuestion: string }, { conversationData: Partial<Conversation>, shouldNavigate: boolean, shouldSendQuestion: string },
...@@ -102,6 +125,10 @@ const conversationSlice = createSlice({ ...@@ -102,6 +125,10 @@ const conversationSlice = createSlice({
state.isLoading = false state.isLoading = false
state.error = action.error.message || 'Failed to create conversation' state.error = action.error.message || 'Failed to create conversation'
}) })
.addCase(deleteConversations.fulfilled, () => {
})
.addCase(deleteConversations.rejected, () => {
})
}, },
}) })
......
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