58 lines
1.6 KiB
TypeScript
58 lines
1.6 KiB
TypeScript
import { createSlice, PayloadAction } from '@reduxjs/toolkit';
|
|
import type { User } from '@/types/user.types';
|
|
|
|
interface AuthState {
|
|
user: User | null;
|
|
token: string | null;
|
|
refreshToken: string | null;
|
|
isAuthenticated: boolean;
|
|
permissions: string[];
|
|
loading: boolean;
|
|
}
|
|
|
|
const initialState: AuthState = {
|
|
user: null,
|
|
token: null,
|
|
refreshToken: null,
|
|
isAuthenticated: false,
|
|
permissions: [],
|
|
loading: true,
|
|
};
|
|
|
|
const authSlice = createSlice({
|
|
name: 'auth',
|
|
initialState,
|
|
reducers: {
|
|
setCredentials: (
|
|
state,
|
|
action: PayloadAction<{ user: User; token: string; refreshToken?: string; permissions?: string[] }>
|
|
) => {
|
|
state.user = action.payload.user;
|
|
state.token = action.payload.token;
|
|
state.refreshToken = action.payload.refreshToken || null;
|
|
state.permissions = action.payload.permissions || [];
|
|
state.isAuthenticated = true;
|
|
state.loading = false;
|
|
},
|
|
logout: (state) => {
|
|
state.user = null;
|
|
state.token = null;
|
|
state.refreshToken = null;
|
|
state.permissions = [];
|
|
state.isAuthenticated = false;
|
|
state.loading = false;
|
|
},
|
|
setLoading: (state, action: PayloadAction<boolean>) => {
|
|
state.loading = action.payload;
|
|
},
|
|
updateUser: (state, action: PayloadAction<Partial<User>>) => {
|
|
if (state.user) {
|
|
state.user = { ...state.user, ...action.payload };
|
|
}
|
|
},
|
|
},
|
|
});
|
|
|
|
export const { setCredentials, logout, setLoading, updateUser } = authSlice.actions;
|
|
export default authSlice.reducer;
|