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

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