- 부가서비스 소개 List, 권한 검증 추가

- 각 API 오류 수정
This commit is contained in:
HyeonJongKim
2025-10-24 20:45:24 +09:00
parent 2f13c29d1b
commit b10376e171
33 changed files with 657 additions and 284 deletions

View File

@@ -0,0 +1,97 @@
import { useEffect, useState } from 'react';
import { useNavigate } from '@/shared/lib/hooks/use-navigate';
import { useExtensionCheckMutation } from '@/entities/additional-service/api/use-extension-check-mutation';
import { Dialog } from '@/shared/ui/dialogs/dialog';
import { PATHS } from '@/shared/constants/paths';
interface UseExtensionAccessCheckProps {
extensionCode: string;
enabled?: boolean;
}
interface UseExtensionAccessCheckReturn {
hasAccess: boolean | null;
AccessDeniedDialog: () => React.ReactElement | null;
}
/**
* 부가서비스 접근 권한을 체크하는 훅
* 페이지 마운트 시 extensionCheck API를 호출하여 권한을 확인하고,
* 권한이 없으면 다이얼로그를 표시한 후 이전 페이지로 이동합니다.
*/
export const useExtensionAccessCheck = ({
extensionCode,
enabled = true
}: UseExtensionAccessCheckProps): UseExtensionAccessCheckReturn => {
const { navigate } = useNavigate();
const { mutateAsync: extensionCheck } = useExtensionCheckMutation();
const [hasAccess, setHasAccess] = useState<boolean | null>(null);
const [isChecking, setIsChecking] = useState<boolean>(true);
const [dialogOpen, setDialogOpen] = useState<boolean>(false);
useEffect(() => {
if (!enabled) {
setIsChecking(false);
setHasAccess(true);
return;
}
const checkAccess = async () => {
try {
setIsChecking(true);
const result = await extensionCheck({ extensionCode });
if (result.checkResult === true) {
// 권한 체크 통과
setHasAccess(true);
} else {
// 권한 체크 실패 - 다이얼로그 표시
setHasAccess(false);
setDialogOpen(true);
}
} catch (error) {
console.error('Extension access check error:', error);
// 에러 발생 시에도 다이얼로그 표시
setHasAccess(false);
setDialogOpen(true);
} finally {
setIsChecking(false);
}
};
checkAccess();
}, [extensionCode, enabled]);
const handleConfirm = () => {
setDialogOpen(false);
setTimeout(() => {
navigate(PATHS.additionalService.list);
}, 0);
};
const AccessDeniedDialog = () => {
return (
<Dialog
open={dialogOpen}
onClose={() => {}}
message={
<>
.<br />
.
</>
}
buttonLabel={['확인']}
onConfirmClick={handleConfirm}
afterLeave={() => {}}
/>
);
};
return {
hasAccess,
AccessDeniedDialog,
};
};