E-Commerce-Module/frontend/src/features/auth/authSlice.js

75 lines
No EOL
2.4 KiB
JavaScript

import { createSlice } from '@reduxjs/toolkit';
const initialState = {
user: JSON.parse(localStorage.getItem('user')) || null,
userData: JSON.parse(localStorage.getItem('userData')) || null,
apiKey: localStorage.getItem('apiKey') || null,
isAdmin: localStorage.getItem('isAdmin') === 'true',
isAuthenticated: !!localStorage.getItem('apiKey'),
loading: false,
error: null,
};
export const authSlice = createSlice({
name: 'auth',
initialState,
reducers: {
loginStart: (state) => {
state.loading = true;
state.error = null;
},
loginSuccess: (state, action) => {
state.loading = false;
state.isAuthenticated = true;
state.user = action.payload.user;
state.userData = {
id: action.payload.user,
apiKey: action.payload.apiKey,
email: action.payload.email,
firstname: action.payload.firstname,
lastname: action.payload.lastname,
isAdmin: action.payload.isAdmin
};
state.apiKey = action.payload.apiKey;
state.isAdmin = action.payload.isAdmin;
localStorage.setItem('apiKey', action.payload.apiKey);
localStorage.setItem('isAdmin', action.payload.isAdmin);
localStorage.setItem('user', JSON.stringify(action.payload.user));
localStorage.setItem('userData', JSON.stringify({
id: action.payload.user,
apiKey: action.payload.apiKey,
isAdmin: action.payload.isAdmin
}));
},
loginFailed: (state, action) => {
state.loading = false;
state.error = action.payload;
},
logout: (state) => {
state.isAuthenticated = false;
state.user = null;
state.userData = null;
state.apiKey = null;
state.isAdmin = false;
localStorage.removeItem('apiKey');
localStorage.removeItem('isAdmin');
localStorage.removeItem('user');
localStorage.removeItem('userData');
},
clearError: (state) => {
state.error = null;
},
},
});
export const { loginStart, loginSuccess, loginFailed, logout, clearError } = authSlice.actions;
// Selectors
export const selectIsAuthenticated = (state) => state.auth.isAuthenticated;
export const selectIsAdmin = (state) => state.auth.isAdmin;
export const selectCurrentUser = (state) => state.auth.user;
export const selectApiKey = (state) => state.auth.apiKey;
export const selectAuthLoading = (state) => state.auth.loading;
export const selectAuthError = (state) => state.auth.error;
export default authSlice.reducer;