@botonic/react
Version:
Build Chatbots using React
60 lines • 2.88 kB
JavaScript
import { WebchatAction } from './actions';
export const messagesReducer = (state, action) => {
switch (action.type) {
case WebchatAction.ADD_MESSAGE:
return addMessageReducer(state, action);
case WebchatAction.ADD_MESSAGE_COMPONENT:
return addMessageComponent(state, action);
case WebchatAction.UPDATE_MESSAGE:
return updateMessageReducer(state, action);
case WebchatAction.UPDATE_REPLIES:
return Object.assign(Object.assign({}, state), { replies: action.payload });
case WebchatAction.CLEAR_MESSAGES:
return Object.assign(Object.assign({}, state), { messagesJSON: [], messagesComponents: [] });
case WebchatAction.UPDATE_LAST_MESSAGE_DATE:
return Object.assign(Object.assign({}, state), { lastMessageUpdate: action.payload });
default:
throw new Error();
}
};
function addMessageComponent(state, action) {
var _a;
const messageComponent = action.payload;
const isUnreadMessage = !state.isWebchatOpen && ((_a = messageComponent.props) === null || _a === void 0 ? void 0 : _a.ack) !== 1;
const unreadMessages = isUnreadMessage
? state.unreadMessages + 1
: state.unreadMessages;
return Object.assign(Object.assign({}, state), { messagesComponents: [...(state.messagesComponents || []), messageComponent], unreadMessages });
}
function updateMessageReducer(state, action) {
const msgIndex = state.messagesJSON.map(m => m.id).indexOf(action.payload.id);
if (msgIndex > -1) {
const msgComponent = state.messagesComponents[msgIndex];
let updatedMessageComponents = {};
if (msgComponent) {
const updatedMsgComponent = Object.assign(Object.assign({}, msgComponent), {
props: Object.assign(Object.assign({}, msgComponent.props), { ack: action.payload.ack }),
});
updatedMessageComponents = {
messagesComponents: [
...state.messagesComponents.slice(0, msgIndex),
Object.assign({}, updatedMsgComponent),
...state.messagesComponents.slice(msgIndex + 1),
],
};
}
return Object.assign(Object.assign(Object.assign({}, state), { messagesJSON: [
...state.messagesJSON.slice(0, msgIndex),
Object.assign({}, action.payload),
...state.messagesJSON.slice(msgIndex + 1),
] }), updatedMessageComponents);
}
return state;
}
function addMessageReducer(state, action) {
if (state.messagesJSON &&
state.messagesJSON.find(m => m.id === action.payload.id))
return state;
return Object.assign(Object.assign({}, state), { messagesJSON: [...(state.messagesJSON || []), action.payload] });
}
//# sourceMappingURL=messages-reducer.js.map