messageReducer.js 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. import { createSlice} from '@reduxjs/toolkit';
  2. import axios from 'axios';
  3. import { createAsyncThunk } from '@reduxjs/toolkit';
  4. const initialState = {
  5. startMessages: [],
  6. message:'',
  7. editMessage: '',
  8. messageId: '',
  9. files: [],
  10. ref: null
  11. }
  12. const POST_FILES_URL = 'http://localhost:5000/files';
  13. export const sendMessageToSocket = (state, data) => {
  14. if (state.message && state.message.length < 200) { //remove to other file
  15. data.socket.emit('message', {...data.user, message: state.message});
  16. }
  17. };
  18. export const editMessageToSocket = (state, data) => {
  19. if (state.message && state.message.length < 200) {
  20. data.socket.emit('editmessage', {...data.user, message: state.message}); //add backend functional later find by id and edit
  21. }
  22. };
  23. export const fileMessage = createAsyncThunk(
  24. 'messageReducer/fileMessage',
  25. async (files) => {
  26. const token = localStorage.getItem('token')
  27. try {
  28. const formData = new FormData();
  29. if(files.length) {
  30. for (let i = 0; i < files.length; i++) {
  31. formData.append('files', files[i])
  32. }
  33. } else {
  34. formData.append('files', files)
  35. }
  36. formData.append('token', token)
  37. const response = await axios.post(POST_FILES_URL, formData,
  38. {
  39. headers: {
  40. "Content-type": "multipart/form-data",
  41. }
  42. });
  43. return await response;
  44. } catch (err) {
  45. console.log('error messageReducer thunk', err)
  46. return err?.message
  47. }
  48. })
  49. const messageReducerSlice = createSlice({
  50. name: 'messageReducer',
  51. initialState,
  52. reducers: {
  53. storeMessage: (state, action) => {state.message = action.payload.message},
  54. editMessage: (state, action) => {
  55. state.editMessage = action.payload.editMessage;
  56. state.messageId = action.payload.messageId;
  57. state.ref = action.payload.ref;
  58. },
  59. sendMessage: (state, action) => sendMessageToSocket(state, action.payload),
  60. clearMessage: (state) => {state.message = ''},
  61. extraReducers: (bilder) =>
  62. bilder
  63. .addCase(fileMessage.fulfilled, (state, action) => {
  64. state.files = action.payload.data?.files
  65. })
  66. .addCase(fileMessage.rejected, (state, action) => {
  67. console.log('post file rejected', action.payload)
  68. })
  69. },
  70. });
  71. const {actions, reducer} = messageReducerSlice;
  72. const messageReducer = reducer;
  73. export default messageReducer;
  74. export const {
  75. storeMessage,
  76. sendMessage,
  77. clearMessage,
  78. editMessage
  79. } = actions;