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 3.0KB

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