UNPKG

@uimkit/uikit-react

Version:

<img style="width:64px" src="https://mgmt.uimkit.chat/media/img/avatar.png"/>

220 lines (217 loc) 9.11 kB
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