123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384 |
- // @flow
-
- import { ReducerRegistry } from '../base/redux';
-
- import {
- ADD_MESSAGE,
- CLEAR_MESSAGES,
- CLOSE_CHAT,
- OPEN_CHAT,
- SET_PRIVATE_MESSAGE_RECIPIENT
- } from './actionTypes';
-
- const DEFAULT_STATE = {
- isOpen: false,
- lastReadMessage: undefined,
- messages: [],
- privateMessageRecipient: undefined
- };
-
- ReducerRegistry.register('features/chat', (state = DEFAULT_STATE, action) => {
- switch (action.type) {
- case ADD_MESSAGE: {
- const newMessage = {
- displayName: action.displayName,
- error: action.error,
- id: action.id,
- messageType: action.messageType,
- message: action.message,
- privateMessage: action.privateMessage,
- recipient: action.recipient,
- timestamp: action.timestamp
- };
-
- // React native, unlike web, needs a reverse sorted message list.
- const messages = navigator.product === 'ReactNative'
- ? [
- newMessage,
- ...state.messages
- ]
- : [
- ...state.messages,
- newMessage
- ];
-
- return {
- ...state,
- lastReadMessage:
- action.hasRead ? newMessage : state.lastReadMessage,
- messages
- };
- }
-
- case CLEAR_MESSAGES:
- return {
- ...state,
- lastReadMessage: undefined,
- messages: []
- };
-
- case SET_PRIVATE_MESSAGE_RECIPIENT:
- return {
- ...state,
- privateMessageRecipient: action.participant
- };
-
- case OPEN_CHAT:
- return {
- ...state,
- isOpen: true,
- privateMessageRecipient: action.participant
- };
-
- case CLOSE_CHAT:
- return {
- ...state,
- isOpen: false,
- lastReadMessage: state.messages[
- navigator.product === 'ReactNative' ? 0 : state.messages.length - 1],
- privateMessageRecipient: action.participant
- };
- }
-
- return state;
- });
|