c53cc69d97
Deploy / deploy (push) Failing after 0s
- 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>
105 lines
4.1 KiB
TypeScript
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>
|
|
);
|
|
}
|