import React, { useState, useEffect } from 'react'; import * as Notifications from 'expo-notifications'; import { router } from 'expo-router'; import { createUserWithEmailAndPassword, updateProfile } from 'firebase/auth'; import { auth } from '@/contexts/firebase'; import { useAuth } from '@/contexts/AuthContext'; import { View, ScrollView, Text, TouchableOpacity, KeyboardAvoidingView, Platform } from 'react-native'; import { StatusBar } from 'expo-status-bar'; import { useFormik } from 'formik'; import { SafeAreaView } from 'react-native-safe-area-context'; import { Ionicons } from '@expo/vector-icons'; import { providerMenu, PageHeader, StyledContainer, InnerContainer, StyledFormArea, Title, SubTitle, PageImage, StyledButton, ButtonText, MessageBox, LoginTextInput, RegisterDropdownInput, formatPhoneNumber } from '@/components/generalHelpers.jsx'; export default function Register() { const [providerDropdownOpen, setProviderDropdownOpen] = useState(false); const [hidePassword, setHidePassword] = useState(true); const [registerButtonDisabled, setRegisterButtonDisabled] = useState(true); const [error, setError] = useState(''); const [loading, setLoading] = useState(false); const { user } = useAuth(); const formik = useFormik({ initialValues: { firstName: '', lastName: '', number: '', provider: '', email: '', password: '', passwordConfirmation: '' }, onSubmit: async (values) => { setError(''); setLoading(true); try { const userCredential = await createUserWithEmailAndPassword(auth, values.email, values.password); await updateProfile(userCredential.user, { displayName: `${values.firstName} ${values.lastName}` }); // Request permissions and get push token (native FCM if possible, else Expo token) let token = null; let tokenType = null; const { status: existingStatus } = await Notifications.getPermissionsAsync(); let finalStatus = existingStatus; if (existingStatus !== 'granted') { const { status } = await Notifications.requestPermissionsAsync(); finalStatus = status; } if (finalStatus === 'granted') { try { // Try to get native FCM token (works in dev/prod builds, not Expo Go) const deviceToken = await Notifications.getDevicePushTokenAsync({ provider: 'fcm' }); if (deviceToken?.data) { token = deviceToken.data; tokenType = 'fcm'; } else { // Fallback to Expo push token const expoToken = await Notifications.getExpoPushTokenAsync(); token = expoToken.data; tokenType = 'expo'; } } catch (e) { // Fallback to Expo push token if native fails const expoToken = await Notifications.getExpoPushTokenAsync(); token = expoToken.data; tokenType = 'expo'; } } await postgresServices.createUser({ firstName: values.firstName, lastName: values.lastName, number: values.number, email: values.email, provider: values.provider, departments: [], token, uid: userCredential.user.uid }) router.replace('./incidents'); } catch (err) { setError(err.message); } finally { setLoading(false); } } }); const formValues = formik.values; useEffect(() => { if (formValues) { const regex = /^[^@]+@(?:[a-zA-Z0-9-]+\.)+[a-zA-Z0-9-]+$/; if ((formValues.number.length === 14 || (formValues.number.length === 10 && !formValues.number.includes('('))) && regex.test(formValues.email) && formValues.firstName && formValues.lastName) { if (formValues.password.length !== 0 && (formValues.password === formValues.passwordConfirmation)) { setRegisterButtonDisabled(false); } else { setRegisterButtonDisabled(true); } } else { setRegisterButtonDisabled(true); } } else { setRegisterButtonDisabled(true); } }, [formValues]) useEffect(() => { if (user) { router.replace('./incidents'); } }, [user]); return ( Back to Login } /> {error ? {error} : null} Tones Account Register ... Register ) }