mirror of
https://github.com/urosran/cally.git
synced 2025-11-26 08:24:55 +00:00
Auth logic rework
This commit is contained in:
@ -1,18 +1,19 @@
|
||||
import React, {useEffect, useState} from "react";
|
||||
import { Text, Button, TextInput } from "react-native";
|
||||
import { View, TextField, Picker, Checkbox } from "react-native-ui-lib";
|
||||
import {Button, Text, TextInput} from "react-native";
|
||||
import {Checkbox, Picker, TextField, View} from "react-native-ui-lib";
|
||||
import useAuth from "@/hooks/firebase/useAuth";
|
||||
import useChildren from "@/hooks/firebase/useChildren";
|
||||
import useCaregivers from "@/hooks/firebase/useCaregivers";
|
||||
import {useCreateSubUser} from "@/hooks/firebase/useCreateSubUser";
|
||||
import {email} from "@sideway/address";
|
||||
import {UserProfile} from "@/hooks/firebase/types/profileTypes";
|
||||
import {uuidv4} from "@firebase/util";
|
||||
import {useGetChildrenByParentId} from "@/hooks/firebase/useGetChildrenByParentId";
|
||||
import {ProfileType, useAuthContext} from "@/contexts/AuthContext";
|
||||
|
||||
const Screen: React.FC = () => {
|
||||
const {user, profileType, profileData} = useAuthContext()
|
||||
|
||||
const {
|
||||
user,
|
||||
profileType,
|
||||
email,
|
||||
setEmail,
|
||||
password,
|
||||
@ -21,17 +22,17 @@ const Screen: React.FC = () => {
|
||||
handleSignOut,
|
||||
handleProfileTypeSelection,
|
||||
handleRegister,
|
||||
|
||||
} = useAuth();
|
||||
|
||||
const {
|
||||
children,
|
||||
child,
|
||||
setChild,
|
||||
fetchChildren,
|
||||
handleNewChild,
|
||||
} = useChildren(user);
|
||||
|
||||
const {data: childrenByParentId} = useGetChildrenByParentId()
|
||||
|
||||
const {
|
||||
caregivers,
|
||||
caregiver,
|
||||
@ -52,13 +53,11 @@ const Screen: React.FC = () => {
|
||||
// contact: "+381628334",
|
||||
// ...child
|
||||
// })
|
||||
await fetchChildren();
|
||||
await fetchCaregivers();
|
||||
}
|
||||
|
||||
useEffect(() => {
|
||||
if (user) {
|
||||
fetchChildren();
|
||||
fetchCaregivers();
|
||||
}
|
||||
}, [user]);
|
||||
@ -126,9 +125,9 @@ const Screen: React.FC = () => {
|
||||
<View>
|
||||
{user ? (
|
||||
<View paddingH-20>
|
||||
{profileType === "parent" && <Text>Parent</Text>}
|
||||
{profileType === "child" && <Text>Child</Text>}
|
||||
{profileType === "caregiver" && <Text>Caregiver</Text>}
|
||||
{profileType === ProfileType.parent && <Text>Parent</Text>}
|
||||
{profileType === ProfileType.child && <Text>Child</Text>}
|
||||
{profileType === ProfileType.caregiver && <Text>Caregiver</Text>}
|
||||
<Button title="Sign Out" onPress={handleSignOut}/>
|
||||
<TextField
|
||||
placeholder={"Child Name"}
|
||||
|
||||
@ -5,7 +5,7 @@ import {useRouter} from "expo-router";
|
||||
import firestore from "@react-native-firebase/firestore";
|
||||
import {UserProfile} from "@/hooks/firebase/types/profileTypes";
|
||||
|
||||
type ProfileType = "parent" | "child" | "caregiver" | null;
|
||||
export enum ProfileType { "parent", "child", "caregiver" }
|
||||
|
||||
interface IAuthContext {
|
||||
user: FirebaseAuthTypes.User | null,
|
||||
@ -28,6 +28,8 @@ export const AuthContextProvider: FC<{ children: ReactNode }> = ({children}) =>
|
||||
const onAuthStateChanged = async (user: FirebaseAuthTypes.User | null) => {
|
||||
setUser(user);
|
||||
|
||||
console.log(user)
|
||||
|
||||
if (user) {
|
||||
try {
|
||||
const documentSnapshot = await firestore()
|
||||
@ -41,7 +43,7 @@ export const AuthContextProvider: FC<{ children: ReactNode }> = ({children}) =>
|
||||
|
||||
} catch (error) {
|
||||
console.error("Error fetching user profile type:", error);
|
||||
setProfileType(null);
|
||||
setProfileType(undefined);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -3,6 +3,7 @@ import {useMutation} from "react-query";
|
||||
import auth from "@react-native-firebase/auth";
|
||||
import firestore from "@react-native-firebase/firestore";
|
||||
import {User,} from "./types/profileTypes";
|
||||
import {useSignUp} from "@/hooks/firebase/useSignUp";
|
||||
|
||||
type ProfileType = "parent" | "child" | "caregiver" | null;
|
||||
|
||||
@ -17,6 +18,8 @@ const useAuth = () => {
|
||||
auth().signInWithEmailAndPassword(email, password)
|
||||
);
|
||||
const signOutMutation = useMutation(() => auth().signOut());
|
||||
const {mutateAsync: signUp } = useSignUp()
|
||||
|
||||
/*const setProfileDataMutation = useMutation((profileData) => {
|
||||
const currentUser = auth().currentUser;
|
||||
if (currentUser) {
|
||||
@ -35,11 +38,12 @@ const useAuth = () => {
|
||||
const handleRegister = async () => {
|
||||
try {
|
||||
|
||||
await createUserMutation.mutateAsync();
|
||||
await signUp({email, password})
|
||||
// await createUserMutation.mutateAsync();
|
||||
console.log("User registered!");
|
||||
|
||||
await signInMutation.mutateAsync();
|
||||
console.log("User signed in!");
|
||||
// await signInMutation.mutateAsync();
|
||||
// console.log("User signed in!");
|
||||
|
||||
/*let profileData: ParentProfile | ChildProfile | CaregiverProfile;
|
||||
switch (profileType) {
|
||||
|
||||
@ -1,12 +1,23 @@
|
||||
import {useMutation} from "react-query";
|
||||
import {useMutation, useQueryClient} from "react-query";
|
||||
import {UserProfile} from "@/hooks/firebase/types/profileTypes";
|
||||
import functions from '@react-native-firebase/functions';
|
||||
import {ProfileType, useAuthContext} from "@/contexts/AuthContext";
|
||||
|
||||
export const useCreateSubUser = () => {
|
||||
const queryClient = useQueryClient()
|
||||
const { profileType } = useAuthContext()
|
||||
|
||||
return useMutation({
|
||||
mutationKey: ["createSubUser"],
|
||||
mutationFn: async ({email, password, ...userProfile}: { email: string, password: string } & UserProfile) => {
|
||||
if(profileType === ProfileType.parent) {
|
||||
return await functions().httpsCallable("createSubUser")({email, password, ...userProfile})
|
||||
} else {
|
||||
throw Error("Can't create sub-users as a non-parent.")
|
||||
}
|
||||
},
|
||||
onSuccess: () => {
|
||||
queryClient.invalidateQueries({queryKey: ["getChildrenByParentId"]})
|
||||
}
|
||||
});
|
||||
}
|
||||
34
hooks/firebase/useGetChildrenByParentId.ts
Normal file
34
hooks/firebase/useGetChildrenByParentId.ts
Normal file
@ -0,0 +1,34 @@
|
||||
import {useQuery} from "react-query";
|
||||
import {ChildProfile} from "@/hooks/firebase/types/profileTypes";
|
||||
import firestore from "@react-native-firebase/firestore";
|
||||
import {useAuthContext} from "@/contexts/AuthContext";
|
||||
|
||||
export const useGetChildrenByParentId = () => {
|
||||
const {user} = useAuthContext()
|
||||
|
||||
return useQuery({
|
||||
queryKey: ["getChildrenByParentId", user?.uid],
|
||||
queryFn: async (): Promise<ChildProfile[]> => {
|
||||
try {
|
||||
const snapshot = await firestore()
|
||||
.collection("Profiles")
|
||||
.where("userType", "==", "child")
|
||||
.where("parentId", "==", user?.uid!)
|
||||
.get();
|
||||
|
||||
return snapshot.docs.map((doc) => {
|
||||
const data = doc.data();
|
||||
return {
|
||||
...data,
|
||||
birthday: data.birthday.toDate(),
|
||||
} as ChildProfile;
|
||||
});
|
||||
} catch (error) {
|
||||
console.error("Error retrieving child users:", error);
|
||||
return [];
|
||||
}
|
||||
},
|
||||
enabled: !!user?.uid
|
||||
}
|
||||
)
|
||||
}
|
||||
@ -1,11 +1,15 @@
|
||||
import {useMutation} from "react-query";
|
||||
import auth from "@react-native-firebase/auth";
|
||||
import {useUpdateUserData} from "@/hooks/firebase/useUpdateUserData";
|
||||
|
||||
export const useSignUp = () => {
|
||||
const { mutateAsync: updateUserData } = useUpdateUserData()
|
||||
|
||||
return useMutation({
|
||||
mutationKey: ["signUp"],
|
||||
mutationFn: async ({email, password}: { email: string, password: string }) => {
|
||||
await auth().createUserWithEmailAndPassword(email, password)
|
||||
await updateUserData({userType: "parent", email, password})
|
||||
}
|
||||
});
|
||||
}
|
||||
Reference in New Issue
Block a user