1515
1616 <!-- 会话列表 -->
1717 <div class =" batch-body" >
18- <div class =" session-list" v-if =" sessions.length > 0" >
18+ <div v-if =" loading" class =" empty-state" >
19+ <t-loading />
20+ </div >
21+ <div class =" session-list" v-else-if =" sessions.length > 0" >
1922 <div
2023 class =" session-item"
2124 v-for =" item in sessions"
7477import { ref , computed , watch } from ' vue'
7578import { useI18n } from ' vue-i18n'
7679import { MessagePlugin , DialogPlugin } from ' tdesign-vue-next'
77- import { batchDelSessions , delSession } from ' @/api/chat/index'
80+ import { batchDelSessions , delSession , getSessionsList } from ' @/api/chat/index'
7881
7982const { t } = useI18n ()
8083
8184const props = defineProps <{
8285 visible: boolean
83- sessions: Array <{
84- id: string
85- title: string
86- created_at? : string
87- updated_at? : string
88- }>
8986}>()
9087
9188const emit = defineEmits <{
@@ -95,16 +92,50 @@ const emit = defineEmits<{
9592
9693const selectedIds = ref <string []>([])
9794const deleting = ref (false )
95+ const loading = ref (false )
96+ const sessions = ref <Array <{ id: string ; title: string ; created_at? : string ; updated_at? : string }>>([])
9897
9998const isAllSelected = computed (() =>
100- props . sessions .length > 0 && selectedIds .value .length === props . sessions .length
99+ sessions .value . length > 0 && selectedIds .value .length === sessions . value .length
101100)
102101const isIndeterminate = computed (() =>
103- selectedIds .value .length > 0 && selectedIds .value .length < props . sessions .length
102+ selectedIds .value .length > 0 && selectedIds .value .length < sessions . value .length
104103)
105104
105+ // 打开弹窗时拉取全量会话列表
106+ const fetchAllSessions = async () => {
107+ loading .value = true
108+ try {
109+ const allItems: any [] = []
110+ let page = 1
111+ const pageSize = 100
112+ let hasMore = true
113+ while (hasMore ) {
114+ const res: any = await getSessionsList (page , pageSize )
115+ const items = res ?.data ?.items || res ?.data || []
116+ allItems .push (... items )
117+ const total = res ?.data ?.total ?? items .length
118+ hasMore = allItems .length < total
119+ page ++
120+ }
121+ sessions .value = allItems .map ((s : any ) => ({
122+ id: s .id ,
123+ title: s .title ,
124+ created_at: s .created_at ,
125+ updated_at: s .updated_at ,
126+ }))
127+ } catch {
128+ sessions .value = []
129+ MessagePlugin .error (t (' batchManage.loadFailed' ) || ' Failed to load sessions' )
130+ }
131+ loading .value = false
132+ }
133+
106134watch (() => props .visible , (val ) => {
107- if (val ) selectedIds .value = []
135+ if (val ) {
136+ selectedIds .value = []
137+ fetchAllSessions ()
138+ }
108139})
109140
110141const toggleSelect = (id : string ) => {
@@ -117,7 +148,7 @@ const toggleSelect = (id: string) => {
117148}
118149
119150const toggleSelectAll = (checked : boolean ) => {
120- selectedIds .value = checked ? props . sessions .map (s => s .id ) : []
151+ selectedIds .value = checked ? sessions . value .map (s => s .id ) : []
121152}
122153
123154const formatTime = (dateStr ? : string ) => {
@@ -138,6 +169,8 @@ const handleDeleteSingle = (item: { id: string; title: string }) => {
138169 try {
139170 const res: any = await delSession (item .id )
140171 if (res && res .success === true ) {
172+ sessions .value = sessions .value .filter (s => s .id !== item .id )
173+ selectedIds .value = selectedIds .value .filter (id => id !== item .id )
141174 emit (' deleted' , [item .id ])
142175 MessagePlugin .success (t (' batchManage.deleteSuccess' ))
143176 } else {
@@ -168,6 +201,7 @@ const handleBatchDelete = () => {
168201 const ids = [... selectedIds .value ]
169202 const res: any = await batchDelSessions (ids )
170203 if (res && res .success === true ) {
204+ sessions .value = sessions .value .filter (s => ! ids .includes (s .id ))
171205 emit (' deleted' , ids )
172206 selectedIds .value = []
173207 MessagePlugin .success (t (' batchManage.deleteSuccess' ))
0 commit comments