Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.

reducer.js 2.4KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. // @flow
  2. import { SET_ACTIVE_MODAL_ID } from '../base/modal';
  3. import { ReducerRegistry } from '../base/redux';
  4. import {
  5. ADD_MESSAGE,
  6. CLEAR_MESSAGES,
  7. SET_PRIVATE_MESSAGE_RECIPIENT,
  8. TOGGLE_CHAT
  9. } from './actionTypes';
  10. import { CHAT_VIEW_MODAL_ID } from './constants';
  11. const DEFAULT_STATE = {
  12. isOpen: false,
  13. lastReadMessage: undefined,
  14. messages: [],
  15. privateMessageRecipient: undefined
  16. };
  17. ReducerRegistry.register('features/chat', (state = DEFAULT_STATE, action) => {
  18. switch (action.type) {
  19. case ADD_MESSAGE: {
  20. const newMessage = {
  21. displayName: action.displayName,
  22. error: action.error,
  23. id: action.id,
  24. messageType: action.messageType,
  25. message: action.message,
  26. privateMessage: action.privateMessage,
  27. recipient: action.recipient,
  28. timestamp: action.timestamp
  29. };
  30. // React native, unlike web, needs a reverse sorted message list.
  31. const messages = navigator.product === 'ReactNative'
  32. ? [
  33. newMessage,
  34. ...state.messages
  35. ]
  36. : [
  37. ...state.messages,
  38. newMessage
  39. ];
  40. return {
  41. ...state,
  42. lastReadMessage:
  43. action.hasRead ? newMessage : state.lastReadMessage,
  44. messages
  45. };
  46. }
  47. case CLEAR_MESSAGES:
  48. return {
  49. ...state,
  50. lastReadMessage: undefined,
  51. messages: []
  52. };
  53. case SET_ACTIVE_MODAL_ID:
  54. if (action.activeModalId === CHAT_VIEW_MODAL_ID) {
  55. return updateChatState(state);
  56. }
  57. break;
  58. case SET_PRIVATE_MESSAGE_RECIPIENT:
  59. return {
  60. ...state,
  61. isOpen: Boolean(action.participant) || state.isOpen,
  62. privateMessageRecipient: action.participant
  63. };
  64. case TOGGLE_CHAT:
  65. return updateChatState(state);
  66. }
  67. return state;
  68. });
  69. /**
  70. * Updates the chat status on opening the chat view.
  71. *
  72. * @param {Object} state - The Redux state of the feature.
  73. * @returns {Object}
  74. */
  75. function updateChatState(state) {
  76. return {
  77. ...state,
  78. isOpen: !state.isOpen,
  79. lastReadMessage: state.messages[
  80. navigator.product === 'ReactNative' ? 0 : state.messages.length - 1],
  81. privateMessageRecipient: state.isOpen ? undefined : state.privateMessageRecipient
  82. };
  83. }