messageReducer.js 3.2 KB

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