messageReducer.js 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. import { createSlice} from '@reduxjs/toolkit';
  2. import axios from 'axios';
  3. import { createAsyncThunk } from '@reduxjs/toolkit';
  4. import { sendMessageToSocket } from '../utils/messagesSocketEvents';
  5. import { deleteMessageHandler } from '../utils/messagesSocketEvents';
  6. import { editMessageHandler } from '../utils/messagesSocketEvents';
  7. const initialState = {
  8. message:'',
  9. editMessage: '',
  10. messageId: '',
  11. files: [],
  12. isLoading: false,
  13. loadingPercentage: 0,
  14. ref: null
  15. }
  16. const POST_FILES_URL = process.env.REACT_APP_SERVER_URL + `/files`;
  17. export const fileMessage = createAsyncThunk(
  18. 'messageReducer/fileMessageStatus',
  19. async (payload) => {
  20. const {files, axiosConfig} = payload;
  21. const token = localStorage.getItem('token')
  22. try {
  23. const formData = new FormData();
  24. if(files?.length) {
  25. for (let i = 0; i < files?.length; i++) {
  26. formData.append('files', files[i])
  27. }
  28. } else {
  29. formData.append('files', files)
  30. }
  31. formData.append('token', token)
  32. const response = await axios.post(POST_FILES_URL, formData,axiosConfig);
  33. return await response;
  34. } catch (err) {
  35. console.log('Error messageReducer thunk', err)
  36. return err?.message
  37. }
  38. })
  39. const messageReducerSlice = createSlice({
  40. name: 'messageReducer',
  41. initialState,
  42. reducers: {
  43. storeMessage: (state, action) => {state.message = action.payload.message},
  44. editMessage: (state, action) => {
  45. editMessageHandler(state, action.payload)
  46. state.editMessage = action.payload.editMessage;
  47. state.messageId = action.payload.messageId;
  48. state.ref = action.payload.ref;
  49. },
  50. deleteMessage: (state, action) => {
  51. deleteMessageHandler(state, action.payload)
  52. },
  53. sendMessage: (state, action) => sendMessageToSocket(state, action.payload),
  54. clearMessage: (state) => {state.message = ''}
  55. },
  56. extraReducers: (bilder) => {
  57. bilder
  58. .addCase(fileMessage.fulfilled, (state, action) => {
  59. state.files = action.payload.data?.files
  60. })
  61. .addCase(fileMessage.pending, (state, action) => {
  62. console.log('pending', fileMessage.pending())
  63. })
  64. .addCase(fileMessage.rejected, (state, action) => {
  65. console.log('post file rejected', action.payload)
  66. })}
  67. });
  68. const {actions, reducer} = messageReducerSlice;
  69. const messageReducer = reducer;
  70. export default messageReducer;
  71. export const {
  72. storeMessage,
  73. sendMessage,
  74. sendPrivateMessage,
  75. clearMessage,
  76. editMessage,
  77. deleteMessage
  78. } = actions;