123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162 |
- // @flow
-
- import { v4 as uuidv4 } from 'uuid';
-
- import { ReducerRegistry } from '../base/redux';
-
- import {
- ADD_MESSAGE,
- CLEAR_MESSAGES,
- CLOSE_CHAT,
- EDIT_MESSAGE,
- OPEN_CHAT,
- SET_PRIVATE_MESSAGE_RECIPIENT,
- SET_IS_POLL_TAB_FOCUSED,
- SET_LOBBY_CHAT_RECIPIENT,
- SET_LOBBY_CHAT_ACTIVE_STATE,
- REMOVE_LOBBY_CHAT_PARTICIPANT
- } from './actionTypes';
-
- const DEFAULT_STATE = {
- isOpen: false,
- isPollsTabFocused: false,
- lastReadMessage: undefined,
- lastReadPoll: undefined,
- messages: [],
- nbUnreadMessages: 0,
- privateMessageRecipient: undefined,
- lobbyMessageRecipient: undefined,
- isLobbyChatActive: false
- };
-
- 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,
- isReaction: action.isReaction,
- messageId: uuidv4(),
- messageType: action.messageType,
- message: action.message,
- privateMessage: action.privateMessage,
- lobbyChat: action.lobbyChat,
- 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,
- nbUnreadMessages: state.isPollsTabFocused ? state.nbUnreadMessages + 1 : state.nbUnreadMessages,
- messages
- };
- }
-
- case CLEAR_MESSAGES:
- return {
- ...state,
- lastReadMessage: undefined,
- messages: []
- };
-
- case EDIT_MESSAGE: {
- let found = false;
- const newMessage = action.message;
- const messages = state.messages.map(m => {
- if (m.messageId === newMessage.messageId) {
- found = true;
-
- return newMessage;
- }
-
- return m;
- });
-
- // no change
- if (!found) {
- return state;
- }
-
- return {
- ...state,
- 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,
- isLobbyChatActive: false
- };
-
- case SET_IS_POLL_TAB_FOCUSED: {
- return {
- ...state,
- isPollsTabFocused: action.isPollsTabFocused,
- nbUnreadMessages: 0
- }; }
-
- case SET_LOBBY_CHAT_RECIPIENT:
- return {
- ...state,
- isLobbyChatActive: true,
- lobbyMessageRecipient: action.participant,
- privateMessageRecipient: undefined,
- isOpen: action.open
- };
- case SET_LOBBY_CHAT_ACTIVE_STATE:
- return {
- ...state,
- isLobbyChatActive: action.payload,
- isOpen: action.payload || state.isOpen,
- privateMessageRecipient: undefined
- };
- case REMOVE_LOBBY_CHAT_PARTICIPANT:
- return {
- ...state,
- messages: state.messages.filter(m => {
- if (action.removeLobbyChatMessages) {
- return !m.lobbyChat;
- }
-
- return true;
- }),
- isOpen: state.isOpen && state.isLobbyChatActive ? false : state.isOpen,
- isLobbyChatActive: false,
- lobbyMessageRecipient: undefined
- };
- }
-
- return state;
- });
|