@uimkit/uikit-react
Version:
<img style="width:64px" src="https://mgmt.uimkit.chat/media/img/avatar.png"/>
220 lines (217 loc) • 9.11 kB
JavaScript
import { __assign, __spreadArray } from 'tslib';
import '../../types/models.js';
import '../../types/events.js';
import { ConversationActionType } from './actions.js';
var createInitialState = function () { return ({}); };
var createMessageListReducer = function () { return function (state, action) {
if (state === void 0) { state = createInitialState(); }
switch (action.type) {
// 查询消息列表
case ConversationActionType.FETCHING_MESSAGE_LIST: {
return handleFetchingMessageList(state, action.payload);
}
// loadMore
case ConversationActionType.MESSAGE_LIST_LOAD_MORE_FINISHED: {
return handleMessageListLoadMoreFinished(state, action.conversation, action.payload);
}
// loadMoreNewer
case ConversationActionType.MESSAGE_LIST_LOAD_MORE_NEWER_FINISHED: {
return handleMessageListLoadMoreNewerFinished(state, action.payload);
}
// 查询消息列表错误
case ConversationActionType.ERROR_FETCHING_MESSAGE_LIST: {
return handleErrorFetchingMessageList(state, action.payload);
}
// 收到消息
case ConversationActionType.MESSAGE_RECEIVED: {
return handleMessageReceived(state, action.payload);
}
case ConversationActionType.MESSAGE_UPDATE: {
return handleMessageUpdate(state, action.payload);
}
// 删除消息
case ConversationActionType.MESSAGE_DELETED: {
return handleMessageDeleted(state, action.payload);
}
// 跳转到最新消息
case ConversationActionType.JumpToLatestMessage: {
return handleUpdateConversationState(state, action.conversation);
}
case ConversationActionType.JumpToMessageFinished: {
return handleUpdateConversationState(state, action.conversation, {
hasMoreNewer: action.hasMoreNewer,
highlightedMessageId: action.highlightedMessageId,
});
}
case ConversationActionType.ClearHighlightedMessage: {
return handleUpdateConversationState(state, action.conversation);
}
default:
return state;
}
}; };
/**
* 查询列表消息
*
* @param state
* @param payload
* @returns
*/
var handleFetchingMessageList = function (state, payload) {
var _a, _b;
var conversation_id = payload.conversation_id, direction = payload.direction;
var stateByConversation = state[conversation_id] || newState();
// 查询结果是从新到旧,查更新的是 before,查历史的是 after
if (direction === "after") {
return __assign(__assign({}, state), (_a = {}, _a[conversation_id] = __assign(__assign({}, stateByConversation), { nextCursor: payload.cursor, loadingMore: true }), _a));
}
else {
return __assign(__assign({}, state), (_b = {}, _b[conversation_id] = __assign(__assign({}, stateByConversation), { prevCursor: payload.cursor, loadingMoreNewer: true }), _b));
}
};
/**
* 查询消息列表结果
*
* @param state
* @param payload
* @returns
*/
var handleMessageListLoadMoreFinished = function (state, conversation, payload) {
var _a;
var _incomingMessages = payload.messages, hasMore = payload.hasMore, nextCursor = payload.nextCursor;
var stateByConversation = state[conversation.id] || newState();
var messages = stateByConversation.messages;
var incomingMessages = _incomingMessages.sort(function (a, b) { return a.sent_at - b.sent_at; });
var newMessages;
if (incomingMessages.length > 0) {
newMessages = __spreadArray(__spreadArray([], incomingMessages, true), messages, true);
}
else {
newMessages = messages;
}
// 历史消息
return __assign(__assign({}, state), (_a = {}, _a[conversation.id] = __assign(__assign({}, stateByConversation), { messages: newMessages, nextCursor: nextCursor, hasMore: hasMore, loadingMore: false, suppressAutoscroll: false }), _a));
};
/**
* @param state
* @param payload
* @returns
*/
var handleMessageListLoadMoreNewerFinished = function (state, payload) {
var _a;
var _b;
var request = payload.request, response = payload.response;
var conversation_id = request.conversation_id;
var data = response.data, extra = response.extra;
var stateByConversation = state[conversation_id] || newState();
var messages = stateByConversation.messages;
var incomingMessages = data.sort(function (a, b) { return a.sent_at - b.sent_at; });
var newMessages;
if (incomingMessages.length > 0) {
newMessages = __spreadArray(__spreadArray([], messages, true), incomingMessages, true);
}
else {
newMessages = messages;
}
// 查询新消息
return __assign(__assign({}, state), (_a = {}, _a[conversation_id] = __assign(__assign({}, stateByConversation), { messages: newMessages, prevCursor: extra.start_cursor, nextCursor: (_b = stateByConversation.nextCursor) !== null && _b !== void 0 ? _b : extra.end_cursor, hasMoreNewer: false, loadingMoreNewer: false, suppressAutoscroll: false }), _a));
};
/**
* 查询消息列表错误
*
* @param state
* @param payload
* @returns
*/
var handleErrorFetchingMessageList = function (state, payload) {
var _a, _b;
var request = payload.request, error = payload.error;
var conversation_id = request.conversation_id, direction = request.direction;
var stateByConversation = state[conversation_id] || newState();
// 查询结果是从新到旧,查更新的是 before,查历史的是 after
if (direction === "after") {
return __assign(__assign({}, state), (_a = {}, _a[conversation_id] = __assign(__assign({}, stateByConversation), { loadingMore: false, error: error }), _a));
}
else {
return __assign(__assign({}, state), (_b = {}, _b[conversation_id] = __assign(__assign({}, stateByConversation), { loadingMoreNewer: false, error: error }), _b));
}
};
/**
* 收到消息
*
* @param state
* @param payload
* @returns
*/
var handleMessageReceived = function (state, payload) {
var _a;
var conversation_id = payload.conversation_id;
var stateByConversation = state[conversation_id] || newState();
var messages = stateByConversation.messages;
// 存在就替换,不存在就追加
var idx = messages.findIndex(function (it) { return it.id === payload.id; });
if (idx >= 0) {
messages[idx] = __assign(__assign({}, messages[idx]), payload);
}
else {
messages.push(payload);
}
// 前端是从旧到新
messages.sort(function (a, b) { return a.sent_at - b.sent_at; });
return __assign(__assign({}, state), (_a = {}, _a[conversation_id] = __assign(__assign({}, stateByConversation), { messages: __spreadArray([], messages, true) }), _a));
};
var handleMessageUpdate = function (state, payload) {
var _a;
var _b;
var conversation_id = payload.conversation_id;
var stateByConversation = state[conversation_id] || newState();
var messages = __spreadArray([], ((_b = stateByConversation.messages) !== null && _b !== void 0 ? _b : []), true);
// 存在就替换,不存在就追加
var idx = messages.findIndex(function (it) { return it.id === payload.id; });
if (idx >= 0) {
messages[idx] = __assign(__assign({}, messages[idx]), payload);
}
else {
messages.push(__assign({}, payload));
}
return __assign(__assign({}, state), (_a = {}, _a[conversation_id] = __assign(__assign({}, stateByConversation), { messages: messages, suppressAutoscroll: false }), _a));
};
/**
* 删除消息
*
* @param state
* @param payload
*/
var handleMessageDeleted = function (state, payload) {
var _a;
var conversation_id = payload.conversation_id;
var stateByConversation = state[conversation_id] || newState();
var messages = stateByConversation.messages;
// 存在就替换,不存在就追加
var idx = messages.findIndex(function (it) { return it.id === payload.id; });
if (idx < 0) {
return state;
}
messages.splice(idx, 1);
return __assign(__assign({}, state), (_a = {}, _a[conversation_id] = __assign(__assign({}, stateByConversation), { messages: __spreadArray([], messages, true) }), _a));
};
var handleUpdateConversationState = function (state, conversation, payload) {
var _a;
var id = conversation.id;
var stateByConversation = state[id] || newState();
return __assign(__assign({}, state), (_a = {}, _a[id] = __assign(__assign({}, stateByConversation), { hasMoreNewer: false, highlightedMessageId: undefined, suppressAutoscroll: false }), _a));
};
var newState = function () { return ({
prevCursor: null,
hasMoreNewer: false,
loadingMoreNewer: false,
nextCursor: null,
hasMore: true,
loadingMore: false,
messages: [],
error: null,
suppressAutoscroll: false,
}); };
var MessageListReducer = createMessageListReducer();
export { MessageListReducer, createMessageListReducer, newState };
//# sourceMappingURL=reducers.js.map