messageReducer.js 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  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. percentage: 0,
  10. ref: null
  11. }
  12. const SERVER_URL = process.env.REACT_APP_SERVER_URL;
  13. const POST_FILES_URL = SERVER_URL + '/files';
  14. export const sendMessageToSocket = (state, data) => {
  15. if (!!state.message && state.message.length < 200) { //remove to other file
  16. data.socket.emit('message', {...data.user, message: state.message});
  17. }
  18. };
  19. export const deleteMessageHandler = (state, data) => {
  20. data.socket.emit('deleteMessage', {messageId: data.messageId, token: data.socket.auth.token});
  21. };
  22. export const editMessageHandler = (state, data) => {
  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. // onUploadProgress: (progress) => {
  43. // const {loaded, total} = progress;
  44. // const persentage = Math.floor(loaded * 100 / total);
  45. // },
  46. headers: {
  47. "Content-type": "multipart/form-data",
  48. }
  49. });
  50. return await response;
  51. } catch (err) {
  52. console.log('error messageReducer thunk', err)
  53. return err?.message
  54. }
  55. })
  56. const messageReducerSlice = createSlice({
  57. name: 'messageReducer',
  58. initialState,
  59. reducers: {
  60. storeMessage: (state, action) => {state.message = action.payload.message},
  61. editMessage: (state, action) => {
  62. editMessageHandler(state, action.payload)
  63. state.editMessage = action.payload.editMessage;
  64. state.messageId = action.payload.messageId;
  65. state.ref = action.payload.ref;
  66. },
  67. deleteMessage: (state, action) => {
  68. deleteMessageHandler(state, action.payload)
  69. },
  70. sendMessage: (state, action) => sendMessageToSocket(state, action.payload),
  71. clearMessage: (state) => {state.message = ''},
  72. extraReducers: (bilder) =>
  73. bilder
  74. .addCase(fileMessage.fulfilled, (state, action) => {
  75. state.files = action.payload.data?.files
  76. })
  77. .addCase(fileMessage.rejected, (state, action) => {
  78. console.log('post file rejected', action.payload)
  79. })
  80. },
  81. });
  82. const {actions, reducer} = messageReducerSlice;
  83. const messageReducer = reducer;
  84. export default messageReducer;
  85. export const {
  86. storeMessage,
  87. sendMessage,
  88. clearMessage,
  89. editMessage,
  90. deleteMessage
  91. } = actions;