|
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); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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, |
|
); |
|
|
|
|
|
|
|
|
|
|
|
|
|
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; |
|
|