Files
insurance/src/navigation/RootNavigator.tsx
T
chpark c53cc69d97
Deploy / deploy (push) Failing after 0s
fix(kakao): Kakao SDK v2 authorize 방식으로 전환 + code 교환 엔드포인트
- Kakao SDK v2.7에서 Auth.login() 제거 → authorize() 리다이렉트 플로우 사용
- services/kakao.ts: kakaoWebLoginStart() redirect 시작
- RootNavigator: 웹 URL의 code + state=kakao_login 감지 → kakaoCodeLogin 호출
- useAuthStore.kakaoCodeLogin 추가 (authApi.kakaoCode 호출)
- 백엔드 /auth/kakao/code: REST API 키로 code→access_token 교환 후 기존 processKakaoLogin 재사용
- api-secrets에 kakaoRestApiKey/kakaoClientSecret 슬롯 추가
- 환경변수: KAKAO_REST_API_KEY 서버에 저장 완료

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-23 01:27:49 +09:00

105 lines
4.1 KiB
TypeScript

import React, { useEffect } from 'react';
import { View, ActivityIndicator, Platform } from 'react-native';
import { createNativeStackNavigator } from '@react-navigation/native-stack';
import BottomTabs from './BottomTabs';
import LoginScreen from '@/screens/auth/LoginScreen';
import RegisterScreen from '@/screens/auth/RegisterScreen';
import DiagnosisScreen from '@/screens/DiagnosisScreen';
import AnalysisScreen from '@/screens/AnalysisScreen';
import ScoreScreen from '@/screens/ScoreScreen';
import ConsultScreen from '@/screens/ConsultScreen';
import HiddenMoneyScreen from '@/screens/HiddenMoneyScreen';
import DiseaseCodeScreen from '@/screens/DiseaseCodeScreen';
import ClaimScreen from '@/screens/ClaimScreen';
import HealthCheckScreen from '@/screens/HealthCheckScreen';
import FamilyScreen from '@/screens/FamilyScreen';
import HospitalChecklistScreen from '@/screens/HospitalChecklistScreen';
import AIJudgeScreen from '@/screens/AIJudgeScreen';
import PremiumDietScreen from '@/screens/PremiumDietScreen';
import SilsonGenScreen from '@/screens/SilsonGenScreen';
import NotificationScreen from '@/screens/NotificationScreen';
import { useAuthStore } from '@/store/useAuthStore';
import { colors } from '@/theme/colors';
export type RootStackParamList = {
Login: undefined;
Register: undefined;
Tabs: undefined;
Diagnosis: undefined;
Analysis: undefined;
Score: undefined;
Consult: undefined;
HiddenMoney: undefined;
DiseaseCode: undefined;
Claim: undefined;
HealthCheck: undefined;
Family: undefined;
HospitalChecklist: undefined;
AIJudge: undefined;
PremiumDiet: undefined;
SilsonGen: undefined;
Notifications: undefined;
};
const Stack = createNativeStackNavigator<RootStackParamList>();
export default function RootNavigator() {
const { user, loading, hydrate, kakaoCodeLogin } = useAuthStore();
useEffect(() => {
// 카카오 OAuth redirect callback 처리 (웹 전용)
if (Platform.OS === 'web' && typeof window !== 'undefined') {
const params = new URLSearchParams(window.location.search);
const code = params.get('code');
const state = params.get('state');
if (code && state === 'kakao_login') {
const redirectUri = window.location.origin + '/';
// code 사용 후 URL 정리
window.history.replaceState({}, '', window.location.pathname);
kakaoCodeLogin(code, redirectUri).catch(() => {
hydrate();
});
return;
}
}
hydrate();
}, [hydrate, kakaoCodeLogin]);
if (loading) {
return (
<View style={{ flex: 1, alignItems: 'center', justifyContent: 'center', backgroundColor: colors.background }}>
<ActivityIndicator size="large" color={colors.primary} />
</View>
);
}
return (
<Stack.Navigator screenOptions={{ headerShown: false }}>
{user ? (
<>
<Stack.Screen name="Tabs" component={BottomTabs} />
<Stack.Screen name="Diagnosis" component={DiagnosisScreen} />
<Stack.Screen name="Analysis" component={AnalysisScreen} />
<Stack.Screen name="Score" component={ScoreScreen} />
<Stack.Screen name="Consult" component={ConsultScreen} />
<Stack.Screen name="HiddenMoney" component={HiddenMoneyScreen} />
<Stack.Screen name="DiseaseCode" component={DiseaseCodeScreen} />
<Stack.Screen name="Claim" component={ClaimScreen} />
<Stack.Screen name="HealthCheck" component={HealthCheckScreen} />
<Stack.Screen name="Family" component={FamilyScreen} />
<Stack.Screen name="HospitalChecklist" component={HospitalChecklistScreen} />
<Stack.Screen name="AIJudge" component={AIJudgeScreen} />
<Stack.Screen name="PremiumDiet" component={PremiumDietScreen} />
<Stack.Screen name="SilsonGen" component={SilsonGenScreen} />
<Stack.Screen name="Notifications" component={NotificationScreen} />
</>
) : (
<>
<Stack.Screen name="Login" component={LoginScreen} />
<Stack.Screen name="Register" component={RegisterScreen} />
</>
)}
</Stack.Navigator>
);
}