messageReducer.js 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  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. console.log(files)
  30. for (let i = 0; i < files.length; i++) {
  31. formData.append('files', files[i])
  32. }
  33. formData.append('token', token)
  34. const response = await axios.post(POST_FILES_URL, formData,
  35. {
  36. headers: {
  37. "Content-type": "multipart/form-data",
  38. }
  39. });
  40. return await response;
  41. } catch (err) {
  42. console.log('error messageReducer thunk', err)
  43. return err?.message
  44. }
  45. })
  46. const messageReducerSlice = createSlice({
  47. name: 'messageReducer',
  48. initialState,
  49. reducers: {
  50. storeMessage: (state, action) => {state.message = action.payload.message},
  51. editMessage: (state, action) => {
  52. state.editMessage = action.payload.editMessage;
  53. state.messageId = action.payload.messageId;
  54. state.ref = action.payload.ref;
  55. },
  56. sendMessage: (state, action) => sendMessageToSocket(state, action.payload),
  57. clearMessage: (state) => {state.message = ''},
  58. extraReducers: (bilder) =>
  59. bilder
  60. .addCase(fileMessage.fulfilled, (state, action) => {
  61. state.files = action.payload.data?.files
  62. })
  63. .addCase(fileMessage.rejected, (state, action) => {
  64. console.log('post file rejected', action.payload)
  65. })
  66. },
  67. });
  68. const {actions, reducer} = messageReducerSlice;
  69. const messageReducer = reducer;
  70. export default messageReducer;
  71. export const {
  72. storeMessage,
  73. sendMessage,
  74. clearMessage,
  75. editMessage
  76. } = actions;