diff --git a/app/(auth)/settings/index.tsx b/app/(auth)/settings/index.tsx
index 4648f92..d3ace4d 100644
--- a/app/(auth)/settings/index.tsx
+++ b/app/(auth)/settings/index.tsx
@@ -1,12 +1,15 @@
import SettingsPage from "@/components/pages/settings/SettingsPage";
+import { AuthContextProvider } from "@/contexts/AuthContext";
import { SettingsContextProvider } from "@/contexts/SettingsContext";
import React from "react";
import { View } from "react-native-ui-lib";
export default function Screen() {
return (
-
-
-
+
+
+
+
+
);
}
diff --git a/components/pages/main/SignUpPage.tsx b/components/pages/main/SignUpPage.tsx
index 7af4d40..b359723 100644
--- a/components/pages/main/SignUpPage.tsx
+++ b/components/pages/main/SignUpPage.tsx
@@ -26,7 +26,7 @@ const SignUpPage = (props: { unsetRegister: () => any }) => {
const { mutateAsync: signUp } = useSignUp();
const handleSignUp = async () => {
- await signUp({ email, password });
+ await signUp({ email, password, firstName, lastName });
};
return (
diff --git a/components/pages/settings/SettingsPage.tsx b/components/pages/settings/SettingsPage.tsx
index 476c4ec..9a24d8d 100644
--- a/components/pages/settings/SettingsPage.tsx
+++ b/components/pages/settings/SettingsPage.tsx
@@ -5,6 +5,7 @@ import { Entypo, Ionicons, Octicons } from "@expo/vector-icons";
import CalendarSettingsPage from "./CalendarSettingsPage";
import ChoreRewardSettings from "./ChoreRewardSettings";
import UserSettings from "./UserSettings";
+import { AuthContextProvider } from "@/contexts/AuthContext";
const styles = StyleSheet.create({
mainBtn: {
@@ -24,74 +25,82 @@ const pageIndex = {
const SettingsPage = () => {
const [selectedPage, setSelectedPage] = useState(0);
return (
-
- {selectedPage == 0 && (
-
-
- )}
- {selectedPage == pageIndex.calendar && }
- {selectedPage == pageIndex.chore && }
- {selectedPage == pageIndex.user && }
-
+
+ {selectedPage == 0 && (
+
+ (
+
+ )}
+ onPress={() => setSelectedPage(pageIndex.user)}
+ />
+ (
+
+ )}
+ onPress={() => {
+ setSelectedPage(pageIndex.calendar);
+ }}
+ />
+ (
+
+ )}
+ onPress={() => setSelectedPage(pageIndex.chore)}
+ />
+ (
+
+ )}
+ color="#6c645b"
+ />
+
+ )}
+ {selectedPage == pageIndex.calendar && (
+
+ )}
+ {selectedPage == pageIndex.chore && (
+
+ )}
+ {selectedPage == pageIndex.user && (
+
+ )}
+
);
};
diff --git a/components/pages/settings/UserSettings.tsx b/components/pages/settings/UserSettings.tsx
index a33f03c..5e2f89f 100644
--- a/components/pages/settings/UserSettings.tsx
+++ b/components/pages/settings/UserSettings.tsx
@@ -4,6 +4,7 @@ import { Ionicons } from "@expo/vector-icons";
import { ScrollView, StyleSheet } from "react-native";
import MyProfile from "./user_settings_views/MyProfile";
import MyGroup from "./user_settings_views/MyGroup";
+import { useAuthContext } from "@/contexts/AuthContext";
const UserSettings = (props: { setSelectedPage: (page: number) => void }) => {
const [selectedView, setSelectedView] = useState(true);
diff --git a/components/pages/settings/user_settings_views/MyProfile.tsx b/components/pages/settings/user_settings_views/MyProfile.tsx
index d8d6ecc..b3c894f 100644
--- a/components/pages/settings/user_settings_views/MyProfile.tsx
+++ b/components/pages/settings/user_settings_views/MyProfile.tsx
@@ -1,8 +1,19 @@
import { View, Text, TextField } from "react-native-ui-lib";
-import React from "react";
+import React, { useState } from "react";
import { StyleSheet } from "react-native";
import { ScrollView } from "react-native-gesture-handler";
+import { useAuthContext } from "@/contexts/AuthContext";
+import { useSettingsContext } from "@/contexts/SettingsContext";
+import { useUpdateUserData } from "@/hooks/firebase/useUpdateUserData";
const MyProfile = () => {
+ const { user, profileData } = useAuthContext();
+
+ const [lastName, setLastName] = useState(profileData?.lastName || "");
+ const [firstName, setFirstName] = useState(
+ profileData?.firstName || ""
+ );
+
+ const { mutateAsync: updateUserData } = useUpdateUserData();
return (
@@ -18,15 +29,38 @@ const MyProfile = () => {
First name
-
+ {
+ setFirstName(value);
+ await updateUserData({ newUserData: { firstName: value } });
+ }}
+ />
Last name
-
+ {
+ setLastName(value);
+ await updateUserData({ newUserData: { lastName: value } });
+ }}
+ />
Email address
-
+
@@ -35,7 +69,7 @@ const MyProfile = () => {
Time Zone
-
+
);
diff --git a/components/pages/todos/AddChore.tsx b/components/pages/todos/AddChore.tsx
index 96f93d5..f42f84a 100644
--- a/components/pages/todos/AddChore.tsx
+++ b/components/pages/todos/AddChore.tsx
@@ -20,6 +20,7 @@ import LinearGradient from "react-native-linear-gradient";
import { PanningDirectionsEnum } from "react-native-ui-lib/src/components/panningViews/panningProvider";
import { repeatOptions, useToDosContext } from "@/contexts/ToDosContext";
import { setDate } from "date-fns";
+import PointsSlider from "@/components/shared/PointsSlider";
const AddChore = () => {
const { addToDo, toDos } = useToDosContext();
@@ -232,36 +233,11 @@ const AddChore = () => {
Reward Points
-
-
- setPoints(value)}
- minimumValue={0}
- step={10}
- maximumValue={100}
- />
-
- 0
- 50
- 100
-
-
-
- {
- handleChange(text);
- }}
- containerStyle={{
- borderWidth: 1,
- borderColor: "#d9d9d9",
- width: 45,
- borderRadius: 5,
- }}
- />
-
-
+
);
diff --git a/components/shared/PointsSlider.tsx b/components/shared/PointsSlider.tsx
new file mode 100644
index 0000000..d99406d
--- /dev/null
+++ b/components/shared/PointsSlider.tsx
@@ -0,0 +1,43 @@
+import { View, Text, Slider, TextField } from "react-native-ui-lib";
+import React from "react";
+
+const PointsSlider = (props: {
+ points: number;
+ setPoints(value: number): void;
+ handleChange(value: string): void;
+}) => {
+ return (
+
+
+ props.setPoints(value)}
+ minimumValue={0}
+ step={10}
+ maximumValue={100}
+ />
+
+ 0
+ 50
+ 100
+
+
+
+ {
+ props.handleChange(text);
+ }}
+ containerStyle={{
+ borderWidth: 1,
+ borderColor: "#d9d9d9",
+ width: 45,
+ borderRadius: 5,
+ }}
+ />
+
+
+ );
+};
+
+export default PointsSlider;
diff --git a/contexts/SettingsContext.tsx b/contexts/SettingsContext.tsx
index c28920c..c40ff46 100644
--- a/contexts/SettingsContext.tsx
+++ b/contexts/SettingsContext.tsx
@@ -1,4 +1,5 @@
import { createContext, FC, ReactNode, useContext, useState } from "react";
+import { useAuthContext } from "./AuthContext";
export const colorMap = {
pink: "#ea156c",
@@ -8,8 +9,16 @@ export const colorMap = {
purple: "#7305d4",
};
+interface IUserDetails {
+ email: string | undefined;
+ firstName: string;
+ lastName: string;
+}
+
interface ISettingsContext {
calendarColor: string;
+ userDetails: IUserDetails;
+ editUserDetails: (details: Partial) => void;
setCalendarColor: (color: string) => void;
}
@@ -18,10 +27,24 @@ const SettingsContext = createContext(undefined!);
export const SettingsContextProvider: FC<{ children: ReactNode }> = ({
children,
}) => {
+ const { user } = useAuthContext();
+ const [userDetails, setUserDetails] = useState({
+ email: user?.email?.toString(),
+ firstName: "",
+ lastName: "",
+ });
const [calendarColor, setCalendarColor] = useState(colorMap.pink);
+ const editUserDetails = (details: Partial) => {
+ setUserDetails((prevDetails) => ({
+ ...prevDetails,
+ ...details,
+ }));
+ };
return (
-
+
{children}
);
diff --git a/firebase/firestore.rules b/firebase/firestore.rules
index a1d67bd..84ce14e 100644
--- a/firebase/firestore.rules
+++ b/firebase/firestore.rules
@@ -13,7 +13,7 @@ service cloud.firestore {
// all client requests to your Firestore database will be denied until you Update
// your rules
match /{document=**} {
- allow read, write: if request.time < timestamp.date(2024, 9, 5);
+ allow read, write;
}
}
}
\ No newline at end of file
diff --git a/hooks/firebase/types/profileTypes.ts b/hooks/firebase/types/profileTypes.ts
index 659260d..397a102 100644
--- a/hooks/firebase/types/profileTypes.ts
+++ b/hooks/firebase/types/profileTypes.ts
@@ -7,7 +7,8 @@ export interface User {
export interface UserProfile {
userType: ProfileType;
- name: string;
+ firstName: string;
+ lastName: string;
childrenIds?: string[];
birthday?: Date;
parentId?: string;
diff --git a/hooks/firebase/useSignUp.ts b/hooks/firebase/useSignUp.ts
index c16cf0f..cbdc733 100644
--- a/hooks/firebase/useSignUp.ts
+++ b/hooks/firebase/useSignUp.ts
@@ -8,9 +8,9 @@ export const useSignUp = () => {
return useMutation({
mutationKey: ["signUp"],
- mutationFn: async ({email, password}: { email: string, password: string }) => {
+ mutationFn: async ({email, password, firstName, lastName}: { email: string, password: string, firstName: string, lastName: string }) => {
const res = await auth().createUserWithEmailAndPassword(email, password);
- await updateUserData({newUserData: {userType: ProfileType.PARENT}, customUser: res.user});
+ await updateUserData({newUserData: {userType: ProfileType.PARENT, firstName: firstName, lastName: lastName}, customUser: res.user});
}
});
}
\ No newline at end of file
diff --git a/hooks/firebase/useUpdateUserData.ts b/hooks/firebase/useUpdateUserData.ts
index 55dfd91..b2070e2 100644
--- a/hooks/firebase/useUpdateUserData.ts
+++ b/hooks/firebase/useUpdateUserData.ts
@@ -17,7 +17,7 @@ export const useUpdateUserData = () => {
await firestore()
.collection("Profiles")
.doc(user.uid)
- .set(newUserData);
+ .update(newUserData);
const profileData = await firestore().collection("Profiles").doc(user?.uid!).get()
setProfileData(profileData.data() as UserProfile)