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.

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