You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

reducer.js 2.5KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. // @flow
  2. import { ReducerRegistry } from '../base/redux';
  3. import {
  4. ADD_MESSAGE,
  5. CLEAR_MESSAGES,
  6. CLOSE_CHAT,
  7. OPEN_CHAT,
  8. SET_PRIVATE_MESSAGE_RECIPIENT,
  9. SET_IS_POLL_TAB_FOCUSED
  10. } from './actionTypes';
  11. const DEFAULT_STATE = {
  12. isOpen: false,
  13. isPollsTabFocused: false,
  14. lastReadMessage: undefined,
  15. lastReadPoll: undefined,
  16. messages: [],
  17. nbUnreadMessages: 0,
  18. privateMessageRecipient: undefined
  19. };
  20. ReducerRegistry.register('features/chat', (state = DEFAULT_STATE, action) => {
  21. switch (action.type) {
  22. case ADD_MESSAGE: {
  23. const newMessage = {
  24. displayName: action.displayName,
  25. error: action.error,
  26. id: action.id,
  27. isReaction: action.isReaction,
  28. messageType: action.messageType,
  29. message: action.message,
  30. privateMessage: action.privateMessage,
  31. recipient: action.recipient,
  32. timestamp: action.timestamp
  33. };
  34. // React native, unlike web, needs a reverse sorted message list.
  35. const messages = navigator.product === 'ReactNative'
  36. ? [
  37. newMessage,
  38. ...state.messages
  39. ]
  40. : [
  41. ...state.messages,
  42. newMessage
  43. ];
  44. return {
  45. ...state,
  46. lastReadMessage:
  47. action.hasRead ? newMessage : state.lastReadMessage,
  48. nbUnreadMessages: state.isPollsTabFocused ? state.nbUnreadMessages + 1 : state.nbUnreadMessages,
  49. messages
  50. };
  51. }
  52. case CLEAR_MESSAGES:
  53. return {
  54. ...state,
  55. lastReadMessage: undefined,
  56. messages: []
  57. };
  58. case SET_PRIVATE_MESSAGE_RECIPIENT:
  59. return {
  60. ...state,
  61. privateMessageRecipient: action.participant
  62. };
  63. case OPEN_CHAT:
  64. return {
  65. ...state,
  66. isOpen: true,
  67. privateMessageRecipient: action.participant
  68. };
  69. case CLOSE_CHAT:
  70. return {
  71. ...state,
  72. isOpen: false,
  73. lastReadMessage: state.messages[
  74. navigator.product === 'ReactNative' ? 0 : state.messages.length - 1],
  75. privateMessageRecipient: action.participant
  76. };
  77. case SET_IS_POLL_TAB_FOCUSED: {
  78. return {
  79. ...state,
  80. isPollsTabFocused: action.isPollsTabFocused,
  81. nbUnreadMessages: 0
  82. }; }
  83. }
  84. return state;
  85. });