您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

reducer.js 2.0KB

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