UNPKG

@uimkit/uikit-react

Version:

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

226 lines (221 loc) 9.62 kB
'use strict'; Object.defineProperty(exports, '__esModule', { value: true }); var tslib = require('tslib'); require('../../types/models.js'); require('../../types/events.js'); var actions = require('./actions.js'); var createInitialState = function () { return ({}); }; var createMessageListReducer = function () { return function (state, action) { if (state === void 0) { state = createInitialState(); } switch (action.type) { // 查询消息列表 case actions.ConversationActionType.FETCHING_MESSAGE_LIST: { return handleFetchingMessageList(state, action.payload); } // loadMore case actions.ConversationActionType.MESSAGE_LIST_LOAD_MORE_FINISHED: { return handleMessageListLoadMoreFinished(state, action.conversation, action.payload); } // loadMoreNewer case actions.ConversationActionType.MESSAGE_LIST_LOAD_MORE_NEWER_FINISHED: { return handleMessageListLoadMoreNewerFinished(state, action.payload); } // 查询消息列表错误 case actions.ConversationActionType.ERROR_FETCHING_MESSAGE_LIST: { return handleErrorFetchingMessageList(state, action.payload); } // 收到消息 case actions.ConversationActionType.MESSAGE_RECEIVED: { return handleMessageReceived(state, action.payload); } case actions.ConversationActionType.MESSAGE_UPDATE: { return handleMessageUpdate(state, action.payload); } // 删除消息 case actions.ConversationActionType.MESSAGE_DELETED: { return handleMessageDeleted(state, action.payload); } // 跳转到最新消息 case actions.ConversationActionType.JumpToLatestMessage: { return handleUpdateConversationState(state, action.conversation); } case actions.ConversationActionType.JumpToMessageFinished: { return handleUpdateConversationState(state, action.conversation, { hasMoreNewer: action.hasMoreNewer, highlightedMessageId: action.highlightedMessageId, }); } case actions.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 tslib.__assign(tslib.__assign({}, state), (_a = {}, _a[conversation_id] = tslib.__assign(tslib.__assign({}, stateByConversation), { nextCursor: payload.cursor, loadingMore: true }), _a)); } else { return tslib.__assign(tslib.__assign({}, state), (_b = {}, _b[conversation_id] = tslib.__assign(tslib.__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 = tslib.__spreadArray(tslib.__spreadArray([], incomingMessages, true), messages, true); } else { newMessages = messages; } // 历史消息 return tslib.__assign(tslib.__assign({}, state), (_a = {}, _a[conversation.id] = tslib.__assign(tslib.__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 = tslib.__spreadArray(tslib.__spreadArray([], messages, true), incomingMessages, true); } else { newMessages = messages; } // 查询新消息 return tslib.__assign(tslib.__assign({}, state), (_a = {}, _a[conversation_id] = tslib.__assign(tslib.__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 tslib.__assign(tslib.__assign({}, state), (_a = {}, _a[conversation_id] = tslib.__assign(tslib.__assign({}, stateByConversation), { loadingMore: false, error: error }), _a)); } else { return tslib.__assign(tslib.__assign({}, state), (_b = {}, _b[conversation_id] = tslib.__assign(tslib.__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] = tslib.__assign(tslib.__assign({}, messages[idx]), payload); } else { messages.push(payload); } // 前端是从旧到新 messages.sort(function (a, b) { return a.sent_at - b.sent_at; }); return tslib.__assign(tslib.__assign({}, state), (_a = {}, _a[conversation_id] = tslib.__assign(tslib.__assign({}, stateByConversation), { messages: tslib.__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 = tslib.__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] = tslib.__assign(tslib.__assign({}, messages[idx]), payload); } else { messages.push(tslib.__assign({}, payload)); } return tslib.__assign(tslib.__assign({}, state), (_a = {}, _a[conversation_id] = tslib.__assign(tslib.__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 tslib.__assign(tslib.__assign({}, state), (_a = {}, _a[conversation_id] = tslib.__assign(tslib.__assign({}, stateByConversation), { messages: tslib.__spreadArray([], messages, true) }), _a)); }; var handleUpdateConversationState = function (state, conversation, payload) { var _a; var id = conversation.id; var stateByConversation = state[id] || newState(); return tslib.__assign(tslib.__assign({}, state), (_a = {}, _a[id] = tslib.__assign(tslib.__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(); exports.MessageListReducer = MessageListReducer; exports.createMessageListReducer = createMessageListReducer; exports.newState = newState; //# sourceMappingURL=reducers.js.map