91 lines
2.2 KiB
JavaScript
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;
|