messageReducer.js 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. import { createSlice} from '@reduxjs/toolkit';
  2. import axios from 'axios';
  3. import { createAsyncThunk } from '@reduxjs/toolkit';
  4. const initialState = {
  5. message:'',
  6. editMessage: '',
  7. messageId: '',
  8. files: [],
  9. isLoading: false,
  10. loadingPercentage: 0,
  11. ref: null
  12. }
  13. const POST_FILES_URL = `http://localhost:5000/files`;
  14. export const sendMessageToSocket = (state, data) => {
  15. if (!!state.message && state.message.length < 200) { //remove to other file
  16. data.socket.emit('message', {...data.user, message: state.message});
  17. }
  18. };
  19. export const sendPrivateMessageToSocket = (state, data) => {
  20. if (!!state.message && state.message.length < 200) { //remove to other file
  21. //need to check and fix data from dispatch
  22. // data.socket.emit("private message", {
  23. // fromUser: data.user,
  24. // message: data.message.message,
  25. // to: data.chatId,
  26. // toUser:data.toUser
  27. // })
  28. // data.socket.emit('message', {...data.user, message: state.message});
  29. }
  30. };
  31. export const deleteMessageHandler = (state, data) => {
  32. data.socket.emit('deleteMessage', {messageId: data.messageId, token: data.socket.auth.token});
  33. };
  34. export const editMessageHandler = (state, data) => {
  35. if(data.socket){
  36. data.socket.emit('editmessage', {messageNewText: data.editMessage.message, messageId: data.messageId, token: data.socket.auth.token}); //add backend functional later find by id and edit
  37. }
  38. };
  39. export const fileMessage = createAsyncThunk(
  40. 'messageReducer/fileMessageStatus',
  41. async (payload) => {
  42. const {files, axiosConfig} = payload;
  43. const token = localStorage.getItem('token')
  44. try {
  45. const formData = new FormData();
  46. if(files?.length) {
  47. for (let i = 0; i < files?.length; i++) {
  48. formData.append('files', files[i])
  49. }
  50. } else {
  51. formData.append('files', files)
  52. }
  53. formData.append('token', token)
  54. const response = await axios.post(POST_FILES_URL, formData,axiosConfig);
  55. return await response;
  56. } catch (err) {
  57. console.log('Error messageReducer thunk', err)
  58. return err?.message
  59. }
  60. })
  61. const messageReducerSlice = createSlice({
  62. name: 'messageReducer',
  63. initialState,
  64. reducers: {
  65. storeMessage: (state, action) => {state.message = action.payload.message},
  66. editMessage: (state, action) => {
  67. editMessageHandler(state, action.payload)
  68. state.editMessage = action.payload.editMessage;
  69. state.messageId = action.payload.messageId;
  70. state.ref = action.payload.ref;
  71. },
  72. deleteMessage: (state, action) => {
  73. deleteMessageHandler(state, action.payload)
  74. },
  75. sendMessage: (state, action) => sendMessageToSocket(state, action.payload),
  76. sendPrivateMessage:(state, action) => sendPrivateMessageToSocket(state, action.payload),
  77. clearMessage: (state) => {state.message = ''}
  78. },
  79. extraReducers: (bilder) => {
  80. bilder
  81. .addCase(fileMessage.fulfilled, (state, action) => {
  82. console.log(action.payload)
  83. state.files = action.payload.data?.files
  84. })
  85. .addCase(fileMessage.pending, (state, action) => {
  86. console.log('pending', fileMessage.pending())
  87. })
  88. .addCase(fileMessage.rejected, (state, action) => {
  89. console.log('post file rejected', action.payload)
  90. })}
  91. });
  92. const {actions, reducer} = messageReducerSlice;
  93. const messageReducer = reducer;
  94. export default messageReducer;
  95. export const {
  96. storeMessage,
  97. sendMessage,
  98. sendPrivateMessage,
  99. clearMessage,
  100. editMessage,
  101. deleteMessage
  102. } = actions;