75 lines
No EOL
2.4 KiB
JavaScript
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; |