109 lines
2.4 KiB
TypeScript
109 lines
2.4 KiB
TypeScript
export const useUserStore = defineStore("user", () => {
|
|
// 상태
|
|
const isLoggedIn = ref(false);
|
|
const user = ref<{
|
|
id?: string;
|
|
userId?: string;
|
|
email?: string;
|
|
name?: string;
|
|
role?: string;
|
|
} | null>(null);
|
|
const token = ref<string | null>(null);
|
|
|
|
|
|
interface LoginData {
|
|
userId: string
|
|
role: string
|
|
lastLoginAt: string
|
|
}
|
|
|
|
// 게터
|
|
const isAdmin = computed(() => user.value?.role === "admin");
|
|
const userName = computed(() => user.value?.name || "사용자");
|
|
// 액션
|
|
const login = async (userId: string, password: string) => {
|
|
try {
|
|
// 실제 API 호출로 대체할 수 있습니다
|
|
|
|
const {data, error: _error } = await useApi<ApiResponse<LoginData>>('/login', {
|
|
method: 'post',
|
|
body: { userId, password }
|
|
})
|
|
|
|
let mockUser;
|
|
|
|
if(data && data.value && data.value.success){
|
|
mockUser = data.value.data;
|
|
}else{
|
|
throw new Error("아이디 또는 비밀번호가 올바르지 않습니다.");
|
|
}
|
|
|
|
user.value = mockUser;
|
|
// token.value = "mock-token-" + Date.now();
|
|
isLoggedIn.value = true;
|
|
|
|
return { success: true, user: mockUser };
|
|
} catch (error) {
|
|
console.error("로그인 실패:", error);
|
|
return {
|
|
success: false,
|
|
error:
|
|
error instanceof Error ? error.message : "로그인에 실패했습니다.",
|
|
};
|
|
}
|
|
};
|
|
|
|
const logout = () => {
|
|
user.value = null;
|
|
token.value = null;
|
|
isLoggedIn.value = false;
|
|
|
|
// 로컬 스토리지에서 제거
|
|
localStorage.removeItem("user");
|
|
localStorage.removeItem("token");
|
|
};
|
|
|
|
const checkAuth = () => {
|
|
// 페이지 로드 시 로컬 스토리지에서 사용자 정보 복원
|
|
const savedUser = localStorage.getItem("user");
|
|
const savedToken = localStorage.getItem("token");
|
|
|
|
if (savedUser && savedToken) {
|
|
user.value = JSON.parse(savedUser);
|
|
token.value = savedToken;
|
|
isLoggedIn.value = true;
|
|
}
|
|
};
|
|
|
|
const setToken = (accessToken : string) => {
|
|
token.value = accessToken;
|
|
}
|
|
|
|
const getToken = () => {
|
|
return token;
|
|
}
|
|
|
|
// 초기 인증 상태 확인
|
|
if (import.meta.client) {
|
|
checkAuth();
|
|
}
|
|
|
|
return {
|
|
// 상태
|
|
isLoggedIn,
|
|
user,
|
|
token,
|
|
|
|
// 게터
|
|
isAdmin,
|
|
userName,
|
|
|
|
// 액션
|
|
login,
|
|
logout,
|
|
checkAuth,
|
|
setToken,
|
|
getToken
|
|
};
|
|
});
|