import React, {useEffect, useState} from 'react'; import {StyleSheet, ActivityIndicator, SafeAreaView, View, Platform, KeyboardAvoidingView} from 'react-native'; import {useAuthStore} from '@/store/authStore'; import {useRouter} from 'expo-router'; import {Box} from "@/components/ui/box" import {Button, ButtonText, ButtonIcon} from "@/components/ui/button" import {Center} from "@/components/ui/center" import {Heading} from "@/components/ui/heading" import {Input, InputField, InputIcon, InputSlot} from "@/components/ui/input" import {Text} from "@/components/ui/text" import {VStack} from "@/components/ui/vstack" import {HStack} from "@/components/ui/hstack" import {ArrowRightIcon, EyeIcon, EyeOffIcon} from "@/components/ui/icon" import {Divider} from '@/components/ui/divider'; import {Ionicons} from "@expo/vector-icons"; import * as WebBrowser from 'expo-web-browser'; import * as Google from "expo-auth-session/providers/google"; import AsyncStorage from "@react-native-async-storage/async-storage"; import {makeRedirectUri} from "expo-auth-session"; import Constants from 'expo-constants'; WebBrowser.maybeCompleteAuthSession(); // client_id ios 936418008320-ohefdfcebd41f6oa2o8phh1mgj9s49sl.apps.googleusercontent.com // android 936418008320-d8dfjph5e4r28fcm1rbdfbh5phmbg03d.apps.googleusercontent.com export default function Login() { const [email, setEmail] = useState(''); const [password, setPassword] = useState(''); const [emailError, setEmailError] = useState(''); const [showPassword, setShowPassword] = useState(false) const {signIn, isLoading, signInWithGoogle} = useAuthStore(); const router = useRouter(); const [request, response, promptAsync] = Google.useAuthRequest({ androidClientId: "936418008320-d8dfjph5e4r28fcm1rbdfbh5phmbg03d.apps.googleusercontent.com", iosClientId: "936418008320-ohefdfcebd41f6oa2o8phh1mgj9s49sl.apps.googleusercontent.com", webClientId: "936418008320-btdngtlfnjac1p67guje72m9el5q59a7.apps.googleusercontent.com", redirectUri: Platform.OS === 'android' ? makeRedirectUri({ scheme: Constants.expoConfig.android.package, path: '/', }) : undefined, }) const handleInternalLogin = async () => { if (!email || !password) { alert('Proszę wprowadzić email i hasło.'); return; } if (!validateEmail(email)) { setEmailError('Nieprawidłowy format adresu email'); return; } try { await signIn(email, password); alert(`Zalogowano jako ${email}`); router.replace('/'); } catch (e) { alert("Błąd logowania: " + (e.response?.data?.message || e.message)); } } useEffect(() => { handleGoogleLogin(); }, [response]); const handleGoogleLogin = async () => { // const user = await AsyncStorage.getItem("@user"); let user = null; if (!user) { if (response.type === "success") { user = await getUserInfo(response.authentication.accessToken) await signInWithGoogle(response.authentication.accessToken); alert(`Zalogowano jako ${user.email}`); router.replace('/'); } } else { console.info("Pobrano użytkownika z AsyncStorage:", JSON.parse(user)); alert(`Zalogowano jako ${user.email}`); } }; const getUserInfo = async (token) => { if (!token) { return } try { const response = await fetch("https://www.googleapis.com/userinfo/v2/me", { headers: { Authorization: `Bearer ${token}` }, } ); const user = await response.json(); await AsyncStorage.setItem("@user", JSON.stringify(user)); return user; } catch (error) { console.error("Błąd podczas pobierania informacji o użytkowniku:", error); throw error; } } const validateEmail = (email) => { const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; return emailRegex.test(email); }; const handleShowPassword = () => { setShowPassword((showState) => { return !showState }) } if (isLoading) { return ( ); } return (
Logowanie {/* */} {/* */} {emailError ? {emailError} : null} { setEmail(text); if (text && !validateEmail(text)) { setEmailError('Nieprawidłowy format adresu email'); } else { setEmailError(''); } }} /> lub
); } const styles = StyleSheet.create({ container: { flex: 1, justifyContent: 'center', padding: 20, }, input: { borderWidth: 1, borderColor: '#ddd', borderRadius: 5, marginBottom: 15, padding: 10, }, errorText: { color: 'red', fontSize: 12, }, signupbutton: { fontWeight: '300', }, });