feat(login): POP 모드 토글 추가 - 로그인 시 POP/PC 진입 선택
로그인 폼에 POP 모드 Switch 토글을 추가하여 현장 작업자가 로그인 시점에서 POP 화면으로 직접 진입할 수 있도록 한다. 토글 상태는 localStorage에 저장되어 다음 로그인 시 유지된다. [백엔드] - 로그인 응답에 popLandingPath 추가 (getPopMenuList 재사용) - AdminService/paramMap 변수 스코프 버그 수정 (try 블록 내부 선언 -> 외부로 이동) [프론트엔드] - useLogin: isPopMode 상태 + localStorage 연동 + POP 분기 라우팅 - LoginForm: POP 모드 Switch 토글 UI (Monitor 아이콘) - POP 미설정 시 에러 메시지 표시 후 로그인 중단 - LoginResponse 타입에 popLandingPath 필드 추가
This commit is contained in:
+33
-11
@@ -20,6 +20,21 @@ export const useLogin = () => {
|
||||
const [isLoading, setIsLoading] = useState(false);
|
||||
const [error, setError] = useState("");
|
||||
const [showPassword, setShowPassword] = useState(false);
|
||||
const [isPopMode, setIsPopMode] = useState(false);
|
||||
|
||||
// localStorage에서 POP 모드 상태 복원
|
||||
useEffect(() => {
|
||||
const saved = localStorage.getItem("popLoginMode");
|
||||
if (saved === "true") setIsPopMode(true);
|
||||
}, []);
|
||||
|
||||
const togglePopMode = useCallback(() => {
|
||||
setIsPopMode((prev) => {
|
||||
const next = !prev;
|
||||
localStorage.setItem("popLoginMode", String(next));
|
||||
return next;
|
||||
});
|
||||
}, []);
|
||||
|
||||
/**
|
||||
* 폼 입력값 변경 처리
|
||||
@@ -141,17 +156,22 @@ export const useLogin = () => {
|
||||
// 쿠키에도 저장 (미들웨어에서 사용)
|
||||
document.cookie = `authToken=${result.data.token}; path=/; max-age=86400; SameSite=Lax`;
|
||||
|
||||
// 로그인 성공 - 첫 번째 접근 가능한 메뉴로 리다이렉트
|
||||
const firstMenuPath = result.data?.firstMenuPath;
|
||||
|
||||
if (firstMenuPath) {
|
||||
// 접근 가능한 메뉴가 있으면 해당 메뉴로 이동
|
||||
console.log("첫 번째 접근 가능한 메뉴로 이동:", firstMenuPath);
|
||||
router.push(firstMenuPath);
|
||||
if (isPopMode) {
|
||||
const popPath = result.data?.popLandingPath;
|
||||
if (popPath) {
|
||||
router.push(popPath);
|
||||
} else {
|
||||
setError("POP 화면이 설정되어 있지 않습니다. 관리자에게 메뉴 관리에서 POP 화면을 설정해달라고 요청하세요.");
|
||||
setIsLoading(false);
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
// 접근 가능한 메뉴가 없으면 메인 페이지로 이동
|
||||
console.log("접근 가능한 메뉴가 없어 메인 페이지로 이동");
|
||||
router.push(AUTH_CONFIG.ROUTES.MAIN);
|
||||
const firstMenuPath = result.data?.firstMenuPath;
|
||||
if (firstMenuPath) {
|
||||
router.push(firstMenuPath);
|
||||
} else {
|
||||
router.push(AUTH_CONFIG.ROUTES.MAIN);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
// 로그인 실패
|
||||
@@ -165,7 +185,7 @@ export const useLogin = () => {
|
||||
setIsLoading(false);
|
||||
}
|
||||
},
|
||||
[formData, validateForm, apiCall, router],
|
||||
[formData, validateForm, apiCall, router, isPopMode],
|
||||
);
|
||||
|
||||
// 컴포넌트 마운트 시 기존 인증 상태 확인
|
||||
@@ -179,10 +199,12 @@ export const useLogin = () => {
|
||||
isLoading,
|
||||
error,
|
||||
showPassword,
|
||||
isPopMode,
|
||||
|
||||
// 액션
|
||||
handleInputChange,
|
||||
handleLogin,
|
||||
togglePasswordVisibility,
|
||||
togglePopMode,
|
||||
};
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user