guardia-messenger/hooks/useBiometric.ts
DESKTOP-TKLFCPRython b06a35c512 feat(ui): Manager DR·네트워크·CSAP 관제 + Messenger DR·네트워크 화면 구현
## GUARDiA Manager (frontend)
- pages/DrConsole.tsx — DR 재해복구 관제 (시나리오/RTO-RPO/테스트 실행)
- pages/NetworkConsole.tsx — 네트워크 장비 관제 (백업/diff/상태)
- pages/CsapConsole.tsx — CSAP 준수율 대시보드 (점검/Excel 다운로드)
- App.tsx — 3개 라우트 추가 (/dr, /network, /csap)
- Sidebar.tsx — '운영 관제' 그룹 메뉴 추가
- AppLayout.tsx — 페이지 타이틀 3개 추가

## GUARDiA Messenger (React Native)
- app/(tabs)/dr.tsx — DR 모니터링 화면 (M-01)
- app/(tabs)/network.tsx — 네트워크 장비 현황 화면 (M-02)
- app/(tabs)/_layout.tsx — DR·네트워크 탭 추가
- services/api.ts — DR/네트워크/CSAP API 함수 추가
- hooks/useBiometric.ts — 생체인증 훅 (M-03)
- hooks/useOfflineCache.ts — 오프라인 캐시 훅 (M-04)

## 매뉴얼
- 16_API_명세서.md — v2.2.0 업데이트
- 39_DR_네트워크장비_CSAP_운영가이드.md — Manager/Messenger UI 연동 현황 추가

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-31 09:53:17 +09:00

26 lines
856 B
TypeScript

import * as LocalAuth from 'expo-local-authentication'
export async function isBiometricAvailable(): Promise<boolean> {
const hasHardware = await LocalAuth.hasHardwareAsync()
const isEnrolled = await LocalAuth.isEnrolledAsync()
return hasHardware && isEnrolled
}
export async function authenticateWithBiometric(
promptMessage = 'GUARDiA 로그인'
): Promise<{ success: boolean; error?: string }> {
const available = await isBiometricAvailable()
if (!available) return { success: false, error: '생체인증을 사용할 수 없습니다.' }
const result = await LocalAuth.authenticateAsync({
promptMessage,
cancelLabel: '취소',
fallbackLabel: '비밀번호 사용',
disableDeviceFallback: false,
})
return result.success
? { success: true }
: { success: false, error: result.error ?? '인증 실패' }
}