Files
rentalcalculator/src/app/store/userSlice.js

91 lines
2.2 KiB
JavaScript

/* eslint import/no-extraneous-dependencies: off */
import { createAsyncThunk, createSlice } from '@reduxjs/toolkit';
import history from '@history';
import _ from '@lodash';
import { setInitialSettings } from 'app/store/fuse/settingsSlice';
import { showMessage } from 'app/store/fuse/messageSlice';
import settingsConfig from 'app/configs/settingsConfig';
import { authService } from '../services';
export const setUser = createAsyncThunk('user/setUser', async (user, { dispatch, getState }) => {
/*
You can redirect the logged-in user to a specific route depending on his role
*/
if (user.loginRedirectUrl) {
settingsConfig.loginRedirectUrl = user.loginRedirectUrl; // for example 'apps/academy'
}
return user;
});
export const updateUserSettings = createAsyncThunk(
'user/updateSettings',
async (settings, { dispatch, getState }) => {
const { user } = getState();
const newUser = _.merge({}, user, { data: { ...settings } });
dispatch(updateUserData(newUser));
return newUser;
}
);
export const logoutUser = () => async (dispatch, getState) => {
const { user } = getState();
if (!user.role || user.role.length === 0) {
// is guest
return null;
}
history.push({
pathname: '/',
});
dispatch(setInitialSettings());
return dispatch(userLoggedOut());
};
export const updateUserData = (user) => async (dispatch, getState) => {
if (!user.role || user.role.length === 0) {
// is guest
return;
}
authService
.updateUserData(user)
.then(() => {
dispatch(showMessage({ message: 'User data saved' }));
})
.catch((error) => {
dispatch(showMessage({ message: error.message }));
});
};
const initialState = {
role: [], // guest
data: {
displayName: 'John Doe',
email: 'johndoe@withinpixels.com',
},
};
const userSlice = createSlice({
name: 'user',
initialState,
reducers: {
userLoggedOut: (state, action) => initialState,
},
extraReducers: {
[updateUserSettings.fulfilled]: (state, action) => action.payload,
[setUser.fulfilled]: (state, action) => action.payload,
},
});
export const { userLoggedOut } = userSlice.actions;
export const selectUser = ({ user }) => user;
export default userSlice.reducer;