import React from 'react'; import * as AppleAuthentication from 'expo-apple-authentication'; import { StyleSheet, Alert } from 'react-native'; import { ThemedView } from '@/components/ThemedView'; import { useColorScheme } from '@/hooks/useColorScheme'; import * as Notifications from 'expo-notifications'; import Constants from 'expo-constants'; import { saveUserData } from '@/components/services/securestorage/UserData'; type UserData = { appleId: string; appleEmail: string; fullName: string; pushToken: string; }; export default function SignInScreen({ onSignIn }: { onSignIn: () => void }) { const scheme = useColorScheme() ?? 'light'; const handleAppleSignIn = async () => { try { const credential = await AppleAuthentication.signInAsync({ requestedScopes: [ AppleAuthentication.AppleAuthenticationScope.FULL_NAME, AppleAuthentication.AppleAuthenticationScope.EMAIL, ], }); const projectId = Constants.expoConfig?.extra?.eas?.projectId; if (!projectId) { throw new Error('Project ID not found'); } const pushToken = await Notifications.getExpoPushTokenAsync({ projectId: projectId }); console.log(credential.user, credential.email, credential.fullName, credential.fullName?.givenName, credential.fullName?.familyName, pushToken); const response = await fetch(`${process.env.EXPO_PUBLIC_API_URL}/users/createUser`, { method: 'POST', headers: { 'Content-Type': 'application/json', 'x-api-key': process.env.EXPO_PUBLIC_API_KEY ?? '', }, body: JSON.stringify({ appleId: credential.user, appleEmail: credential.email, fullName: `${credential.fullName?.givenName} ${credential.fullName?.familyName}`, pushToken: pushToken.data, }), }); if (!response.ok) { throw new Error('Failed to create user'); } const userData = await response.json(); await saveUserData(userData); onSignIn(); } catch (error) { if (error.code === 'ERR_REQUEST_CANCELLED') { // Handle when user cancels sign in console.error('User canceled sign in', error); Alert.alert('An error occurred', 'User canceled sign in'); } else { console.error('An unknown error occurred', error); Alert.alert('Unknown error', 'An unknown error occurred'); } } }; return ( ); } const styles = StyleSheet.create({ container: { flex: 1, alignItems: 'center', justifyContent: 'center', }, button: { width: 200, height: 44, }, });