SPMS_WEB/react/src/stores/authStore.ts
SEAN 37ac854bc8 feat: 인증 페이지 API 연동 (회원가입/로그인/이메일 인증) (#7)
- 회원가입 API 연동 (POST /v1/in/auth/signup)
- 로그인 API 연동 (POST /v1/in/auth/login, next_action 분기)
- 이메일 인증 API 연동 (POST /v1/in/auth/email/verify, /resend)
- API 타입 swagger 스펙에 맞게 수정 (ApiResponse, auth types)
- User 타입 백엔드 AdminInfo 기반으로 변경
- authStore localStorage 영속화 (새로고침 시 인증 유지)
- Vite dev 프록시 설정 (/v1 → devspms)

Closes #7

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-27 08:00:04 +09:00

40 lines
1.1 KiB
TypeScript

import { create } from "zustand";
import type { User } from "@/types/user";
/* localStorage에서 유저 정보 복원 */
function loadUser(): User | null {
try {
const raw = localStorage.getItem("user");
return raw ? JSON.parse(raw) : null;
} catch {
return null;
}
}
const savedUser = loadUser();
const savedToken = localStorage.getItem("accessToken");
interface AuthState {
user: User | null;
isAuthenticated: boolean;
setAuth: (user: User, accessToken: string, refreshToken: string) => void;
logout: () => void;
}
export const useAuthStore = create<AuthState>((set) => ({
user: savedUser,
isAuthenticated: !!(savedUser && savedToken),
setAuth: (user, accessToken, refreshToken) => {
localStorage.setItem("accessToken", accessToken);
localStorage.setItem("refreshToken", refreshToken);
localStorage.setItem("user", JSON.stringify(user));
set({ user, isAuthenticated: true });
},
logout: () => {
localStorage.removeItem("accessToken");
localStorage.removeItem("refreshToken");
localStorage.removeItem("user");
set({ user: null, isAuthenticated: false });
},
}));