messageReducer.js 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  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. isLoading: false,
  10. loadingPercentage: 0,
  11. ref: null
  12. }
  13. const POST_FILES_URL = process.env.REACT_APP_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/fileMessageStatus',
  29. async (payload) => {
  30. const {files, axiosConfig} = payload;
  31. const token = localStorage.getItem('token')
  32. try {
  33. const formData = new FormData();
  34. if(files.length) {
  35. for (let i = 0; i < files.length; i++) {
  36. formData.append('files', files[i])
  37. }
  38. } else {
  39. formData.append('files', files)
  40. }
  41. formData.append('token', token)
  42. const response = await axios.post(POST_FILES_URL, formData,axiosConfig);
  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. editMessageHandler(state, action.payload)
  56. state.editMessage = action.payload.editMessage;
  57. state.messageId = action.payload.messageId;
  58. state.ref = action.payload.ref;
  59. },
  60. deleteMessage: (state, action) => {
  61. deleteMessageHandler(state, action.payload)
  62. },
  63. sendMessage: (state, action) => sendMessageToSocket(state, action.payload),
  64. clearMessage: (state) => {state.message = ''}
  65. },
  66. extraReducers: (bilder) => {
  67. bilder
  68. .addCase(fileMessage.fulfilled, (state, action) => {
  69. console.log('send', action)
  70. state.files = action.payload.data?.files
  71. })
  72. .addCase(fileMessage.pending, (state, action) => {
  73. console.log('pending', fileMessage.pending())
  74. })
  75. .addCase(fileMessage.rejected, (state, action) => {
  76. console.log('post file rejected', action.payload)
  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;