messageReducer.js 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  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 deleteMessageHandler = (state, data) => {
  19. data.socket.emit('deleteMessage', {messageId: data.messageId, token: data.socket.auth.token});
  20. };
  21. export const editMessageHandler = (state, data) => {
  22. console.log( data.editMessage)
  23. if(data.socket){
  24. 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
  25. }
  26. };
  27. export const fileMessage = createAsyncThunk(
  28. 'messageReducer/fileMessage',
  29. async (files) => {
  30. const token = localStorage.getItem('token')
  31. try {
  32. const formData = new FormData();
  33. if(files.length) {
  34. for (let i = 0; i < files.length; i++) {
  35. formData.append('files', files[i])
  36. }
  37. } else {
  38. formData.append('files', files)
  39. }
  40. formData.append('token', token)
  41. const response = await axios.post(POST_FILES_URL, formData,
  42. {
  43. headers: {
  44. "Content-type": "multipart/form-data",
  45. }
  46. });
  47. return await response;
  48. } catch (err) {
  49. console.log('error messageReducer thunk', err)
  50. return err?.message
  51. }
  52. })
  53. const messageReducerSlice = createSlice({
  54. name: 'messageReducer',
  55. initialState,
  56. reducers: {
  57. storeMessage: (state, action) => {state.message = action.payload.message},
  58. editMessage: (state, action) => {
  59. editMessageHandler(state, action.payload)
  60. state.editMessage = action.payload.editMessage;
  61. state.messageId = action.payload.messageId;
  62. state.ref = action.payload.ref;
  63. },
  64. deleteMessage: (state, action) => {
  65. deleteMessageHandler(state, action.payload)
  66. },
  67. sendMessage: (state, action) => sendMessageToSocket(state, action.payload),
  68. clearMessage: (state) => {state.message = ''},
  69. extraReducers: (bilder) =>
  70. bilder
  71. .addCase(fileMessage.fulfilled, (state, action) => {
  72. state.files = action.payload.data?.files
  73. })
  74. .addCase(fileMessage.rejected, (state, action) => {
  75. console.log('post file rejected', action.payload)
  76. })
  77. },
  78. });
  79. const {actions, reducer} = messageReducerSlice;
  80. const messageReducer = reducer;
  81. export default messageReducer;
  82. export const {
  83. storeMessage,
  84. sendMessage,
  85. clearMessage,
  86. editMessage,
  87. deleteMessage
  88. } = actions;