Spaces:
Paused
Paused
import { IConversation, IDialog, Message } from '@/interfaces/database/chat'; | |
import i18n from '@/locales/config'; | |
import chatService from '@/services/chat-service'; | |
import { message } from 'antd'; | |
import { DvaModel } from 'umi'; | |
import { v4 as uuid } from 'uuid'; | |
import { IClientConversation, IMessage } from './interface'; | |
import { getDocumentIdsFromConversionReference } from './utils'; | |
export interface ChatModelState { | |
name: string; | |
dialogList: IDialog[]; | |
currentDialog: IDialog; | |
conversationList: IConversation[]; | |
currentConversation: IClientConversation; | |
} | |
const model: DvaModel<ChatModelState> = { | |
namespace: 'chatModel', | |
state: { | |
name: 'kate', | |
dialogList: [], | |
currentDialog: <IDialog>{}, | |
conversationList: [], | |
currentConversation: {} as IClientConversation, | |
}, | |
reducers: { | |
save(state, action) { | |
return { | |
...state, | |
...action.payload, | |
}; | |
}, | |
setDialogList(state, { payload }) { | |
return { | |
...state, | |
dialogList: payload, | |
}; | |
}, | |
setCurrentDialog(state, { payload }) { | |
return { | |
...state, | |
currentDialog: payload, | |
}; | |
}, | |
setConversationList(state, { payload }) { | |
return { | |
...state, | |
conversationList: payload, | |
}; | |
}, | |
setCurrentConversation(state, { payload }) { | |
const messageList = | |
payload?.message?.map((x: Message | IMessage) => ({ | |
...x, | |
id: 'id' in x ? x.id : uuid(), | |
})) ?? []; | |
return { | |
...state, | |
currentConversation: { ...payload, message: messageList }, | |
}; | |
}, | |
}, | |
effects: { | |
*getDialog({ payload }, { call, put }) { | |
const needToBeSaved = | |
payload.needToBeSaved === undefined ? true : payload.needToBeSaved; | |
const { data } = yield call(chatService.getDialog, { | |
dialog_id: payload.dialog_id, | |
}); | |
if (data.retcode === 0 && needToBeSaved) { | |
yield put({ type: 'setCurrentDialog', payload: data.data }); | |
} | |
return data; | |
}, | |
*setDialog({ payload }, { call, put }) { | |
const { data } = yield call(chatService.setDialog, payload); | |
if (data.retcode === 0) { | |
yield put({ type: 'listDialog' }); | |
message.success( | |
i18n.t(`message.${payload.dialog_id ? 'modified' : 'created'}`), | |
); | |
} | |
return data.retcode; | |
}, | |
*removeDialog({ payload }, { call, put }) { | |
const { data } = yield call(chatService.removeDialog, payload); | |
if (data.retcode === 0) { | |
yield put({ type: 'listDialog' }); | |
message.success(i18n.t('message.deleted')); | |
} | |
return data.retcode; | |
}, | |
*listDialog({ payload }, { call, put }) { | |
const { data } = yield call(chatService.listDialog, payload); | |
if (data.retcode === 0) { | |
yield put({ type: 'setDialogList', payload: data.data }); | |
} | |
return data; | |
}, | |
*listConversation({ payload }, { call, put }) { | |
const { data } = yield call(chatService.listConversation, payload); | |
if (data.retcode === 0) { | |
yield put({ type: 'setConversationList', payload: data.data }); | |
} | |
return data.retcode; | |
}, | |
*getConversation({ payload }, { call, put }) { | |
const needToBeSaved = | |
payload.needToBeSaved === undefined ? true : payload.needToBeSaved; | |
const { data } = yield call(chatService.getConversation, { | |
conversation_id: payload.conversation_id, | |
}); | |
if (data.retcode === 0 && needToBeSaved) { | |
yield put({ | |
type: 'kFModel/fetch_document_thumbnails', | |
payload: { | |
doc_ids: getDocumentIdsFromConversionReference(data.data), | |
}, | |
}); | |
yield put({ type: 'setCurrentConversation', payload: data.data }); | |
} | |
return data; | |
}, | |
*setConversation({ payload }, { call, put }) { | |
const { data } = yield call(chatService.setConversation, payload); | |
if (data.retcode === 0) { | |
yield put({ | |
type: 'listConversation', | |
payload: { | |
dialog_id: data.data.dialog_id, | |
}, | |
}); | |
} | |
return data; | |
}, | |
*completeConversation({ payload }, { call }) { | |
const { data } = yield call(chatService.completeConversation, payload); | |
// if (data.retcode === 0) { | |
// yield put({ | |
// type: 'getConversation', | |
// payload: { | |
// conversation_id: payload.conversation_id, | |
// }, | |
// }); | |
// } | |
return data.retcode; | |
}, | |
*removeConversation({ payload }, { call, put }) { | |
const { data } = yield call(chatService.removeConversation, { | |
conversation_ids: payload.conversation_ids, | |
}); | |
if (data.retcode === 0) { | |
yield put({ | |
type: 'listConversation', | |
payload: { dialog_id: payload.dialog_id }, | |
}); | |
message.success(i18n.t('message.deleted')); | |
} | |
return data.retcode; | |
}, | |
*createExternalConversation({ payload }, { call, put }) { | |
const { data } = yield call( | |
chatService.createExternalConversation, | |
payload, | |
); | |
// if (data.retcode === 0) { | |
// yield put({ | |
// type: 'getExternalConversation', | |
// payload: data.data.id, | |
// }); | |
// } | |
return data; | |
}, | |
*getExternalConversation({ payload }, { call }) { | |
const { data } = yield call( | |
chatService.getExternalConversation, | |
null, | |
payload, | |
); | |
return data; | |
}, | |
*completeExternalConversation({ payload }, { call }) { | |
const { data } = yield call( | |
chatService.completeExternalConversation, | |
payload, | |
); | |
return data.retcode; | |
}, | |
}, | |
}; | |
export default model; | |