authSlice.ts 1.4 KB
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<AuthStatus>) {
      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;