userDataReducer.js 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  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: false,
  14. isPrivatChat: false,
  15. toUser: {},
  16. avatar: ''
  17. }
  18. const SERVER_URL = process.env.REACT_APP_SERVER_URL
  19. const POST_URL = process.env.REACT_APP_SERVER_URL + '/login';
  20. const GET_AVATAR_URL = process.env.REACT_APP_SERVER_URL + '/avatar';
  21. export const getUserData = createAsyncThunk(
  22. 'userData/getUser',
  23. ( t , thunkAPI) => {
  24. const userData = thunkAPI.getState().userDataReducer;
  25. if(userData.userName){
  26. if(isValidPayload({...userData}) && isValidUserName({...userData}))
  27. try {
  28. const response = sendForm(POST_URL, userData);
  29. return response;
  30. }catch (err) {
  31. console.log('error getUserData thunk', err)
  32. return err?.message
  33. }
  34. }
  35. });
  36. export const getUserAvatar = createAsyncThunk(
  37. 'userData/getUserAvatar',
  38. async (file) => {
  39. try {
  40. const token = localStorage.getItem('token') ; //use axios becose fetch dont send files
  41. const formData = new FormData()
  42. formData.append('file', file)
  43. formData.append('token', token)
  44. const response = await axios.post(GET_AVATAR_URL, formData);
  45. return await response;
  46. }catch (err) {
  47. console.log('error getUserData thunk', err)
  48. return err?.message
  49. }
  50. });
  51. const getUserDataSlice = createSlice({
  52. name: 'userData',
  53. initialState,
  54. reducers: {
  55. privateMessage: (state, action)=> {
  56. state.isPrivatChat = true;
  57. state.toUser = action.payload.toUser
  58. },
  59. generalMessage: (state, action)=> {
  60. state.isPrivatChat = false;
  61. },
  62. setUserName: (state, action) => {state.userName = action.payload.userName},
  63. setUserPassword: (state, action) => {state.password = action.payload.password},
  64. removeToken: state => {
  65. state.token = ''
  66. },
  67. deleteResponseMessage: state => {state.responseMessage = ''},
  68. showUserInfoBox: state => {
  69. state.showUserInfoBox = !state.showUserInfoBox //replace later to other reducer file
  70. //localStorage.setItem('showBox', !state.showUserInfoBox)
  71. },
  72. },
  73. extraReducers: (builder) => {
  74. builder
  75. .addCase(getUserData.fulfilled, (state, action) => {
  76. if(action.payload?.token){
  77. state.token = action.payload.token
  78. state.userLoadingStatus = 'success'
  79. localStorage.setItem('token', action.payload.token)
  80. }
  81. if(action.payload?.message){
  82. state.responseMessage = action.payload.message
  83. state.userLoadingStatus = 'error';
  84. }
  85. })
  86. .addCase(getUserData.rejected, (state, action) => {
  87. state.userLoadingStatus = 'error';
  88. if(action.payload?.message){
  89. state.responseMessage = action.payload.message
  90. }
  91. state.responseMessage = `Something went wrong...`
  92. })
  93. .addCase(getUserAvatar.fulfilled, (state, action) => {
  94. state.avatar = action.payload.data?.avatarUrl
  95. })
  96. .addCase(getUserAvatar.rejected, (state, action) => {
  97. console.log('get avatar rejected', action.payload)
  98. })
  99. }}
  100. );
  101. const {actions, reducer} = getUserDataSlice;
  102. const userDataReducer = reducer;
  103. export default userDataReducer;
  104. export const {
  105. setUserName,
  106. setUserPassword,
  107. removeToken,
  108. deleteResponseMessage,
  109. showUserInfoBox,
  110. privateMessage,
  111. generalMessage
  112. } = actions;