- 회원가입 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>
40 lines
1.1 KiB
TypeScript
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 });
|
|
},
|
|
}));
|