import { createSlice, PayloadAction } from '@reduxjs/toolkit'; import type { UserInfo } from '../../api/auth'; export type AuthStatus = 'idle' | 'submitting' | 'success' | 'failed'; export interface AuthState { accessToken: string | null; userInfo: UserInfo | null; status: AuthStatus; } const initialState: AuthState = { accessToken: null, userInfo: null, status: 'idle', }; const authSlice = createSlice({ name: 'auth', initialState, reducers: { setSession( state, action: PayloadAction<{ accessToken: string; userInfo: UserInfo }>, ) { state.accessToken = action.payload.accessToken; state.userInfo = action.payload.userInfo; state.status = 'success'; }, clearSession(state) { state.accessToken = null; state.userInfo = null; state.status = 'idle'; }, setStatus(state, action: PayloadAction) { state.status = action.payload; }, }, }); export const { setSession, clearSession, setStatus } = authSlice.actions; export default authSlice.reducer; // selectors export const selectAccessToken = (state: { auth: AuthState }) => state.auth.accessToken; export const selectUserInfo = (state: { auth: AuthState }) => state.auth.userInfo; export const selectIsAuthenticated = (state: { auth: AuthState }) => state.auth.accessToken != null; export const selectAuthStatus = (state: { auth: AuthState }) => state.auth.status;