chatReducer.js 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. export const actionSetDropMedia = (id, data) => ({type: 'SETMEDIA', data, id});
  2. export const actionDeleteDropMedia = (id) => ({type: 'CLEARMEDIA', id});
  3. export const actionDeleteOneMediaFile = (id, mediaKey) => ({type: 'DELETEMEDIA', id, mediaKey});
  4. export const actionChangeFile = (id, data, mediaKey) => ({type: 'CHANGE', id, data, mediaKey});
  5. export const actionSetInputMessageValue = (id, data, name) => ({type: 'SETINPUTMESSAGE', id, data, name});
  6. export const actionAddDraftMessage = (id, data) => ({type: 'ADDMESSAGEDRAFT', id, data});
  7. export const actionSetMessageEditor = (id, data) => ({type: 'MESEDITOR', id, data})
  8. export function chatReducer (state={}, {type, data, id, mediaKey, name}){
  9. if(type === 'CHATS'){
  10. let chats ////new chats
  11. for(const value of data){
  12. chats = {
  13. ...chats,
  14. [value._id]:{...value}
  15. }
  16. }
  17. let newState
  18. for (let prop in chats){
  19. newState = {
  20. ...state, ...newState, [prop] : {...state[prop], ...chats[prop]}
  21. }
  22. }
  23. let arr = Object.entries(newState || {});
  24. return {
  25. ...Object.fromEntries(arr.sort((a,b) => a[1].lastModified > b[1].lastModified ? -1 : 1))
  26. }
  27. }
  28. if(type === 'MSG'){
  29. let newMessages
  30. for(const value of data){
  31. newMessages = {
  32. ...newMessages,
  33. [value._id]:{...value}
  34. }
  35. }
  36. return {
  37. ...state, [id] : {...(state[id] || {_id: id, title: "loading"}),
  38. messages: Object.fromEntries(Object.entries({...(state[id]?.messages || {}), ...newMessages}).sort((a,b) => a[0] < b[0] ? 1 : -1))}
  39. }
  40. }
  41. if(type === 'LEFTCHAT'){
  42. let newState = {...state};
  43. let arr = Object.entries(newState);
  44. return {
  45. ...Object.fromEntries(arr.filter((chat) => chat[0] != data._id))
  46. }
  47. }
  48. if (type === 'SETMEDIA'){
  49. return {
  50. ...state, [id] : {...state[id], draft : {...state[id].draft, media: [...state[id].draft?.media || [], ...data]}} //[...state.id || [], ...value]
  51. }
  52. }
  53. if (type === 'CLEARMEDIA'){
  54. return {
  55. ...state, [id] : {...state[id], draft : {...state[id].draft, media: []}}
  56. }
  57. }
  58. if (type === 'DELETEMEDIA'){
  59. console.log(id, mediaKey)
  60. return {
  61. ...state, [id] : {...state[id], draft : {...state[id].draft, media: state[id].draft.media.filter(item => item.uploadDate != mediaKey )}}
  62. }
  63. }
  64. if (type === 'CHANGE'){
  65. let newArray = [...state[id].draft.media];
  66. let index = newArray.findIndex(item => item.uploadDate === mediaKey)
  67. newArray.splice(index, 1, data[0]);
  68. return {
  69. ...state, [id] : {...state[id], draft : {...state[id].draft, media: newArray}}
  70. }
  71. }
  72. if (type === 'SETINPUTMESSAGE'){
  73. return{
  74. ...state, [id]: {...state[id], draft: {...state[id].draft, [name]: {...(state[id]?.draft?.[name] || {}), value: data}}}
  75. }
  76. }
  77. // if (type === 'CLEARINPUTMESSAGE'){
  78. // return {
  79. // ...state, [id]: {...state[id], draft: {...state[id].draft, [name]: ''}}
  80. // }
  81. // }
  82. if (type === 'ADDMESSAGEDRAFT'){
  83. return {
  84. ...state, [id]: {...state[id], draft: {...state[id]?.draft, mainInputValue: {...(state[id]?.draft?.mainInputValue || {}), message: data}}}
  85. }
  86. }
  87. if (type === 'MESEDITOR'){
  88. return{
  89. ...state, [id]: {...state[id], draft: {...state[id]?.draft, messageEditor: data}}
  90. }
  91. }
  92. return state
  93. }