userDataReducer.js 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. import { isValidPayload } from "../utils/validations/isValidPayload";
  2. import { isValidUserName } from '../utils/validations/isValidUserName';
  3. import { sendForm } from '../utils/sendForm';
  4. import { createAsyncThunk, createSlice } from '@reduxjs/toolkit';
  5. import axios from 'axios';
  6. const initialState = {
  7. userName:'',
  8. password: '',
  9. userLoadingStatus: 'idle',
  10. token: '',
  11. socket: null,
  12. responseMessage: '',
  13. showUserInfoBox: true,
  14. avatar: ''
  15. }
  16. const POST_URL = process.env.REACT_APP_POST_URL || 'http://localhost:5000/login';
  17. const GET_AVATAR_URL = process.env.REACT_APP_GET_AVATAR_URL || 'http://localhost:5000/avatar';
  18. export const getUserData = createAsyncThunk(
  19. 'userData/getUser',
  20. ( t , thunkAPI) => {
  21. const userData = thunkAPI.getState().userDataReducer;
  22. if(userData.userName){
  23. if(isValidPayload({...userData}) && isValidUserName({...userData}))
  24. try {
  25. const response = sendForm(POST_URL, userData);
  26. return response;
  27. }catch (err) {
  28. console.log('error getUserData thunk', err)
  29. return err?.message
  30. }
  31. }
  32. });
  33. export const getUserAvatar = createAsyncThunk(
  34. 'userData/getUserAvatar',
  35. async (file) => {
  36. try {
  37. const token = localStorage.getItem('token') ; //use axios becose fetch dont send files
  38. const formData = new FormData()
  39. formData.append('file', file)
  40. formData.append('token', token)
  41. const response = await axios.post(GET_AVATAR_URL, formData);
  42. return await response;
  43. }catch (err) {
  44. console.log('error getUserData thunk', err)
  45. return err?.message
  46. }
  47. });
  48. const getUserDataSlice = createSlice({
  49. name: 'userData',
  50. initialState,
  51. reducers: {
  52. setUserName: (state, action) => {state.userName = action.payload.userName},
  53. setUserPassword: (state, action) => {state.password = action.payload.password},
  54. removeToken: state => {
  55. state.token = ''
  56. },
  57. deleteResponseMessage: state => {state.responseMessage = ''},
  58. showUserInfoBox: state => {
  59. state.showUserInfoBox = !state.showUserInfoBox //replace later to other reducer file
  60. console.log('reducer showUserInfoBox', state.showUserInfoBox)
  61. //localStorage.setItem('showBox', !state.showUserInfoBox)
  62. },
  63. },
  64. extraReducers: (builder) => {
  65. builder
  66. .addCase(getUserData.fulfilled, (state, action) => {
  67. if(action.payload?.token){
  68. state.token = action.payload.token
  69. state.userLoadingStatus = 'success'
  70. localStorage.setItem('token', action.payload.token)
  71. }
  72. if(action.payload?.message){
  73. state.responseMessage = action.payload.message
  74. state.userLoadingStatus = 'error';
  75. }
  76. })
  77. .addCase(getUserData.rejected, (state, action) => {
  78. state.userLoadingStatus = 'error';
  79. if(action.payload?.message){
  80. state.responseMessage = action.payload.message
  81. }
  82. state.responseMessage = 'Something went wrong...'
  83. })
  84. .addCase(getUserAvatar.fulfilled, (state, action) => {
  85. state.avatar = action.payload.data?.avatarUrl
  86. })
  87. .addCase(getUserAvatar.rejected, (state, action) => {
  88. console.log('get avatar rejected', action.payload)
  89. })
  90. }}
  91. );
  92. const {actions, reducer} = getUserDataSlice;
  93. const userDataReducer = reducer;
  94. export default userDataReducer;
  95. export const {
  96. setUserName,
  97. setUserPassword,
  98. removeToken,
  99. deleteResponseMessage,
  100. showUserInfoBox
  101. } = actions;