diff --git a/app/login.jsx b/app/login.jsx index 390113a..7b124ec 100644 --- a/app/login.jsx +++ b/app/login.jsx @@ -1,5 +1,5 @@ import React, { useState, useEffect } from 'react'; -import { View, Text } from 'react-native'; +import { View, Text, ScrollView, KeyboardAvoidingView, Platform } from 'react-native'; import { StatusBar } from 'expo-status-bar'; import { useFormik } from 'formik'; import { SafeAreaView } from 'react-native-safe-area-context'; @@ -65,68 +65,78 @@ export default function Login() { }, [formValues]); return ( - + + - - - - - - Tones - Account Login - - {error ? {error} : null} - - - ... - - Login - + + + + + + + Tones + Account Login + + {error ? {error} : null} + + + ... + + Login + + + + Don't have an account already? + + Register + + + - - Don't have an account already? - - Register + Temporary Area: + + + Incidents - - - - Temporary Area: - - - Incidents - - - Landing - - - View Token: {expoPushToken} - - - - - ); - } \ No newline at end of file + + Landing + + + View Token: {expoPushToken} + + + + + + + ); +} \ No newline at end of file diff --git a/app/register.jsx b/app/register.jsx index b2ff8f2..f1f5462 100644 --- a/app/register.jsx +++ b/app/register.jsx @@ -1,9 +1,10 @@ import React, { useState, useEffect } from 'react'; import { router } from 'expo-router'; import { createUserWithEmailAndPassword, updateProfile } from 'firebase/auth'; +import { getDatabase, ref, set } from 'firebase/database'; import { auth } from '@/contexts/firebase'; import { useAuth } from '@/contexts/AuthContext'; -import { View, ScrollView, Text, TouchableOpacity } from 'react-native'; +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'; @@ -22,7 +23,8 @@ import { MessageBox, LoginTextInput, RegisterDropdownInput, -} from '../components/generalHelpers.jsx'; + formatPhoneNumber +} from '@/components/generalHelpers.jsx'; export default function Register() { const [providerDropdownOpen, setProviderDropdownOpen] = useState(false); @@ -50,6 +52,16 @@ export default function Register() { await updateProfile(userCredential.user, { displayName: `${values.firstName} ${values.lastName}` }); + + const db = getDatabase(); + await set(ref(db, 'users/' + userCredential.user.uid), { + firstName: values.firstName, + lastName: values.lastName, + number: values.number, + provider: values.provider, + email: values.email, + uid: userCredential.user.uid + }); router.replace('./incidents'); } catch (err) { setError(err.message); @@ -63,21 +75,20 @@ export default function Register() { useEffect(() => { if (formValues) { - if ( - formValues.email && - formValues.firstName && - formValues.lastName && - formValues.password.length !== 0 && - formValues.password === formValues.passwordConfirmation - ) { - setRegisterButtonDisabled(false); + 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]); + }, [formValues]) useEffect(() => { if (user) { @@ -86,7 +97,8 @@ export default function Register() { }, [user]); return ( - + + @@ -95,97 +107,105 @@ export default function Register() { - - - + + - - - {error ? {error} : null} - Tones - Account Register - - - - - - - - - ... - - Register - - - - - + + + + {error ? {error} : null} + Tones + Account Register + + + + + + + + + ... + + Register + + + + + + ) } \ No newline at end of file diff --git a/components/generalHelpers.jsx b/components/generalHelpers.jsx index 1e9f819..526b5e8 100644 --- a/components/generalHelpers.jsx +++ b/components/generalHelpers.jsx @@ -336,4 +336,28 @@ export const RegisterDropdownInput = ({ ) -} \ No newline at end of file +} + +export const formatPhoneNumber = (e) => { + let formattedNumber; + const length = e?.length; + + const regex = () => e.replace(/[^0-9\.]+/g, ""); + const areaCode = () => `(${regex().slice(0, 3)})`; + const firstSix = () => `${areaCode()} ${regex().slice(3, 6)}`; + const trailer = (start) => `${regex().slice(start, regex().length)}`; + + if (length <= 3) { + formattedNumber = regex(); + } else if (length === 4) { + formattedNumber = `${areaCode()} ${trailer(3)}`; + } else if (length === 5) { + formattedNumber = `${areaCode().replace(")", "")}`; + } else if (length >= 5 && length <= 9) { + formattedNumber = `${areaCode()} ${trailer(3)}`; + } else if (length >= 10) { + formattedNumber = `${firstSix()}-${trailer(6)}`; + } + + return formattedNumber; +}; \ No newline at end of file diff --git a/contexts/firebase.js b/contexts/firebase.js index 16b36bb..8a593f2 100644 --- a/contexts/firebase.js +++ b/contexts/firebase.js @@ -5,6 +5,7 @@ import ReactNativeAsyncStorage from '@react-native-async-storage/async-storage'; const firebaseConfig = { apiKey: process.env.EXPO_PUBLIC_FIREBASE_API_KEY, authDomain: process.env.EXPO_PUBLIC_FIREBASE_AUTH_DOMAIN, + databaseURL: process.env.EXPO_PUBLIC_FIREBASE_DATABASE_URL, projectId: process.env.EXPO_PUBLIC_FIREBASE_PROJECT_ID, storageBucket: process.env.EXPO_PUBLIC_FIREBASE_STORAGE_BUCKET, messagingSenderId: process.env.EXPO_PUBLIC_FIREBASE_MESSAGING_SENDER_ID,