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.4KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  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. messageType: action.messageType,
  28. message: action.message,
  29. privateMessage: action.privateMessage,
  30. recipient: action.recipient,
  31. timestamp: action.timestamp
  32. };
  33. // React native, unlike web, needs a reverse sorted message list.
  34. const messages = navigator.product === 'ReactNative'
  35. ? [
  36. newMessage,
  37. ...state.messages
  38. ]
  39. : [
  40. ...state.messages,
  41. newMessage
  42. ];
  43. return {
  44. ...state,
  45. lastReadMessage:
  46. action.hasRead ? newMessage : state.lastReadMessage,
  47. nbUnreadMessages: state.isPollsTabFocused ? state.nbUnreadMessages + 1 : state.nbUnreadMessages,
  48. messages
  49. };
  50. }
  51. case CLEAR_MESSAGES:
  52. return {
  53. ...state,
  54. lastReadMessage: undefined,
  55. messages: []
  56. };
  57. case SET_PRIVATE_MESSAGE_RECIPIENT:
  58. return {
  59. ...state,
  60. privateMessageRecipient: action.participant
  61. };
  62. case OPEN_CHAT:
  63. return {
  64. ...state,
  65. isOpen: true,
  66. privateMessageRecipient: action.participant
  67. };
  68. case CLOSE_CHAT:
  69. return {
  70. ...state,
  71. isOpen: false,
  72. lastReadMessage: state.messages[
  73. navigator.product === 'ReactNative' ? 0 : state.messages.length - 1],
  74. privateMessageRecipient: action.participant
  75. };
  76. case SET_IS_POLL_TAB_FOCUSED: {
  77. return {
  78. ...state,
  79. isPollsTabFocused: action.isPollsTabFocused,
  80. nbUnreadMessages: 0
  81. }; }
  82. }
  83. return state;
  84. });