/* 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;