diff --git a/.idea/.gitignore b/.idea/.gitignore
new file mode 100644
index 0000000..26d3352
--- /dev/null
+++ b/.idea/.gitignore
@@ -0,0 +1,3 @@
+# Default ignored files
+/shelf/
+/workspace.xml
diff --git a/.idea/matadors-rn-medica.iml b/.idea/matadors-rn-medica.iml
new file mode 100644
index 0000000..d6ebd48
--- /dev/null
+++ b/.idea/matadors-rn-medica.iml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/misc.xml b/.idea/misc.xml
new file mode 100644
index 0000000..639900d
--- /dev/null
+++ b/.idea/misc.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/modules.xml b/.idea/modules.xml
new file mode 100644
index 0000000..45338b1
--- /dev/null
+++ b/.idea/modules.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/other.xml b/.idea/other.xml
new file mode 100644
index 0000000..0d3a1fb
--- /dev/null
+++ b/.idea/other.xml
@@ -0,0 +1,263 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/vcs.xml b/.idea/vcs.xml
new file mode 100644
index 0000000..35eb1dd
--- /dev/null
+++ b/.idea/vcs.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app.json b/app.json
index ab01d79..b7b2fad 100644
--- a/app.json
+++ b/app.json
@@ -8,8 +8,9 @@
"icon": "./assets/images/icon.png",
"splash": {
"image": "./assets/images/splash.png",
- "resizeMode": "contain",
- "backgroundColor": "#000000"
+ "resizeMode": "cover",
+ "backgroundColor": "#ffffff",
+ "textAlign": "center"
},
"assetBundlePatterns": [
"**/*"
diff --git a/app/(app)/ActionMenu/AllDoctorScreen.tsx b/app/(app)/ActionMenu/AllDoctorScreen.tsx
index 30791c8..c770746 100644
--- a/app/(app)/ActionMenu/AllDoctorScreen.tsx
+++ b/app/(app)/ActionMenu/AllDoctorScreen.tsx
@@ -1,34 +1,46 @@
-import React,{ReactElement, useEffect, useState} from 'react';
-import { StyleSheet, Text, Image, View, TouchableHighlight, SafeAreaView, Button, Alert, Platform, Dimensions,TextInput, ScrollView, Pressable} from 'react-native'
-import { Feather } from '@expo/vector-icons';
-import { AntDesign } from '@expo/vector-icons';
-import { Ionicons } from '@expo/vector-icons';
-import DoctorComponent from '@/components/DoctorComponent';
-import { FontAwesome } from '@expo/vector-icons';
-import { SvgXml } from "react-native-svg"
-import { whiteHeart } from '@/assets/icons/whiteHeart';
-import { blueheart } from '@/assets/icons/blueHeart';
-import { star } from '@/assets/icons/star';
-import { search } from '@/assets/icons/search';
-import { more } from '@/assets/icons/more';
-import { LightleftArrow } from '@/assets/icons/left';
-import HeaderComponent from '@/components/HeaderComponent';
-import SearchComponent from '@/components/SearchComponent';
-import FoundDoctorCount from '@/components/FoundDoctorCount';
-import NofoundComponent from '@/components/NofoundComponent';
-import RemovefavoritePopup from '@/components/RemovefavoritePopup';
-import FilterPopup from '@/components/FilterSearchComponent';
-import { StatusBar } from 'expo-status-bar';
-import NotFoundScreen from '@/app/+not-found';
-import { ThemeContext } from '@/ctx/ThemeContext';
-import { useContext } from 'react';
-import { supabase } from '@/lib/supabase';
-import { router } from 'expo-router';
-
-
+import React, { ReactElement, useEffect, useState } from "react";
+import {
+ StyleSheet,
+ Text,
+ Image,
+ View,
+ TouchableHighlight,
+ SafeAreaView,
+ Button,
+ Alert,
+ Platform,
+ Dimensions,
+ TextInput,
+ ScrollView,
+ Pressable,
+} from "react-native";
+import { Feather } from "@expo/vector-icons";
+import { AntDesign } from "@expo/vector-icons";
+import { Ionicons } from "@expo/vector-icons";
+import DoctorComponent from "@/components/DoctorComponent";
+import { FontAwesome } from "@expo/vector-icons";
+import { SvgXml } from "react-native-svg";
+import { whiteHeart } from "@/assets/icons/whiteHeart";
+import { blueheart } from "@/assets/icons/blueHeart";
+import { star } from "@/assets/icons/star";
+import { search } from "@/assets/icons/search";
+import { more } from "@/assets/icons/more";
+import { LightleftArrow } from "@/assets/icons/left";
+import HeaderComponent from "@/components/HeaderComponent";
+import SearchComponent from "@/components/SearchComponent";
+import FoundDoctorCount from "@/components/FoundDoctorCount";
+import NofoundComponent from "@/components/NofoundComponent";
+import RemovefavoritePopup from "@/components/RemovefavoritePopup";
+import FilterPopup from "@/components/FilterSearchComponent";
+import { StatusBar } from "expo-status-bar";
+import NotFoundScreen from "@/app/+not-found";
+import { ThemeContext } from "@/ctx/ThemeContext";
+import { useContext } from "react";
+import { supabase } from "@/lib/supabase";
+import { router } from "expo-router";
const tableName = "doctors";
-const favoriteTable="favorite_doctors"
+const favoriteTable = "favorite_doctors";
interface imageMapProp {
[key: string]: ReturnType;
@@ -37,15 +49,15 @@ interface imageMapProp {
interface iconMappingProp {
[key: string]: ReactElement;
}
-interface Doctor{
- id: number,
- first_name: string,
- last_name: string,
- hospital: string,
- rate: string,
- review: string,
- specialization: string,
- about:string
+interface Doctor {
+ id: number;
+ first_name: string;
+ last_name: string;
+ hospital: string;
+ rate: string;
+ review: string;
+ specialization: string;
+ about: string;
}
export const iconMapping: iconMappingProp = {
@@ -61,141 +73,149 @@ function DoctorScreen() {
const [showFilter, setShowfilter] = useState(false);
const [doctors, setDoctors] = useState([]);
const { theme, changeTheme } = useContext(ThemeContext);
- const [selectedSpecilization, setSelectedSpecilization] = useState("All")
- const [specialization, setSpecialization] = useState([])
- const [isloading, setIsLoading] = useState(false)
- const [favoriteDoctors,setFavoriteDoctors]=useState([])
+ const [selectedSpecilization, setSelectedSpecilization] =
+ useState("All");
+ const [specialization, setSpecialization] = useState([]);
+ const [isloading, setIsLoading] = useState(false);
+ const [favoriteDoctors, setFavoriteDoctors] = useState([]);
const containerStyle =
theme === "dark" ? styles.outerDark : styles.outerLight;
const scrollbackColor =
theme === "dark" ? styles.scrollDark : styles.scrollLight;
- const [loggeduser, setLoggedUser] = useState()
- const [profile, setProfile] = useState(null)
- const [patient_id,setPatient_id]=useState()
+ const [loggeduser, setLoggedUser] = useState();
+ const [profile, setProfile] = useState(null);
+ const [patient_id, setPatient_id] = useState();
useEffect(() => {
const fetchUser = async () => {
-
- const { data: { user },error } = await supabase.auth.getUser()
+ const {
+ data: { user },
+ error,
+ } = await supabase.auth.getUser();
if (error) {
- console.error("error fetching user")
+ console.error("error fetching user");
} else {
- setLoggedUser(user?.id)
+ setLoggedUser(user?.id);
}
- }
- fetchUser()
-
- }, [loggeduser])
+ };
+ fetchUser();
+ }, [loggeduser]);
useEffect(() => {
const fetchUserProfile = async () => {
if (loggeduser) {
const { data, error } = await supabase
.from("patients")
.select("*")
- .eq('auth_id', loggeduser)
- .single()
+ .eq("auth_id", loggeduser)
+ .single();
if (error) {
- console.error("error while retrieving profile",error)
+ console.error("error while retrieving profile", error);
} else {
- setProfile(data)
- setPatient_id(data.id)
- console.log(data)
-
+ setProfile(data);
+ setPatient_id(data.id);
+ // console.log(data)
}
-
-
}
- }
- fetchUserProfile()
- }, [loggeduser])
-
- useEffect(() => {
- async function fetchData() {
- setIsLoading(true);
-
- const { data: doctorData, error: doctorError } = await supabase.from('doctors').select('*');
- if (doctorError) {
- setIsLoading(false);
- throw new Error('Error fetching data:' + doctorError.message);
- }
-
- const uniqueSpecialization = Array.from(new Set(doctorData.map((doctor) => doctor.specialization)));
- setSpecialization(['All', ...uniqueSpecialization]);
-
- const docIds = doctorData.map(doc => doc.id);
-
- const { data: reviewData, error: reviewError } = await supabase
- .from('reviews')
- .select('*')
- .in('doctor_id', docIds);
-
- if (reviewError) {
- setIsLoading(false);
- console.error('Error fetching reviews:', reviewError);
- return;
- }
-
- const mergedData = doctorData.map(doctor => {
- const reviews = reviewData.filter(review => review.doctor_id === doctor.id);
-
-
- const totalStars = reviews.reduce((sum, review) => sum + parseFloat(review.stars), 0);
- const result= reviews.length === 0 ? 0 :(totalStars / reviews.length).toFixed(1);
-
- return { ...doctor, reviews ,result };
- });
-
- setDoctors(mergedData);
+ };
+ fetchUserProfile();
+ }, [loggeduser]);
+
+ useEffect(() => {
+ async function fetchData() {
+ setIsLoading(true);
+
+ const { data: doctorData, error: doctorError } = await supabase
+ .from("doctors")
+ .select("*");
+ if (doctorError) {
setIsLoading(false);
+ throw new Error("Error fetching data:" + doctorError.message);
}
-
- fetchData();
- }, []);
- console.log("this is retrived specilization:", specialization)
- useEffect(() => {
- const fetchFavoritesDoctor = async () => {
- if (patient_id) {
- const { data, error } = await supabase
- .from(favoriteTable)
- .select("*")
- .eq("patient", patient_id)
- if (error) {
- console.error("error while fetching ",error)
- }
-
- setFavoriteDoctors(data?.map((item:any)=>item.favorite_doctor)||[])
- }
-
- }
- fetchFavoritesDoctor()
-
- },[patient_id])
- const handleSearchPressed = () => {
- setShowSearch(true)
- }
- const handleSearchSubmit = (text: string) => {
- setSearchTerm(text.toLowerCase())
- }
-
- const handleFilter = () => {
- setShowfilter(true)
+
+ const uniqueSpecialization = Array.from(
+ new Set(doctorData.map((doctor) => doctor.specialization))
+ );
+ setSpecialization(["All", ...uniqueSpecialization]);
+
+ const docIds = doctorData.map((doc) => doc.id);
+
+ const { data: reviewData, error: reviewError } = await supabase
+ .from("reviews")
+ .select("*")
+ .in("doctor_id", docIds);
+
+ if (reviewError) {
+ setIsLoading(false);
+ console.error("Error fetching reviews:", reviewError);
+ return;
+ }
+
+ const mergedData = doctorData.map((doctor) => {
+ const reviews = reviewData.filter(
+ (review) => review.doctor_id === doctor.id
+ );
+
+ const totalStars = reviews.reduce(
+ (sum, review) => sum + parseFloat(review.stars),
+ 0
+ );
+ const result =
+ reviews.length === 0 ? 0 : (totalStars / reviews.length).toFixed(1);
+
+ return { ...doctor, reviews, result };
+ });
+
+ setDoctors(mergedData);
+ setIsLoading(false);
}
-
+
+ fetchData();
+ }, []);
+ // console.log("this is retrived specilization:", specialization)
+ useEffect(() => {
+ const fetchFavoritesDoctor = async () => {
+ if (patient_id) {
+ const { data, error } = await supabase
+ .from(favoriteTable)
+ .select("*")
+ .eq("patient", patient_id);
+ if (error) {
+ console.error("error while fetching ", error);
+ }
+
+ setFavoriteDoctors(
+ data?.map((item: any) => item.favorite_doctor) || []
+ );
+ }
+ };
+ fetchFavoritesDoctor();
+ }, [patient_id]);
+ const handleSearchPressed = () => {
+ setShowSearch(true);
+ };
+ const handleSearchSubmit = (text: string) => {
+ setSearchTerm(text.toLowerCase());
+ };
+
+ const handleFilter = () => {
+ setShowfilter(true);
+ };
+
const handleSpecializationChange = (specialization: string) => {
- setSelectedSpecilization(specialization)
- setSearchTerm('')
-
- }
+ setSelectedSpecilization(specialization);
+ setSearchTerm("");
+ };
const handleAddfovorite = async (doctorId: number) => {
- const patientId = patient_id
- const { error } = await supabase.from(favoriteTable).insert({ patient: patientId, favorite_doctor: doctorId })
+ const patientId = patient_id;
+ const { error } = await supabase
+ .from(favoriteTable)
+ .insert({ patient: patientId, favorite_doctor: doctorId });
if (error) {
- console.error("error while adding doctor to favorite", error)
+ console.error("error while adding doctor to favorite", error);
return;
}
- setFavoriteDoctors(prev=>[...prev,doctorId])
-
- }
+ setFavoriteDoctors((prev) => [...prev, doctorId]);
+ };
const updateFavoriteDoctors = async () => {
const { data, error } = await supabase
.from("favorite_doctors")
@@ -204,10 +224,12 @@ function DoctorScreen() {
if (error) {
console.error("Error fetching favorite doctors:", error);
} else {
- setFavoriteDoctors(data.map((item: { favorite_doctor: number }) => item.favorite_doctor));
+ setFavoriteDoctors(
+ data.map((item: { favorite_doctor: number }) => item.favorite_doctor)
+ );
}
};
- const handleIconClick = (doctor: Doctor,doctorId:number) => {
+ const handleIconClick = (doctor: Doctor, doctorId: number) => {
if (favoriteDoctors.includes(doctor.id)) {
setSelectedDoctor(doctor);
setShowPopup(true);
@@ -215,145 +237,139 @@ function DoctorScreen() {
handleAddfovorite(doctorId);
}
};
-
-
- const filteredDoctors = doctors.filter(doctor => {
- const matchSearchTerm = searchTerm.length > 0 ? doctor.last_name.toLowerCase().includes(searchTerm.toLowerCase())||doctor.first_name.toLowerCase().includes(searchTerm.toLowerCase()) : true
- const matchSpecialization = selectedSpecilization === 'All' || doctor.specialization === selectedSpecilization
- return matchSearchTerm&&matchSpecialization
-
- })
+ const filteredDoctors = doctors.filter((doctor) => {
+ const matchSearchTerm =
+ searchTerm.length > 0
+ ? doctor.last_name.toLowerCase().includes(searchTerm.toLowerCase()) ||
+ doctor.first_name.toLowerCase().includes(searchTerm.toLowerCase())
+ : true;
+ const matchSpecialization =
+ selectedSpecilization === "All" ||
+ doctor.specialization === selectedSpecilization;
+ return matchSearchTerm && matchSpecialization;
+ });
- return (
-
-
-
-
-
- {
- !showSearch ? (
-
- ) : (
-
-
- )
- }
-
-
-
+
+
+
+ {!showSearch ? (
+
+ ) : (
+
+ )}
+
+
+
+ {specialization.map((specialization, index) => (
+ handleSpecializationChange(specialization)}
+ style={[
+ styles.categoryBtn,
+ selectedSpecilization === specialization
+ ? styles.firstCategoryBtn
+ : {},
+ ]}
+ >
+
+ {specialization}
+
+
+ ))}
+
+
+
+ {showSearch && }
+
+
+
-
- {specialization.map((specialization, index) =>
- handleSpecializationChange(specialization)} style={[styles.categoryBtn,
- selectedSpecilization === specialization ? styles.firstCategoryBtn : {},
- ]}>
-
- {specialization}
-
-
- )}
-
-
-
-
- {showSearch && (
-
- )}
-
-
-
- {filteredDoctors.length > 0 ? (
-
- filteredDoctors.map((doctor: any, index: number) => {
-
-
- return(
-
+ paddingBottom: 150,
+ paddingTop: 20,
+ }}
+ >
+ {filteredDoctors.length > 0 ? (
+ filteredDoctors.map((doctor: any, index: number) => {
+ return (
+
router.push({ pathname: "/ActionMenu/Booking/Doctor_details", params: { id: doctor.id } })}
+ path={() =>
+ router.push({
+ pathname: "/ActionMenu/Booking/Doctor_details",
+ params: { id: doctor.id },
+ })
+ }
imageSource={{ uri: doctor.image }}
name={`${doctor.first_name} ${doctor.last_name}`}
- iconComponent={favoriteDoctors.includes(doctor.id) ? (
-
- ) : (
-
- )}
+ iconComponent={
+ favoriteDoctors.includes(doctor.id) ? (
+
+ ) : (
+
+ )
+ }
professionalTitle={doctor.specialization}
hospital={doctor.hospital_name}
star={}
review={doctor.reviews.length}
rate={doctor.result}
- addRemoveFavorite={() => handleIconClick(doctor,doctor.id) }
-
-
+ addRemoveFavorite={() =>
+ handleIconClick(doctor, doctor.id)
+ }
/>
-
- )})
-
- ) : (
-
- )}
-
-
-
-
-
-
-
-
-
- setShowPopup(false)}
- visible={showpopUp}
- onClose={() => setShowPopup(false)}
- doctor={selectedDoctor}
- updateFavoriteDoctors={updateFavoriteDoctors}
-
-
- />
- setShowfilter(false)}
- visible={showFilter}
- onClose={() => setShowfilter(false)}
-
-
-
- />
-
-
-
-
-
- );
+ );
+ })
+ ) : (
+
+ )}
+
+
+
+ setShowPopup(false)}
+ visible={showpopUp}
+ onClose={() => setShowPopup(false)}
+ doctor={selectedDoctor}
+ updateFavoriteDoctors={updateFavoriteDoctors}
+ />
+ setShowfilter(false)}
+ visible={showFilter}
+ onClose={() => setShowfilter(false)}
+ />
+
+ );
}
export default DoctorScreen;
diff --git a/app/(app)/ActionMenu/Booking/EnterYourPin.tsx b/app/(app)/ActionMenu/Booking/EnterYourPin.tsx
index 21c1a21..f690703 100644
--- a/app/(app)/ActionMenu/Booking/EnterYourPin.tsx
+++ b/app/(app)/ActionMenu/Booking/EnterYourPin.tsx
@@ -22,26 +22,51 @@ import { supabase } from "@/lib/supabase";
export default function EnterYourPin() {
const [isDark, setIsDark] = useState(false);
const modal = useModal();
- const {doctor_id,hour,date,packageTitle,packagePrice,problem,user_id,patient_id,duration} = useLocalSearchParams()
+ const {
+ doctor_id,
+ hour,
+ date,
+ packageTitle,
+ packagePrice,
+ problem,
+ user_id,
+ patient_id,
+ duration,
+ } = useLocalSearchParams();
const { theme, changeTheme } = useContext(ThemeContext);
async function bookAppointment() {
const { error } = await supabase
- .from('appointment')
- .insert({ doctor_id: doctor_id, time:hour,date:date, package: packageTitle, price: packagePrice, illness_descr: problem,user_id:patient_id,duration:duration});
+ .from("appointment")
+ .insert({
+ doctor_id: doctor_id,
+ time: hour,
+ date: date,
+ package: packageTitle,
+ price: packagePrice,
+ illness_descr: problem,
+ user_id: patient_id,
+ duration: duration,
+ });
if (error) {
console.error("Error booking appointment:", error);
}
}
- console.log("this is from lastpage",doctor_id,hour,packageTitle,packagePrice,problem)
+ console.log(
+ "this is from lastpage",
+ doctor_id,
+ hour,
+ packageTitle,
+ packagePrice,
+ problem
+ );
function successBooking() {
- router.push("ActionMenu");;
+ router.push("ActionMenu");
modal.hide();
}
async function handlePIN() {
-
- await bookAppointment()
+ await bookAppointment();
modal.show({
children: (
-
+
{
router.push("ActionMenu");
diff --git a/app/(app)/ActionMenu/Booking/SelectPayment.tsx b/app/(app)/ActionMenu/Booking/SelectPayment.tsx
index 3d5145a..c426b99 100644
--- a/app/(app)/ActionMenu/Booking/SelectPayment.tsx
+++ b/app/(app)/ActionMenu/Booking/SelectPayment.tsx
@@ -1,7 +1,7 @@
import { Colors } from "@/constants/Colors";
import { StatusBar } from "expo-status-bar";
-import { useContext, useState } from "react";
-import { ScrollView,TouchableOpacity,View,Image } from "react-native";
+import { useContext, useState } from "react";
+import { ScrollView, TouchableOpacity, View, Image } from "react-native";
import { Text } from "react-native";
import { ThemeContext } from "@/ctx/ThemeContext";
import Typography from "@/constants/Typography";
@@ -12,76 +12,118 @@ import PaymentChooseContainer from "@/components/UI/PaymentChooseContainer/Index
import { router } from "expo-router";
import React from "react";
import { useLocalSearchParams } from "expo-router";
-import { PayWithFlutterwave } from 'flutterwave-react-native'
+import { PayWithFlutterwave } from "flutterwave-react-native";
import { supabase } from "@/lib/supabase";
import { useModal } from "@/ctx/ModalContext";
export default function SelectPayment() {
const { theme, changeTheme } = useContext(ThemeContext);
const [selected, setSelected] = useState(false);
- const [loggedEmail,setLoggedEmail]=useState("")
- const { doctor_id, hour, date, packageTitle, packagePrice, problem, user_id, patient_id, duration } = useLocalSearchParams()
+ const [loggedEmail, setLoggedEmail] = useState("");
+ const {
+ doctor_id,
+ hour,
+ date,
+ packageTitle,
+ packagePrice,
+ problem,
+ user_id,
+ patient_id,
+ duration,
+ } = useLocalSearchParams();
+
+ const modal = useModal();
+ const flutterKey = process.env.EXPO_PUBLIC_FLUTTERWAVE_KEY ?? "";
+ console.log("this is packageprice from slect Payment:", packagePrice);
- const modal = useModal()
- const flutterKey = process.env.EXPO_PUBLIC_FLUTTERWAVE_KEY ?? ""
-
interface RedirectParams {
- status: "successful" | "cancelled";
- transaction_id?: string;
- tx_ref: string;
+ status: "successful" | "cancelled";
+ transaction_id?: string;
+ tx_ref: string;
}
- let num:number=1;
+ let num: number = 1;
if (duration === "30 minutes") {
- num=1
+ num = 1;
} else {
- num=2
+ num = 2;
}
let price: number = 0;
if (packagePrice === "Rwf20") {
- price=20
+ price = 20;
} else if (packagePrice === "Rwf40") {
- price=40
+ price = 40;
} else if (packagePrice === "Rwf60") {
- price =60
+ price = 60;
}
-const total:number=price*num
-
+ const total: number = price * num;
+
useEffect(() => {
const fetchUser = async () => {
-
- const { data: { user },error } = await supabase.auth.getUser()
+ const {
+ data: { user },
+ error,
+ } = await supabase.auth.getUser();
if (error) {
- console.error("error fetching user")
+ console.error("error fetching user");
} else {
- setLoggedEmail(user?.email||"logged Email")
+ setLoggedEmail(user?.email || "logged Email");
}
- }
- fetchUser()
-
- }, [loggedEmail])
+ };
+ fetchUser();
+ }, [loggedEmail]);
async function bookAppointment() {
try {
- const { error } = await supabase
- .from('appointment')
- .insert({
+ const { error } = await supabase.from("appointment").insert({
doctor_id: doctor_id,
- time: hour, date: date,
+ time: hour,
+ date: date,
package: packageTitle,
price: packagePrice,
illness_descr: problem,
user_id: patient_id,
- duration: duration
+ duration: duration,
});
} catch (error) {
- console.log("Error while inserting data in booking ",error)
- }
-
+ console.log("Error while inserting data in booking ", error);
+ }
}
+ const addNotification = async (doctorName: string) => {
+ try {
+ const { error } = await supabase.from("notifications").insert({
+ title: "Appointment Booked",
+ description: `You have successfully booked an appointment with Dr. ${doctorName}`,
+ patient_id: patient_id,
+ type: "appointment_booked",
+ doctor_id: doctor_id,
+ viewed: false,
+ });
+ console.log("Notification will be pushed");
+ if (error) {
+ console.log("Error while inserting notification ", error);
+ }
+ } catch (error) {
+ console.log("Error while inserting notification ", error);
+ }
+ };
+ const fetchDoctorName = async (doctorId: string) => {
+ const { data, error } = await supabase
+ .from("doctors")
+ .select("first_name")
+ .eq("id", doctorId)
+ .single();
+
+ if (error) {
+ console.log("Error fetching doctor's name: ", error);
+ return "";
+ }
+
+ return data.first_name;
+ };
function successBooking() {
- router.push("ActionMenu");;
+ router.push("ActionMenu");
modal.hide();
}
const showSuccefulModal = () => {
- modal.show({
+ modal.show({
children: (
-
-
-
{
getMeetingId();
@@ -80,9 +73,7 @@ const JoinScreen: React.FC = ({ getMeetingId }) => {
Create Room
-
OR
-
= ({ getMeetingId }) => {
onBlur={handleEmailBlur}
/>
-
= ({ getMeetingId }) => {
);
};
-
const styles = StyleSheet.create({
inputOneFocused: {
borderColor: "#246BFD",
@@ -157,13 +146,11 @@ const styles = StyleSheet.create({
alignSelf: "flex-start",
},
});
-
interface ButtonProps {
onPress: () => void;
buttonText: string;
backgroundColor: string;
}
-
const Button: React.FC = ({
onPress,
buttonText,
@@ -184,13 +171,11 @@ const Button: React.FC = ({
);
};
-
interface ControlsContainerProps {
join: () => void;
leave: () => void;
toggleMic: () => void;
}
-
const ControlsContainer: React.FC = ({
join,
leave,
@@ -200,7 +185,6 @@ const ControlsContainer: React.FC = ({
const [isMicOn, setIsMicOn] = useState(true);
const { id, AppointmentID } = useGlobalSearchParams();
const [isLoading, setIsLoading] = useState(false);
-
const HandleUpdate = async () => {
try {
setIsLoading(true);
@@ -217,11 +201,9 @@ const ControlsContainer: React.FC = ({
console.log(error);
}
};
-
const handleMicPress = () => {
setIsMicOn((prevState) => !prevState);
};
-
const handleButtonDisable = () => {
setButtonDisabled(true);
};
@@ -284,12 +266,10 @@ const ControlsContainer: React.FC = ({
);
};
-
interface ParticipantViewProps {
participantId: string;
meetingId: string | null;
}
-
interface Doctors {
first_name: string;
last_name: string;
@@ -297,12 +277,9 @@ interface Doctors {
image: string;
id: string;
}
-
type FetchDoctor = Doctors | null;
type FetchError = string | null;
-
const tableName = "doctors";
-
const ParticipantView: React.FC = ({ participantId }) => {
const [FetchDoctor, setFetchDoctor] = useState(null);
const [FetchError, setFetchError] = useState(null);
@@ -315,12 +292,10 @@ const ParticipantView: React.FC = ({ participantId }) => {
.select("*")
.eq("id", `${id}`)
.single();
-
if (data) {
setFetchDoctor(data);
setFetchError(null);
}
-
if (error) {
setFetchDoctor(null);
setFetchError("could not fetch description articles in database");
@@ -334,7 +309,6 @@ const ParticipantView: React.FC = ({ participantId }) => {
};
FetchDoctors();
}, []);
-
return (
= ({ participantId }) => {
}}
>
{FetchError && {FetchError}}
-
{FetchDoctor && (
= ({ participantId }) => {
source={{ uri: FetchDoctor.image }}
style={{ width: 200, height: 200, borderRadius: 100 }}
/>
-
@@ -366,12 +338,10 @@ const ParticipantView: React.FC = ({ participantId }) => {
);
};
-
interface ParticipantListProps {
participants: string[];
meetingId: string | null;
}
-
const ParticipantList: React.FC = ({
participants,
meetingId,
@@ -387,12 +357,10 @@ const ParticipantList: React.FC = ({
.select("*")
.eq("id", `${id}`)
.single();
-
if (data) {
setFetchDoctor(data);
setFetchError(null);
}
-
if (error) {
setFetchDoctor(null);
setFetchError("could not fetch description articles in database");
@@ -406,12 +374,8 @@ const ParticipantList: React.FC = ({
};
FetchDoctors();
}, []);
-
return participants.length > 0 ? (
-
- Doctor has joined the call
-
) : (
@@ -424,7 +388,6 @@ const ParticipantList: React.FC = ({
>
{FetchError && {FetchError}}
-
{FetchDoctor && (
= ({
source={{ uri: FetchDoctor.image }}
style={{ width: 200, height: 200, borderRadius: 100 }}
/>
-
= ({
)}
-
Tap to call
@@ -455,11 +416,37 @@ const ParticipantList: React.FC = ({
);
};
-
-const MeetingView: React.FC<{ meetingId: string | null }> = ({ meetingId }) => {
+const MeetingView: React.FC<{
+ meetingId: string | null;
+ appointmentId: string | null;
+}> = ({ meetingId, appointmentId }) => {
const { join, leave, toggleMic, participants } = useMeeting({});
const participantsArrId = [...participants.keys()];
-
+ const [participantJoinedMessage, setParticipantJoinedMessage] = useState("");
+ useEffect(() => {
+ const fetchMeetingId = async () => {
+ if (appointmentId) {
+ const { data, error } = await supabase
+ .from("appointment")
+ .select("meetingId")
+ .eq("id", appointmentId)
+ .single();
+ if (error) {
+ console.error("Error fetching meeting ID:", error);
+ } else {
+ console.log("Meeting ID fetched:", data.meetingId);
+ }
+ }
+ };
+ fetchMeetingId();
+ }, [appointmentId]);
+ useEffect(() => {
+ if (participantsArrId.length === 2) {
+ setParticipantJoinedMessage("Doctor has joined the call.");
+ } else {
+ setParticipantJoinedMessage("");
+ }
+ }, [participantsArrId]);
return (
= ({ meetingId }) => {
participants={participantsArrId}
meetingId={meetingId}
/>
+
+ {participantJoinedMessage ? (
+
+ {participantJoinedMessage}
+
+ ) : null}
+
);
};
-
const VoiceCall: React.FC = () => {
const [meetingId, setMeetingId] = useState(null);
const { AppointmentID } = useGlobalSearchParams();
-
const getMeetingId = async (id?: string) => {
const newMeetingId = id == null ? await createMeeting({ token }) : id;
setMeetingId(newMeetingId);
@@ -498,7 +497,6 @@ const VoiceCall: React.FC = () => {
}
}
};
-
return meetingId ? (
{
}}
token={token}
>
-
+
) : (
);
};
-
export default VoiceCall;
\ No newline at end of file
diff --git a/app/(app)/Appointments/VoiceCallAppointment/index.tsx b/app/(app)/Appointments/VoiceCallAppointment/index.tsx
index 685c140..3e9bed8 100644
--- a/app/(app)/Appointments/VoiceCallAppointment/index.tsx
+++ b/app/(app)/Appointments/VoiceCallAppointment/index.tsx
@@ -53,6 +53,8 @@ function AppointmentVoiceCall() {
const [patient_id,setPatient_id]=useState()
const [profile, setProfile] = useState(null)
const [doctorID, setDoctorsID] = useState();
+ const[ages, setAges] = useState()
+ const [showMore, setShowMore] = useState(false);
@@ -152,6 +154,18 @@ try {
fetchUserProfile()
}, [loggeduser])
+ useEffect(() => {
+ const calculateAge = () => {
+ if (profile) {
+ const today = new Date();
+ const birthDate = new Date(profile?.date_of_birth);
+ const age = today.getFullYear() - birthDate.getFullYear();
+ setAges(age.toString())
+ }
+ }
+ calculateAge()
+ }, [profile])
+
@@ -218,7 +232,7 @@ try {
}}
>
-
+
+
- Full Name: {appointment.user.first_name}
+ Full Name
- : {appointment.user.first_name} {appointment.user.last_name}
+
+
+
+
- Gender: {appointment.user.gender}
+ Gender {" "}
+
- : {appointment.user.gender}
+
+
+
- Age: {appointment.user.age}
+ Age {" "}
+ : {ages}
+
+
- Problem:{" "}
-
- {appointment.illness_descr}
-
-
- view more
-
-
-
+ Problem:{" "}
+
+
+ : {
+ showMore ? appointment.illness_descr : appointment.illness_descr.slice(0, 20)
+ }
+ {appointment.illness_descr.length > 20 && (
+ setShowMore(!showMore)}>
+
+ {showMore ? "View Less" : "View More"}
+
+
+ )}
+
+
diff --git a/app/(app)/Appointments/index.tsx b/app/(app)/Appointments/index.tsx
index 1432ae0..a9b678c 100644
--- a/app/(app)/Appointments/index.tsx
+++ b/app/(app)/Appointments/index.tsx
@@ -8,6 +8,7 @@ import {
ScrollView,
Pressable,
ActivityIndicator,
+ RefreshControl,
} from "react-native";
import { SvgXml } from "react-native-svg";
import Typography from "@/constants/Typography";
@@ -63,7 +64,7 @@ const AppointmentScreen: React.FC = () => {
const [searchTerm, setSearchTerm] = useState("");
const [showFilter, setShowFilter] = useState(false);
const [appointmentId, setAppointmentId] = useState("");
- const modal = useModal();
+ const [refreshing, setRefreshing] = useState(false);
useEffect(() => {
const fetchUser = async () => {
@@ -80,6 +81,43 @@ const AppointmentScreen: React.FC = () => {
fetchUser();
}, []);
+ const handleRefresh = async () => {
+ setRefreshing(true);
+ const { data: appointmentsData, error: appointmentsError } =
+ await supabase.from("appointment").select("*").eq("user_id", patientId);
+
+ if (appointmentsError) {
+ setRefreshing(false);
+ console.error("Error fetching appointments:", appointmentsError);
+ return;
+ }
+
+ const doctorIds = appointmentsData.map(
+ (appointment) => appointment.doctor_id
+ );
+
+ const { data: doctorsData, error: doctorsError } = await supabase
+ .from("doctors")
+ .select("*")
+ .in("id", doctorIds);
+
+ if (doctorsError) {
+ setRefreshing(false);
+ console.error("Error fetching doctors:", doctorsError);
+ return;
+ }
+
+ const mergedData = appointmentsData.map((appointment) => {
+ const doctor = doctorsData.find(
+ (doc) => doc.id === appointment.doctor_id
+ );
+ return { ...appointment, doctor };
+ });
+
+ setRefreshing(false);
+ setAppointments(mergedData);
+ };
+
useEffect(() => {
const fetchUserProfile = async () => {
if (loggedUser) {
@@ -186,10 +224,49 @@ const AppointmentScreen: React.FC = () => {
const handleFilter = () => {
setShowFilter(true);
};
+ const fetchDoctorName = async (doctorId: string) => {
+ const { data, error } = await supabase
+ .from('doctors')
+ .select('first_name')
+ .eq('id', doctorId)
+ .single();
+ if (error) {
+ console.log("Error fetching doctor's name: ", error);
+ return "";
+ }
+
+ return data.first_name;
+ };
+ const addNotification = async ( doctorName: string) => {
+ try {
+ const { error } = await supabase
+ .from('notifications')
+ .insert({
+ title: 'Appointment Cancelled',
+ description: `You have successfully cancelled your booked appointment with Dr. ${doctorName}`,
+ patient_id: patientId,
+ type: "appointment_changed",
+ viewed:false
+
+ });
+
+ if (error) {
+ console.log("Error while inserting notification ", error);
+ }
+ } catch (error) {
+ console.log("Error while inserting notification ", error);
+ }
+ };
- const handleCancel = (id:string) => {
+
+ const handleCancel =async (id:string,doctor_id:string) => {
setAppointmentId(id);
+ if (typeof doctor_id === "string") {
+ const doctorName = await fetchDoctorName(doctor_id);
+ await addNotification(doctorName);
+ }
+
setShowPopup(true);
}
@@ -262,7 +339,13 @@ const AppointmentScreen: React.FC = () => {
-
+ }
+ style={styles.cardContainer}>
{isLoading ? (
{
text="Cancel Appointment"
size="small"
type="border"
- onPress={()=> handleCancel(appointment.id)}
+ onPress={()=> handleCancel(appointment.id,appointment.doctor_id)}
/>
{
return { label: typedCountries[key].name, value: typedCountries[key].name };
});
+ const addNotification = async () => {
+ try {
+ const { error } = await supabase
+ .from('notifications')
+ .insert({
+ title: 'Account successfully updated',
+ description: `You have successfully updated your profile`,
+ patient_id:id,
+ type: "account_setup",
+ viewed:false
+
+ });
+
+ if (error) {
+ console.log("Error while inserting notification ", error);
+ }
+ } catch (error) {
+ console.log("Error while inserting notification ", error);
+ }
+ };
+
const handleUpdate = async () => {
try {
@@ -142,6 +163,7 @@ function EditProfile() {
const res = await supabase.auth.updateUser({ email: email });
console.log(res);
+ addNotification()
if (data.error) throw data.error;
alert("Profile updated successfully");
@@ -403,8 +425,8 @@ function EditProfile() {
diff --git a/app/(app)/Profile/HelpCenter/FAQ.tsx b/app/(app)/Profile/HelpCenter/FAQ.tsx
index a234e87..24a9c71 100644
--- a/app/(app)/Profile/HelpCenter/FAQ.tsx
+++ b/app/(app)/Profile/HelpCenter/FAQ.tsx
@@ -26,31 +26,31 @@ export default function FAQ() {
id: "1",
title: "What is Medica?",
description:
- "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.",
+ "Medica is a mobile application designed to facilitate online doctor appointments and consultations.",
},
{
id: "2",
title: "How to use Medica?",
description:
- "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.",
+ "As a users can create an account, log in, browse through various doctor specialties, schedule appointments, and communicate with healthcare professionals through voice calls, video calls, or messaging.",
},
{
id: "3",
title: "How do I cancel an appointment?",
description:
- "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.",
+ "If a user happen to cancel an appointment, they can do so by going to the appointment section and clicking on the cancel button.",
},
{
id: "4",
title: "How do I save the recording?",
description:
- "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.",
+ "THis feature is under development and will be available in the next update.",
},
{
id: "5",
title: "How do I exit the app?",
description:
- "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.",
+ "As a logged in user you can exit the app by clicking on the logout button in the profile section.",
},
]);
diff --git a/app/(app)/Profile/index.tsx b/app/(app)/Profile/index.tsx
index 14bd02f..839a01c 100644
--- a/app/(app)/Profile/index.tsx
+++ b/app/(app)/Profile/index.tsx
@@ -1,6 +1,6 @@
import Typography from "@/constants/Typography";
import React, { useContext, useEffect, useState } from "react";
-import { Text, View, Image, FlatList } from "react-native";
+import { Text, View, Image, FlatList, RefreshControl } from "react-native";
import { SvgXml } from "react-native-svg";
import OptionListing from "@/components/Profile/OptionListing";
import { Colors } from "@/constants/Colors";
@@ -40,6 +40,8 @@ const index = () => {
const [imageUrl, setImageUrl] = useState("");
const [profilePhoto, setProfilePhoto] = useState("");
const { userId } = useContext(AuthContext);
+ const [refreshing, setRefreshing] = useState(false);
+
const CDNURL =
"https://vbwbfflzxuhktdvpbspd.supabase.co/storage/v1/object/public/patients/";
@@ -52,6 +54,12 @@ const index = () => {
}
}, [userId]);
+ const handleRefresh = async () => {
+ setRefreshing(true);
+ fetchPatientData(userId, setPatientData);
+ setRefreshing(false)
+ }
+
useEffect(() => {
if (patientData) {
setImageUrl(
@@ -112,6 +120,11 @@ const index = () => {
{patientData && (
}
data={patientData}
renderItem={({ item }) => (
{
await signInWithApple();
router.push("/(app)/ActionMenu");
} catch (error) {
- console.error('Error signing in with Apple:', error);
+ console.error("Error signing in with Apple:", error);
// Handle error (show alert, reset loading state, etc.)
} finally {
setLoading(false);
@@ -174,7 +173,7 @@ const LetsYouIn = () => {
{ color: theme === "dark" ? "#FFFFFF" : Colors.grayScale._900 },
]}
>
- Let's you in
+ Let's get you in
@@ -227,7 +226,8 @@ const LetsYouIn = () => {
- {
const [isFocus, setIsFocus] = useState(false);
- const [image, setImage] = useState(null);
- const [value, setValue] = useState(" ");
const { theme } = useContext(ThemeContext);
const { setUpUserInfo, name, authType, imageUrl } = useAuth();
const { email } = useLocalSearchParams<{ email: string }>();
const [isLoading, setIsLoading] = useState(false);
-
- const [formData, setFormData] = useState>({
+ const [formData, setFormData] = useState<{
+ firstName: string;
+ lastName: string;
+ // email: string,
+ gender: string;
+ image: {
+ name: string;
+ mimeType: string;
+ uri: string;
+ };
+ birthDate: Date;
+ }>({
firstName: "",
lastName: "",
- birthDate: "",
+ birthDate: new Date(),
// email: "",
gender: "",
image: {
@@ -43,8 +52,9 @@ const YourProfile = () => {
uri: "",
},
});
+ const [showDatepicker, setShowDatePicker] = useState(false);
- function handleFormChange(name: string, value: string) {
+ function handleFormChange(name: string, value: string | Date) {
setFormData((prevVal) => {
return {
...prevVal,
@@ -53,24 +63,38 @@ const YourProfile = () => {
});
}
- console.log(formData.lastName);
-
async function handleSubmit() {
try {
+ if (new Date(formData.birthDate) > new Date("2024-01-01"))
+ throw new Error("You're too young to use this app");
+
+ if (
+ formData.firstName == "" ||
+ formData.lastName == "" ||
+ formData.gender == "" ||
+ formData.image.uri == ""
+ )
+ throw new Error("Ensure you've filled all necessary fields");
+
setIsLoading(true);
await setUpUserInfo(
-
- authType && authType !== "apple"
+ authType && authType !== "apple"
? authType && authType !== "apple"
? {
+ ...formData,
+ firstName: String(name).split(" ")[0],
+ lastName: String(name).split(" ")[1],
+ imageUrl: { uri: imageUrl, mimeType: "image/jpeg" },
+ }
+ : {
+ ...formData,
+ birthDate: formData.birthDate.toISOString().split("T")[0],
+ }
+ : {
...formData,
- firstName: String(name).split(" ")[0],
- lastName: String(name).split(" ")[1],
- imageUrl: { uri: imageUrl, mimeType: "image/jpeg" },
+ birthDate: formData.birthDate.toISOString().split("T")[0],
}
- : formData
- : formData
- )
+ );
} catch (err) {
setIsLoading(false);
const error: Error = err as Error;
@@ -133,7 +157,7 @@ const YourProfile = () => {
placeholder="Last Name"
name="lastName"
value={
- authType && authType !== "apple"
+ authType && authType !== "apple"
? authType || authType !== "apple"
? String(name).split(" ")[1]
: formData.lastName
@@ -144,7 +168,7 @@ const YourProfile = () => {
{
return (
@@ -153,7 +177,23 @@ const YourProfile = () => {
);
}}
+ onPress={() => {
+ setShowDatePicker(true);
+ }}
+ editable={false}
+ disabled={true}
/>
+ {showDatepicker && (
+ {
+ setShowDatePicker(false);
+ handleFormChange("birthDate", selectedDate!);
+ }}
+ />
+ )}
{
searchPlaceholder="Search..."
renderInputSearch={() => <>>}
value={formData.gender}
- onChangeText={(e) => { }}
+ onChangeText={(e) => {}}
/>
diff --git a/app/_layout.tsx b/app/_layout.tsx
index 101fb47..5b3c3f0 100644
--- a/app/_layout.tsx
+++ b/app/_layout.tsx
@@ -17,6 +17,9 @@ import ModalContainer from "@/components/UI/Modal";
import { AutocompleteDropdownContextProvider } from "react-native-autocomplete-dropdown";
import { StatusBar } from "expo-status-bar";
import AuthProvider, { useAuth } from "@/ctx/AuthContext";
+import NotificationsProvider, {
+ useNotifications,
+} from "@/ctx/NotificationsContext";
export { ErrorBoundary } from "expo-router";
@@ -94,7 +97,9 @@ export default function RootLayout() {
-
+
+
+
@@ -107,13 +112,16 @@ function RootLayoutNav() {
const segments = useSegments();
const inAuth = segments[0] === "(auth)";
+ const { notifications } = useNotifications();
+
+ console.log(notifications);
useEffect(() => {
if (!isLoggedIn && !inAuth) {
console.log("Not logged in");
return router.replace("/(auth)/SignIn&SignOut/LetsYouIn");
}
-
+
// if (isLoggedIn && !activated && !email) {
// console.log("Logged in, not activated, without email");
// return router.replace("/(auth)/SignIn&SignOut/LetsYouIn");
@@ -128,7 +136,7 @@ function RootLayoutNav() {
console.log("Logged in, activated, and in auth");
return router.replace("/(app)/ActionMenu");
}
- }, [isLoggedIn, activated, router, segments]);
+ }, [isLoggedIn, activated, router, segments, email]);
return (
<>
@@ -145,4 +153,4 @@ function RootLayoutNav() {
>
);
-}
\ No newline at end of file
+}
diff --git a/assets/images/splash.png b/assets/images/splash.png
index 0e89705..30fae45 100644
Binary files a/assets/images/splash.png and b/assets/images/splash.png differ
diff --git a/components/DoctorCard.tsx b/components/DoctorCard.tsx
index cb96d61..ca32d78 100644
--- a/components/DoctorCard.tsx
+++ b/components/DoctorCard.tsx
@@ -4,13 +4,15 @@ import { ThemeContext } from "@/ctx/ThemeContext";
import React, { useContext } from "react";
import { Image, Text, View } from "react-native";
interface DoctorProps{
- name:string;
+ first_name:string;
+ second_name:string;
+
specialization:string;
hospital:string;
image: {uri:string}
}
- function DoctorCard ({ name, specialization, hospital, image }: DoctorProps) {
+ function DoctorCard ({first_name, second_name,specialization, hospital, image }: DoctorProps) {
const { theme, changeTheme } = useContext(ThemeContext);
return (
@@ -44,7 +46,7 @@ interface DoctorProps{
},
]}
>
- {name}
+ {first_name} {second_name}
-
-
-
- {IconComponet}
-
-
- {notificationStatus }
- {timeFrame}{time}
-
-
-
-
-
- New
-
-
+function Notficationtab({
+ IconComponet,
+ viewBackground,
+ notificationStatus,
+ timeFrame,
+ time,
+ description,
+ btnVisibility,
+}: notificatioTabProps) {
+ const { theme, changeTheme } = useContext(ThemeContext);
+ const textColor = theme === "dark" ? styles.textDark : styles.textLight;
+ const sentenceColor =
+ theme === "dark" ? styles.sentenceDark : styles.sentenceLight;
+ return (
+
+
+
+
+ {IconComponet}
+
+
+
+ {notificationStatus}
+
+
+ {timeFrame}
+
+ {time}
-
- {sentenceOne}
- {sentenceTwo}
- {sentenceThree}
-
-
- );
+
+
+
+
+
+ New
+
+
+
+
+ {description}
+
+
+ );
}
export default Notficationtab;
const styles = StyleSheet.create({
- outer: {
- display: "flex",
- flexDirection: "row",
- marginBottom: "2%",
- justifyContent: "space-between",
- },
- textLight: {
- color: "#212121"
-
- },
- textDark: {
- color:"white"
-
- },
- sentenceDark: {
- color:"#E0E0E0"
- },
- sentenceLight: {
- color:"#424242",
-
- },
- TimeView: {
- marginTop:9,
- display: 'flex',
- flexDirection: "row",
- gap:10,
- width: "70%",
- alignItems:"baseline"
- },
- LeftView: {
- width: "80%",
- height:60,
- display: "flex",
- flexDirection: 'row',
- gap: 13,
-
- },
- notificationStyle: {
- fontSize: 18,
- fontWeight:'bold'
- },
- IconView: {
- width: 50,
- height: 50,
- borderRadius: 100,
- display: "flex",
- alignItems: "center",
- justifyContent:"center"
-
- },
- separateView: {
- height: 15,
- width: 2,
- backgroundColor:"#616161"
- },
+ outer: {
+ display: "flex",
+ flexDirection: "row",
+ marginBottom: "2%",
+ justifyContent: "space-between",
+ },
+ textLight: {
+ color: "#212121",
+ },
+ textDark: {
+ color: "white",
+ },
+ sentenceDark: {
+ color: "#E0E0E0",
+ },
+ sentenceLight: {
+ color: "#424242",
+ },
+ TimeView: {
+ marginTop: 9,
+ display: "flex",
+ flexDirection: "row",
+ gap: 10,
+ width: "70%",
+ alignItems: "baseline",
+ },
+ LeftView: {
+ width: "80%",
+ height: 60,
+ display: "flex",
+ flexDirection: "row",
+ gap: 13,
+ },
+ notificationStyle: {
+ fontSize: 18,
+ fontWeight: "bold",
+ },
+ IconView: {
+ width: 50,
+ height: 50,
+ borderRadius: 100,
+ display: "flex",
+ alignItems: "center",
+ justifyContent: "center",
+ },
+ separateView: {
+ height: 15,
+ width: 2,
+ backgroundColor: "#616161",
+ },
- timeStyle: {
- color: "#616161",
- fontWeight: "300",
- fontSize:16
-
- },
- textStyle: {
- fontFamily: "Regular",
- fontSize:12.7
-
- },
- btn: {
- backgroundColor: "#246BFD",
- borderRadius:10,
- width: 50,
- height: 30,
- color: "white",
- display: "flex",
- flexDirection: "row",
- justifyContent: "center",
- alignItems:"center"
- },
- btnView: {
- width: "20%",
- height: 60,
- display: "flex",
- flexDirection:"row",
- justifyContent: "flex-end",
- alignItems:"center"
- },
- btnText: {
- color:"white"
- }
-})
\ No newline at end of file
+ timeStyle: {
+ color: "#616161",
+ fontWeight: "300",
+ fontSize: 16,
+ },
+ textStyle: {
+ fontFamily: "Regular",
+ fontSize: 12.7,
+ },
+ btn: {
+ backgroundColor: "#246BFD",
+ borderRadius: 10,
+ width: 50,
+ height: 30,
+ color: "white",
+ display: "flex",
+ flexDirection: "row",
+ justifyContent: "center",
+ alignItems: "center",
+ },
+ btnView: {
+ width: "20%",
+ height: 60,
+ display: "flex",
+ flexDirection: "row",
+ justifyContent: "flex-end",
+ alignItems: "center",
+ },
+ btnText: {
+ color: "white",
+ },
+});
diff --git a/components/UI/Deletenotification.tsx b/components/UI/Deletenotification.tsx
new file mode 100644
index 0000000..de55c5c
--- /dev/null
+++ b/components/UI/Deletenotification.tsx
@@ -0,0 +1,12 @@
+import React from 'react';
+import { View,Text,Button,Pressable } from 'react-native';
+
+function Deletenotification() {
+ return (
+
+ Delate All
+
+ );
+}
+
+export default Deletenotification;
\ No newline at end of file
diff --git a/components/UI/Input.tsx b/components/UI/Input.tsx
index d866142..80cea8a 100644
--- a/components/UI/Input.tsx
+++ b/components/UI/Input.tsx
@@ -2,7 +2,7 @@ import { Colors } from "@/constants/Colors";
import Typography from "@/constants/Typography";
import { ThemeContext } from "@/ctx/ThemeContext";
import React, { useContext } from "react";
-import { View } from "react-native";
+import { Pressable, View } from "react-native";
import { TextInput } from "react-native";
interface Props {
@@ -15,10 +15,11 @@ interface Props {
onChange: (name: string, value: string) => void;
disabled?: boolean;
editable?: boolean;
+ onPress?: () => void;
}
export default function Input({
- name="Your name is empty",
+ name = "Your name is empty",
onChange,
placeholder,
value,
@@ -26,11 +27,12 @@ export default function Input({
rightElement,
leftElement,
disabled,
- editable
+ editable,
+ onPress,
}: Props) {
const { theme } = useContext(ThemeContext);
return (
-
{leftElement && leftElement()}
{rightElement && rightElement()}
-
+
);
}
diff --git a/components/UI/NotificationListing.tsx b/components/UI/NotificationListing.tsx
new file mode 100644
index 0000000..b3e001a
--- /dev/null
+++ b/components/UI/NotificationListing.tsx
@@ -0,0 +1,195 @@
+import { View, Text } from "react-native";
+import React, { useContext } from "react";
+import Typography from "@/constants/Typography";
+import { Colors } from "@/constants/Colors";
+import { SvgXml } from "react-native-svg";
+import { calendar } from "@/assets/icons/calendar1";
+import { calendar2 } from "@/assets/icons/calendar2";
+import { service } from "@/assets/icons/service";
+import { wallet } from "@/assets/icons/wallet";
+import { close } from "@/assets/icons/close";
+import { ThemeContext } from "@/ctx/ThemeContext";
+
+interface Props {
+ title: string;
+ description: string;
+ createdAt: Date;
+ type:
+ | "appointment_changed"
+ | "appointment_completed"
+ | "appointment_booked"
+ | "new_service"
+ | "payment_setup"
+ | "account_setup";
+ viewed?: boolean;
+}
+
+export const icons = {
+ accountSetupIcon: (
+
+
+
+ ),
+ apppointmentScheduleIcon: (
+
+
+
+ ),
+ appointmentCompletionIcon: (
+
+
+
+ ),
+ infoIcon: (
+
+
+
+ ),
+ creditCardConnectedIcon: (
+
+
+
+ ),
+};
+
+export default function NotificationListing({
+ title,
+ description,
+ createdAt,
+ type,
+ viewed,
+}: Props) {
+ const { theme } = useContext(ThemeContext);
+ return (
+ <>
+
+
+
+ {type === "account_setup"
+ ? icons.accountSetupIcon
+ : type === "appointment_booked"
+ ? icons.apppointmentScheduleIcon
+ : type === "appointment_changed"
+ ? icons.apppointmentScheduleIcon
+ : type === "appointment_completed"
+ ? icons.appointmentCompletionIcon
+ : type === "new_service"
+ ? icons.infoIcon
+ : icons.creditCardConnectedIcon}
+
+
+
+ {title}
+
+
+ {createdAt
+ .toLocaleDateString("en-US", {
+ day: "2-digit",
+ month: "short",
+ year: "numeric",
+ })
+ .replace(",", "") +
+ " | " +
+ createdAt
+ .toLocaleTimeString("en-US", {
+ hour: "2-digit",
+ minute: "2-digit",
+ hour12: true,
+ })
+ .replace(" ", "")}
+
+
+ {!viewed && (
+
+
+ New
+
+
+ )}
+
+
+ {description.trim()}
+
+
+ >
+ );
+}
diff --git a/constants/Types.ts b/constants/Types.ts
index 70b4a25..4f68239 100644
--- a/constants/Types.ts
+++ b/constants/Types.ts
@@ -17,42 +17,49 @@ export interface PaymentOption {
iconSvgStringDark?: string;
}
export interface AuthType {
- isLoggedIn: boolean;
+ patientId: string;
+ email: string;
+ isLoggedIn: false;
+ activated: false;
+ userId: string;
token: string;
refreshToken: string;
- loading: boolean;
- refreshSession: () => void;
- logout: () => void;
- login: ( email: string, password: string) => Promise;
- signInWithApple: () => Promise;
+ name: string;
+ imageUrl: string;
+ authType: string;
+ refreshSession: () => Promise;
+ setUpUserInfo: () => Promise;
+ logout: () => Promise;
+ login: (email: string, password: string) => Promise;
+ signInWithApple: () => Promise;
}
export interface Countries extends TCountries {
[key: string]: any;
}
-export interface Doctor{
- id: number,
- first_name: string,
- last_name: string,
- hospital: string,
- rate: string,
- review: string,
- specialization: string,
- about:string
+export interface Doctor {
+ id: number;
+ first_name: string;
+ last_name: string;
+ hospital: string;
+ rate: string;
+ review: string;
+ specialization: string;
+ about: string;
}
-export interface Appointment{
- id: number,
- created_at: string,
- doctor_id: string,
- date: string,
- time: string,
- package: string,
- price: string,
- illness_descr:string,
- status:string,
- user_id:string
+export interface Appointment {
+ id: number;
+ created_at: string;
+ doctor_id: string;
+ date: string;
+ time: string;
+ package: string;
+ price: string;
+ illness_descr: string;
+ status: string;
+ user_id: string;
}
export interface PatientTypes {
@@ -64,10 +71,10 @@ export interface PatientTypes {
date_of_birth: string;
email: string | null;
first_name: string;
- gender: 'M' | 'F';
+ gender: "M" | "F";
id: string;
image: string;
last_name: string;
phone: string | null;
updated_at: string | null;
-};
+}
diff --git a/ctx/AuthContext.tsx b/ctx/AuthContext.tsx
index 1a30ff2..98ed58f 100644
--- a/ctx/AuthContext.tsx
+++ b/ctx/AuthContext.tsx
@@ -2,11 +2,8 @@ import React, { useContext, useEffect } from "react";
import { AuthType, UserInfo } from "@/constants/Types";
import { createContext, useState } from "react";
import { supabase } from "@/lib/supabase";
-import { router } from "expo-router";
-import { Alert } from "react-native";
import uuid from "react-native-uuid";
-import * as AppleAuthentication from 'expo-apple-authentication';
-
+import * as AppleAuthentication from "expo-apple-authentication";
export const AuthContext = createContext({
email: "",
@@ -40,6 +37,7 @@ export default function AuthProvider({ children }: Props) {
const [name, setName] = useState("");
const [imageUrl, setImageUrl] = useState("");
const [authType, setAuthType] = useState("");
+ const [patientId, setPatientId] = useState("");
async function refreshSession() {}
@@ -55,24 +53,32 @@ export default function AuthProvider({ children }: Props) {
setName("");
setImageUrl("");
setAuthType("");
- console.log("Logout success");
+ setPatientId("");
} else {
console.error("Error logging out:", error.message);
}
}
-
+
async function login(email: string, password: string) {
const { data, error } = await supabase.auth.signInWithPassword({
email,
password,
});
-
+
+ const { data: patientData, error: patientError } = await supabase
+ .from("patients")
+ .select("*")
+ .eq("auth_id", data.session?.user.id);
+
+ console.log(patientData);
+
if (!error) {
setIsLoggedIn(true);
setEmail(data.session.user.email!);
setToken(data.session.access_token);
setRefreshToken(data.session.refresh_token);
setUserId(data.session.user.id);
+ setPatientId(patientData![0].id);
} else {
throw new Error(error.message);
}
@@ -106,16 +112,27 @@ export default function AuthProvider({ children }: Props) {
}
async function setUpUserInfo(user: UserInfo) {
+ if (!userId)
+ throw Error(
+ "Something happened,please try closing and reopening the app"
+ );
+
+ const imageName = userId + "/" + uuid.v4();
+
if (!authType || authType === "apple") {
- const res = await fetch(user.image.uri);
- const arrayBuffer = await res.arrayBuffer();
-
- await supabase.storage
- .from("patients")
- .upload(userId + "/" + uuid.v4(), arrayBuffer, {
- contentType: user.image.mimeType ?? "image/jpeg",
- });
- }
+ const res = await fetch(user.image.uri);
+ const arrayBuffer = await res.arrayBuffer();
+
+ console.log("imageRes", res);
+
+ const res1 = await supabase.storage
+ .from("patients")
+ .upload(imageName, arrayBuffer, {
+ contentType: user.image.mimeType ?? "image/jpeg",
+ });
+
+ console.log("Res1: ", res1);
+ }
const res = await supabase
.from("patients")
@@ -125,12 +142,16 @@ export default function AuthProvider({ children }: Props) {
gender: user.gender,
date_of_birth: user.birthDate,
activated: true,
- image:authType && authType !== "apple"
- ? imageUrl
- : userId + "/" + uuid.v4(),
+ image: authType && authType !== "apple" ? imageUrl : imageName,
})
.eq("auth_id", userId);
+ const { data: patientData, error: patientError } = await supabase
+ .from("patients")
+ .select("*")
+ .eq("auth_id", userId);
+
+ setPatientId(patientData![0].id);
setActivated(true);
setIsLoggedIn(true);
}
@@ -143,59 +164,59 @@ export default function AuthProvider({ children }: Props) {
AppleAuthentication.AppleAuthenticationScope.EMAIL,
],
});
-
+
if (credential.identityToken) {
const response = await supabase.auth.signInWithIdToken({
- provider: 'apple',
+ provider: "apple",
token: credential.identityToken,
});
-
+
if (response.error) {
- console.error('Error signing in with Apple:', response.error);
- throw new Error('Error signing in with Apple');
+ console.error("Error signing in with Apple:", response.error);
+ throw new Error("Error signing in with Apple");
} else {
- console.log('User signed in:', response.data.user);
-
+ console.log("User signed in:", response.data.user);
+
const userId = response.data.user.id;
const email = response.data.user.email;
-
+
const { data: existingUser, error: checkError } = await supabase
- .from('patients')
- .select('auth_id')
- .eq('auth_id', userId)
+ .from("patients")
+ .select("auth_id")
+ .eq("auth_id", userId)
.single();
-
- if (checkError && checkError.code !== 'PGRST116') {
- console.log('Error checking existing user: ', checkError);
+
+ if (checkError && checkError.code !== "PGRST116") {
+ console.log("Error checking existing user: ", checkError);
throw new Error(checkError.message);
}
-
+
if (!existingUser) {
const { error } = await supabase
- .from('patients')
+ .from("patients")
.insert({ auth_id: userId, activated: false });
-
+
if (error) {
- console.log('Error creating patient entry: ', error);
+ console.log("Error creating patient entry: ", error);
throw new Error(error.message);
}
}
- setToken(response.data.session?.access_token || '');
- setRefreshToken(response.data.session?.refresh_token || '');
+ setToken(response.data.session?.access_token || "");
+ setRefreshToken(response.data.session?.refresh_token || "");
setEmail(email);
setUserId(userId);
setIsLoggedIn(true);
- setAuthType('apple');
+ setAuthType("apple");
}
} else {
- throw new Error('No identityToken.');
+ throw new Error("No identityToken.");
}
} catch (e) {
- console.error('Error during Apple sign-in:', e);
+ console.error("Error during Apple sign-in:", e);
throw e;
}
}
-
+
useEffect(() => {
(async () => {
if (userId) {
@@ -205,6 +226,8 @@ export default function AuthProvider({ children }: Props) {
.eq("auth_id", userId)
.single();
+ console.log("Activated?: " + data?.activated);
+
setActivated(data?.activated);
setIsLoggedIn(true);
}
@@ -221,6 +244,8 @@ export default function AuthProvider({ children }: Props) {
name,
authType,
imageUrl,
+ patientId,
+ setPatientId,
setName,
setUpUserInfo,
refreshSession,
diff --git a/ctx/NotificationsContext.tsx b/ctx/NotificationsContext.tsx
new file mode 100644
index 0000000..db9774d
--- /dev/null
+++ b/ctx/NotificationsContext.tsx
@@ -0,0 +1,160 @@
+import { supabase } from "@/lib/supabase";
+import React, { createContext, useContext, useEffect, useState } from "react";
+import { useAuth } from "./AuthContext";
+import { Alert } from "react-native";
+import * as Notifications from "expo-notifications";
+
+Notifications.setNotificationHandler({
+ handleNotification: async () => ({
+ shouldShowAlert: true,
+ shouldPlaySound: true,
+ shouldSetBadge: true,
+ }),
+});
+
+export interface NotificationsType {
+ notifications: NotificationType[];
+ getNotifications: () => Promise;
+ deleteNotification: (id: string) => Promise;
+ createNotification: (notificaction: NotificationType) => Promise;
+ setNotifications: React.Dispatch>;
+}
+
+export interface NotificationType {
+ id: string;
+ title: string;
+ description: string;
+ createdAt: Date;
+ patientId: string;
+ doctorId: string;
+ viewed: boolean;
+ type:
+ | "appointment_changed"
+ | "appointment_completed"
+ | "appointment_booked"
+ | "new_service"
+ | "payment_setup"
+ | "account_setup";
+}
+
+export const NotificationsContext = createContext({
+ notifications: [],
+ getNotifications: async () => {},
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
+ deleteNotification: async (id: string) => {},
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
+ createNotification: async (notification: NotificationType) => {},
+ setNotifications: () => {},
+});
+
+interface Props {
+ children: React.JSX.Element | React.JSX.Element[];
+}
+
+export default function NotificationsProvider({ children }: Props) {
+ const [notifications, setNotifications] = useState([]);
+ const { isLoggedIn, activated, patientId } = useAuth();
+
+ async function getNotifications() {}
+
+ async function deleteNotification(id: string) {
+ console.log(id);
+ }
+
+ async function createNotification(notification: NotificationType) {
+ console.log(notification);
+ }
+
+ useEffect(() => {
+ const fetchInitialNotifications = async () => {
+ try {
+ const { data, error } = await supabase
+ .from("notifications")
+ .select("*")
+ .eq("patient_id", patientId)
+ .order("created_at", { ascending: false });
+
+ if (error) error;
+
+ const notifs = data!.map((notification) => {
+ return {
+ id: notification.id,
+ createdAt: notification.created_at,
+ title: notification.title,
+ description: notification.description,
+ patientId: notification.patient_id,
+ viewed: notification.viewed,
+ doctorId: notification.doctor_id,
+ type: notification.type,
+ };
+ });
+
+ setNotifications(notifs || []);
+ } catch (err) {
+ Alert.alert((err as Error).message);
+ }
+ };
+
+ if (isLoggedIn && activated) {
+ fetchInitialNotifications();
+ const channel = supabase
+ .channel("notifications")
+ .on(
+ "postgres_changes",
+ { event: "INSERT", schema: "public" },
+ (payload) => {
+ const newNotification = payload.new;
+
+ if (newNotification.patient_id === patientId) {
+ Notifications.scheduleNotificationAsync({
+ content: {
+ title: newNotification.title,
+ body: newNotification.description,
+ },
+ trigger: null,
+ });
+
+ setNotifications((prevNotifications) => {
+ const updatedNotifications = [
+ {
+ id: newNotification.id,
+ createdAt: newNotification.created_at,
+ title: newNotification.title,
+ description: newNotification.description,
+ patientId: newNotification.patient_id,
+ viewed: newNotification.viewed,
+ doctorId: newNotification.doctor_id,
+ type: newNotification.type,
+ },
+ ...prevNotifications,
+ ];
+
+ return updatedNotifications;
+ });
+ }
+ }
+ )
+ .subscribe();
+
+ return () => {
+ supabase.removeChannel(channel);
+ };
+ }
+ }, [isLoggedIn, activated]);
+
+ const value = {
+ notifications,
+ getNotifications,
+ setNotifications,
+ deleteNotification,
+ createNotification,
+ };
+
+ return (
+
+ {children}
+
+ );
+}
+
+export const useNotifications = () => useContext(NotificationsContext);
diff --git a/data.json b/data.json
index f5a06c0..100d0f5 100644
--- a/data.json
+++ b/data.json
@@ -1,61 +1,31 @@
{
- "notification": [
- {
- "IconComponent": "close",
- "viewBackground": "#FEF1F1",
- "viewBackgroundDark": "#2A1F24",
- "timeFrame": "Today",
- "time": "15:36 PM",
- "notificationStatus": "Appointment Canceled",
- "sentenceOne": "You have successfully canceled your appointment with Dr.",
- "sentenceTwo": "Alan Watson on December 24, 2024, 13:00 p.m. 80% of the",
- "sentenceThree": "funds will be returned to your account."
- },
- {
- "IconComponent": "calendar",
- "viewBackground": "#F1F9F1",
- "viewBackgroundDark": "#1C2624",
- "timeFrame": "Yesterday ",
- "time": " 15:36 PM",
- "notificationStatus": "Schedule Changed",
- "sentenceOne": "You have successfully changed schedule an appointment",
- "sentenceTwo": "with Dr. Alan Watson on December 24, 2024, 13:00 pm.",
- "sentenceThree": "Dont forget to activate your reminder."
- },
- {
- "IconComponent": "calendar2",
- "viewBackground": "#EDF3FF",
- "viewBackgroundDark": "#192032",
- "timeFrame": "19 Dec .2022",
- "time": "15:36 PM",
- "notificationStatus": "Appointment Success",
- "sentenceOne": "You have successfully canceled your appointment with Dr.",
- "sentenceTwo": "Alan Watson on December 24, 2024, 13:00 p.m. 80% of the",
- "sentenceThree": "funds will be returned to your account.",
- "btnVisibility": "none"
-
- },
- {
- "IconComponent": "service",
- "viewBackground": "#FFF7EB",
- "viewBackgroundDark": "#192032",
- "timeFrame": "19 Dec .2022",
- "time": "10:52 PM",
- "notificationStatus": "New Services Available!",
- "sentenceOne": "You can now make multiple doctoral appointments at once.",
- "sentenceTwo": "You can also cancel your appointment.",
- "btnVisibility": "none"
- },
- {
- "IconComponent": "wallet",
- "viewBackground": "#EDF3FF",
- "viewBackgroundDark": "#2A241D",
- "timeFrame": "Today",
- "time": "15:36 PM",
- "notificationStatus": "Credit Card Connected",
- "sentenceOne": "Your credit card has been successfully linked with Medica.",
- "sentenceTwo": "Enjoy our service.",
- "btnVisibility": "none"
+ "_bodyBlob": {
+ "_data": {
+ "__collector": "[Object]",
+ "blobId": "36d87d31-5aa2-4275-bca1-dd42a01c669e",
+ "lastModified": 0,
+ "name": "7a117393-b05a-4841-abbb-6b0ae2cd5194.jpeg",
+ "offset": 0,
+ "size": 223253,
+ "type": "image/jpeg"
}
- ]
+ },
+ "_bodyInit": {
+ "_data": {
+ "__collector": "[Object]",
+ "blobId": "36d87d31-5aa2-4275-bca1-dd42a01c669e",
+ "lastModified": 0,
+ "name": "7a117393-b05a-4841-abbb-6b0ae2cd5194.jpeg",
+ "offset": 0,
+ "size": 223253,
+ "type": "image/jpeg"
+ }
+ },
+ "bodyUsed": true,
+ "headers": { "map": { "content-type": "image/jpeg" } },
+ "ok": true,
+ "status": 200,
+ "statusText": "",
+ "type": "default",
+ "url": ""
}
diff --git a/eas.json b/eas.json
index 45ec0c6..d7a3d0e 100644
--- a/eas.json
+++ b/eas.json
@@ -1,32 +1,24 @@
{
"build": {
- "development": {
- "developmentClient": true,
- "distribution": "internal",
- "ios": {
- "simulator": true
+ "preview": {
+ "channel": "preview",
+ "android": {
+ "buildType": "apk"
}
},
- "preview": {
+ "preview2": {
"android": {
- "buildType": "apk",
- "distribution": "internal",
- "env": {
- "EXPO_PUBLIC_SUPABASE_URL": "https://vbwbfflzxuhktdvpbspd.supabase.co",
- "EXPO_PUBLIC_SUPABASE_NON_KEY": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6InZid2JmZmx6eHVoa3RkdnBic3BkIiwicm9sZSI6ImFub24iLCJpYXQiOjE3MTgyNTg0MjgsImV4cCI6MjAzMzgzNDQyOH0.eOPZwYgyg3Ic-jbXW4Rehd2RDgqf-kt4vr30w_O9h3c",
- "EXPO_PUBLIC_STREAM_API_KEY": "62vt32txzc3m",
- "EXPO_PUBLIC_STREAM_API_SECRET": "jwwbc8b38usnqzxmf7cx38hmckxs83u5ztfxugkwbff4cxrg38vghuav9ch4x4xr"
- }
+ "gradleCommand": ":app:assembleRelease"
}
},
+ "preview3": {
+ "developmentClient": true
+ },
+ "preview4": {
+ "distribution": "internal"
+ },
"production": {
- "ios": {
- "simulator": false
- },
- "android": {}
+ "channel": "production"
}
- },
- "submit": {
- "production": {}
}
-}
+}
\ No newline at end of file
diff --git a/package-lock.json b/package-lock.json
index 4dbc2ab..0f46d48 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -35,8 +35,8 @@
"countries-list": "^3.1.0",
"dotenv": "^16.4.5",
"eas-cli": "^8.0.0",
- "expo": "~51.0.21",
- "expo-apple-authentication": "~6.4.1",
+ "expo": "~51.0.22",
+ "expo-apple-authentication": "~6.4.2",
"expo-auth-session": "~5.5.2",
"expo-av": "~14.0.6",
"expo-barcode-scanner": "~13.0.1",
@@ -55,6 +55,7 @@
"expo-local-authentication": "~14.0.1",
"expo-media-library": "~16.0.4",
"expo-navigation-bar": "~3.0.7",
+ "expo-notifications": "~0.28.11",
"expo-random": "~14.0.1",
"expo-router": "~3.5.18",
"expo-secure-store": "~13.0.2",
@@ -62,7 +63,7 @@
"expo-splash-screen": "~0.27.5",
"expo-status-bar": "^1.12.1",
"expo-system-ui": "~3.0.7",
- "expo-updates": "~0.25.20",
+ "expo-updates": "~0.25.21",
"expo-web-browser": "~13.0.3",
"flutterwave-react-native": "^1.0.4",
"husky": "^9.0.11",
@@ -301,9 +302,9 @@
}
},
"node_modules/@babel/compat-data": {
- "version": "7.24.7",
- "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.7.tgz",
- "integrity": "sha512-qJzAIcv03PyaWqxRgO4mSU3lihncDT296vnyuE2O8uA4w3UHWI4S3hgeZd1L8W1Bft40w9JxJ2b412iDUFFRhw==",
+ "version": "7.24.9",
+ "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.9.tgz",
+ "integrity": "sha512-e701mcfApCJqMMueQI0Fb68Amflj83+dvAvHawoBpAz+GDjCIyGHzNwnefjsWJ3xiYAqqiQFoWbspGYBdb2/ng==",
"license": "MIT",
"engines": {
"node": ">=6.9.0"
@@ -366,15 +367,29 @@
"node": ">=6.9.0"
}
},
- "node_modules/@babel/helper-compilation-targets": {
+ "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": {
"version": "7.24.7",
- "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.24.7.tgz",
- "integrity": "sha512-ctSdRHBi20qWOfy27RUb4Fhp07KSJ3sXcuSvTrXrc4aG8NSYDo1ici3Vhg9bg69y5bj0Mr1lh0aeEgTvc12rMg==",
+ "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.24.7.tgz",
+ "integrity": "sha512-xZeCVVdwb4MsDBkkyZ64tReWYrLRHlMN72vP7Bdm3OUOuyFZExhsHUUnuWnm2/XOlAJzR0LfPpB56WXZn0X/lA==",
"license": "MIT",
+ "peer": true,
"dependencies": {
- "@babel/compat-data": "^7.24.7",
- "@babel/helper-validator-option": "^7.24.7",
- "browserslist": "^4.22.2",
+ "@babel/traverse": "^7.24.7",
+ "@babel/types": "^7.24.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-compilation-targets": {
+ "version": "7.24.8",
+ "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.24.8.tgz",
+ "integrity": "sha512-oU+UoqCHdp+nWVDkpldqIQL/i/bvAv53tRqLG/s+cOXxe66zOYLU7ar/Xs3LdmBihrUMEUhwu6dMZwbNOYDwvw==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/compat-data": "^7.24.8",
+ "@babel/helper-validator-option": "^7.24.8",
+ "browserslist": "^4.23.1",
"lru-cache": "^5.1.1",
"semver": "^6.3.1"
},
@@ -519,9 +534,9 @@
}
},
"node_modules/@babel/helper-module-transforms": {
- "version": "7.24.7",
- "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.24.7.tgz",
- "integrity": "sha512-1fuJEwIrp+97rM4RWdO+qrRsZlAeL1lQJoPqtCYWv0NL115XM93hIH4CSRln2w52SqvmY5hqdtauB6QFCDiZNQ==",
+ "version": "7.24.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.24.9.tgz",
+ "integrity": "sha512-oYbh+rtFKj/HwBQkFlUzvcybzklmVdVV3UU+mN7n2t/q3yGHbuVdNxyFvSBO1tfvjyArpHNcWMAzsSPdyI46hw==",
"license": "MIT",
"dependencies": {
"@babel/helper-environment-visitor": "^7.24.7",
@@ -550,9 +565,9 @@
}
},
"node_modules/@babel/helper-plugin-utils": {
- "version": "7.24.7",
- "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.7.tgz",
- "integrity": "sha512-Rq76wjt7yz9AAc1KnlRKNAi/dMSVWgDRx43FHoJEbcYU6xOWaE2dVPwcdTukJrjxS65GITyfbvEYHvkirZ6uEg==",
+ "version": "7.24.8",
+ "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.8.tgz",
+ "integrity": "sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg==",
"license": "MIT",
"engines": {
"node": ">=6.9.0"
@@ -649,9 +664,9 @@
}
},
"node_modules/@babel/helper-validator-option": {
- "version": "7.24.7",
- "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.7.tgz",
- "integrity": "sha512-yy1/KvjhV/ZCL+SM7hBrvnZJ3ZuT9OuZgIJAGpPEToANvc3iM6iDvBnRjtElWibHU6n8/LPR/EjX9EtIEYO3pw==",
+ "version": "7.24.8",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.8.tgz",
+ "integrity": "sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q==",
"license": "MIT",
"engines": {
"node": ">=6.9.0"
@@ -712,6 +727,74 @@
"node": ">=6.0.0"
}
},
+ "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": {
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.24.7.tgz",
+ "integrity": "sha512-TiT1ss81W80eQsN+722OaeQMY/G4yTb4G9JrqeiDADs3N8lbPMGldWi9x8tyqCW5NLx1Jh2AvkE6r6QvEltMMQ==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@babel/helper-environment-visitor": "^7.24.7",
+ "@babel/helper-plugin-utils": "^7.24.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": {
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.24.7.tgz",
+ "integrity": "sha512-unaQgZ/iRu/By6tsjMZzpeBZjChYfLYry6HrEXPoz3KmfF0sVBQ1l8zKMQ4xRGLWVsjuvB8nQfjNP/DcfEOCsg==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.24.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": {
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.24.7.tgz",
+ "integrity": "sha512-+izXIbke1T33mY4MSNnrqhPXDz01WYhEf3yF5NbnUtkiNnm+XBZJl3kNfoK6NKmYlz/D07+l2GWVK/QfDkNCuQ==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.24.7",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7",
+ "@babel/plugin-transform-optional-chaining": "^7.24.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.13.0"
+ }
+ },
+ "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": {
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.24.7.tgz",
+ "integrity": "sha512-utA4HuR6F4Vvcr+o4DnjL8fCOlgRFGbeeBEGNg3ZTrLFw6VWG5XmUrvcQ0FjIYMU2ST4XcR2Wsp7t9qOAPnxMg==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@babel/helper-environment-visitor": "^7.24.7",
+ "@babel/helper-plugin-utils": "^7.24.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
"node_modules/@babel/plugin-proposal-async-generator-functions": {
"version": "7.20.7",
"resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.7.tgz",
@@ -887,6 +970,19 @@
"@babel/core": "^7.0.0-0"
}
},
+ "node_modules/@babel/plugin-proposal-private-property-in-object": {
+ "version": "7.21.0-placeholder-for-preset-env.2",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz",
+ "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==",
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
"node_modules/@babel/plugin-syntax-async-generators": {
"version": "7.8.4",
"resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz",
@@ -916,7 +1012,6 @@
"version": "7.12.13",
"resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz",
"integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==",
- "dev": true,
"license": "MIT",
"dependencies": {
"@babel/helper-plugin-utils": "^7.12.13"
@@ -925,6 +1020,22 @@
"@babel/core": "^7.0.0-0"
}
},
+ "node_modules/@babel/plugin-syntax-class-static-block": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz",
+ "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.14.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
"node_modules/@babel/plugin-syntax-decorators": {
"version": "7.24.7",
"resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.24.7.tgz",
@@ -994,11 +1105,42 @@
"@babel/core": "^7.0.0-0"
}
},
+ "node_modules/@babel/plugin-syntax-import-assertions": {
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.24.7.tgz",
+ "integrity": "sha512-Ec3NRUMoi8gskrkBe3fNmEQfxDvY8bgfQpz6jlk/41kX9eUjvpyqWU7PBP/pLAvMaSQjbMNKJmvX57jP+M6bPg==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.24.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-import-attributes": {
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.24.7.tgz",
+ "integrity": "sha512-hbX+lKKeUMGihnK8nvKqmXBInriT3GVjzXKFriV3YC6APGxMbP8RZNFwy91+hocLXq90Mta+HshoB31802bb8A==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.24.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
"node_modules/@babel/plugin-syntax-import-meta": {
"version": "7.10.4",
"resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz",
"integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==",
- "dev": true,
"license": "MIT",
"dependencies": {
"@babel/helper-plugin-utils": "^7.10.4"
@@ -1011,7 +1153,6 @@
"version": "7.8.3",
"resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz",
"integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==",
- "dev": true,
"license": "MIT",
"dependencies": {
"@babel/helper-plugin-utils": "^7.8.0"
@@ -1126,7 +1267,6 @@
"version": "7.14.5",
"resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz",
"integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==",
- "dev": true,
"license": "MIT",
"dependencies": {
"@babel/helper-plugin-utils": "^7.14.5"
@@ -1153,6 +1293,23 @@
"@babel/core": "^7.0.0-0"
}
},
+ "node_modules/@babel/plugin-syntax-unicode-sets-regex": {
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz",
+ "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@babel/helper-create-regexp-features-plugin": "^7.18.6",
+ "@babel/helper-plugin-utils": "^7.18.6"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
"node_modules/@babel/plugin-transform-arrow-functions": {
"version": "7.24.7",
"resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.24.7.tgz",
@@ -1168,6 +1325,25 @@
"@babel/core": "^7.0.0-0"
}
},
+ "node_modules/@babel/plugin-transform-async-generator-functions": {
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.24.7.tgz",
+ "integrity": "sha512-o+iF77e3u7ZS4AoAuJvapz9Fm001PuD2V3Lp6OSE4FYQke+cSewYtnek+THqGRWyQloRCyvWL1OkyfNEl9vr/g==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@babel/helper-environment-visitor": "^7.24.7",
+ "@babel/helper-plugin-utils": "^7.24.7",
+ "@babel/helper-remap-async-to-generator": "^7.24.7",
+ "@babel/plugin-syntax-async-generators": "^7.8.4"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
"node_modules/@babel/plugin-transform-async-to-generator": {
"version": "7.24.7",
"resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.24.7.tgz",
@@ -1185,6 +1361,22 @@
"@babel/core": "^7.0.0-0"
}
},
+ "node_modules/@babel/plugin-transform-block-scoped-functions": {
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.24.7.tgz",
+ "integrity": "sha512-yO7RAz6EsVQDaBH18IDJcMB1HnrUn2FJ/Jslc/WtPPWcjhpUJXU/rjbwmluzp7v/ZzWcEhTMXELnnsz8djWDwQ==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.24.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
"node_modules/@babel/plugin-transform-block-scoping": {
"version": "7.24.7",
"resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.24.7.tgz",
@@ -1200,17 +1392,52 @@
"@babel/core": "^7.0.0-0"
}
},
- "node_modules/@babel/plugin-transform-classes": {
+ "node_modules/@babel/plugin-transform-class-properties": {
"version": "7.24.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.24.7.tgz",
- "integrity": "sha512-CFbbBigp8ln4FU6Bpy6g7sE8B/WmCmzvivzUC6xDAdWVsjYTXijpuuGJmYkAaoWAzcItGKT3IOAbxRItZ5HTjw==",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.24.7.tgz",
+ "integrity": "sha512-vKbfawVYayKcSeSR5YYzzyXvsDFWU2mD8U5TFeXtbCPLFUqe7GyCgvO6XDHzje862ODrOwy6WCPmKeWHbCFJ4w==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@babel/helper-create-class-features-plugin": "^7.24.7",
+ "@babel/helper-plugin-utils": "^7.24.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-class-static-block": {
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.24.7.tgz",
+ "integrity": "sha512-HMXK3WbBPpZQufbMG4B46A90PkuuhN9vBCb5T8+VAHqvAqvcLi+2cKoukcpmUYkszLhScU3l1iudhrks3DggRQ==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@babel/helper-create-class-features-plugin": "^7.24.7",
+ "@babel/helper-plugin-utils": "^7.24.7",
+ "@babel/plugin-syntax-class-static-block": "^7.14.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.12.0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-classes": {
+ "version": "7.24.8",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.24.8.tgz",
+ "integrity": "sha512-VXy91c47uujj758ud9wx+OMgheXm4qJfyhj1P18YvlrQkNOSrwsteHk+EFS3OMGfhMhpZa0A+81eE7G4QC+3CA==",
"license": "MIT",
"dependencies": {
"@babel/helper-annotate-as-pure": "^7.24.7",
- "@babel/helper-compilation-targets": "^7.24.7",
+ "@babel/helper-compilation-targets": "^7.24.8",
"@babel/helper-environment-visitor": "^7.24.7",
"@babel/helper-function-name": "^7.24.7",
- "@babel/helper-plugin-utils": "^7.24.7",
+ "@babel/helper-plugin-utils": "^7.24.8",
"@babel/helper-replace-supers": "^7.24.7",
"@babel/helper-split-export-declaration": "^7.24.7",
"globals": "^11.1.0"
@@ -1248,11 +1475,78 @@
}
},
"node_modules/@babel/plugin-transform-destructuring": {
+ "version": "7.24.8",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.8.tgz",
+ "integrity": "sha512-36e87mfY8TnRxc7yc6M9g9gOB7rKgSahqkIKwLpz4Ppk2+zC2Cy1is0uwtuSG6AE4zlTOUa+7JGz9jCJGLqQFQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.24.8"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-dotall-regex": {
"version": "7.24.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.7.tgz",
- "integrity": "sha512-19eJO/8kdCQ9zISOf+SEUJM/bAUIsvY3YDnXZTupUCQ8LgrWnsG/gFB9dvXqdXnRXMAM8fvt7b0CBKQHNGy1mw==",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.24.7.tgz",
+ "integrity": "sha512-ZOA3W+1RRTSWvyqcMJDLqbchh7U4NRGqwRfFSVbOLS/ePIP4vHB5e8T8eXcuqyN1QkgKyj5wuW0lcS85v4CrSw==",
"license": "MIT",
+ "peer": true,
"dependencies": {
+ "@babel/helper-create-regexp-features-plugin": "^7.24.7",
+ "@babel/helper-plugin-utils": "^7.24.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-duplicate-keys": {
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.24.7.tgz",
+ "integrity": "sha512-JdYfXyCRihAe46jUIliuL2/s0x0wObgwwiGxw/UbgJBr20gQBThrokO4nYKgWkD7uBaqM7+9x5TU7NkExZJyzw==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.24.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-dynamic-import": {
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.24.7.tgz",
+ "integrity": "sha512-sc3X26PhZQDb3JhORmakcbvkeInvxz+A8oda99lj7J60QRuPZvNAk9wQlTBS1ZynelDrDmTU4pw1tyc5d5ZMUg==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.24.7",
+ "@babel/plugin-syntax-dynamic-import": "^7.8.3"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-exponentiation-operator": {
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.24.7.tgz",
+ "integrity": "sha512-Rqe/vSc9OYgDajNIK35u7ot+KeCoetqQYFXM4Epf7M7ez3lWlOjrDjrwMei6caCVhfdw+mIKD4cgdGNy5JQotQ==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@babel/helper-builder-binary-assignment-operator-visitor": "^7.24.7",
"@babel/helper-plugin-utils": "^7.24.7"
},
"engines": {
@@ -1294,6 +1588,23 @@
"@babel/core": "^7.0.0-0"
}
},
+ "node_modules/@babel/plugin-transform-for-of": {
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.24.7.tgz",
+ "integrity": "sha512-wo9ogrDG1ITTTBsy46oGiN1dS9A7MROBTcYsfS8DtsImMkHk9JXJ3EWQM6X2SUw4x80uGPlwj0o00Uoc6nEE3g==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.24.7",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
"node_modules/@babel/plugin-transform-function-name": {
"version": "7.24.7",
"resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.24.7.tgz",
@@ -1311,6 +1622,23 @@
"@babel/core": "^7.0.0-0"
}
},
+ "node_modules/@babel/plugin-transform-json-strings": {
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.24.7.tgz",
+ "integrity": "sha512-2yFnBGDvRuxAaE/f0vfBKvtnvvqU8tGpMHqMNpTN2oWMKIR3NqFkjaAgGwawhqK/pIN2T3XdjGPdaG0vDhOBGw==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.24.7",
+ "@babel/plugin-syntax-json-strings": "^7.8.3"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
"node_modules/@babel/plugin-transform-literals": {
"version": "7.24.7",
"resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.24.7.tgz",
@@ -1326,15 +1654,101 @@
"@babel/core": "^7.0.0-0"
}
},
+ "node_modules/@babel/plugin-transform-logical-assignment-operators": {
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.24.7.tgz",
+ "integrity": "sha512-4D2tpwlQ1odXmTEIFWy9ELJcZHqrStlzK/dAOWYyxX3zT0iXQB6banjgeOJQXzEc4S0E0a5A+hahxPaEFYftsw==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.24.7",
+ "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-member-expression-literals": {
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.24.7.tgz",
+ "integrity": "sha512-T/hRC1uqrzXMKLQ6UCwMT85S3EvqaBXDGf0FaMf4446Qx9vKwlghvee0+uuZcDUCZU5RuNi4781UQ7R308zzBw==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.24.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-modules-amd": {
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.24.7.tgz",
+ "integrity": "sha512-9+pB1qxV3vs/8Hdmz/CulFB8w2tuu6EB94JZFsjdqxQokwGa9Unap7Bo2gGBGIvPmDIVvQrom7r5m/TCDMURhg==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@babel/helper-module-transforms": "^7.24.7",
+ "@babel/helper-plugin-utils": "^7.24.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
"node_modules/@babel/plugin-transform-modules-commonjs": {
+ "version": "7.24.8",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.8.tgz",
+ "integrity": "sha512-WHsk9H8XxRs3JXKWFiqtQebdh9b/pTk4EgueygFzYlTKAg0Ud985mSevdNjdXdFBATSKVJGQXP1tv6aGbssLKA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-module-transforms": "^7.24.8",
+ "@babel/helper-plugin-utils": "^7.24.8",
+ "@babel/helper-simple-access": "^7.24.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-modules-systemjs": {
"version": "7.24.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.7.tgz",
- "integrity": "sha512-iFI8GDxtevHJ/Z22J5xQpVqFLlMNstcLXh994xifFwxxGslr2ZXXLWgtBeLctOD63UFDArdvN6Tg8RFw+aEmjQ==",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.24.7.tgz",
+ "integrity": "sha512-GYQE0tW7YoaN13qFh3O1NCY4MPkUiAH3fiF7UcV/I3ajmDKEdG3l+UOcbAm4zUE3gnvUU+Eni7XrVKo9eO9auw==",
"license": "MIT",
+ "peer": true,
"dependencies": {
+ "@babel/helper-hoist-variables": "^7.24.7",
"@babel/helper-module-transforms": "^7.24.7",
"@babel/helper-plugin-utils": "^7.24.7",
- "@babel/helper-simple-access": "^7.24.7"
+ "@babel/helper-validator-identifier": "^7.24.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-modules-umd": {
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.24.7.tgz",
+ "integrity": "sha512-3aytQvqJ/h9z4g8AsKPLvD4Zqi2qT+L3j7XoFFu1XBlZWEl2/1kWnhmAbxpLgPrHSY0M6UA02jyTiwUVtiKR6A==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@babel/helper-module-transforms": "^7.24.7",
+ "@babel/helper-plugin-utils": "^7.24.7"
},
"engines": {
"node": ">=6.9.0"
@@ -1359,6 +1773,22 @@
"@babel/core": "^7.0.0"
}
},
+ "node_modules/@babel/plugin-transform-new-target": {
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.24.7.tgz",
+ "integrity": "sha512-RNKwfRIXg4Ls/8mMTza5oPF5RkOW8Wy/WgMAp1/F1yZ8mMbtwXW+HDoJiOsagWrAhI5f57Vncrmr9XeT4CVapA==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.24.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
"node_modules/@babel/plugin-transform-nullish-coalescing-operator": {
"version": "7.24.7",
"resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.24.7.tgz",
@@ -1375,6 +1805,23 @@
"@babel/core": "^7.0.0-0"
}
},
+ "node_modules/@babel/plugin-transform-numeric-separator": {
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.24.7.tgz",
+ "integrity": "sha512-e6q1TiVUzvH9KRvicuxdBTUj4AdKSRwzIyFFnfnezpCfP2/7Qmbb8qbU2j7GODbl4JMkblitCQjKYUaX/qkkwA==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.24.7",
+ "@babel/plugin-syntax-numeric-separator": "^7.10.4"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
"node_modules/@babel/plugin-transform-object-rest-spread": {
"version": "7.24.7",
"resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.7.tgz",
@@ -1393,13 +1840,47 @@
"@babel/core": "^7.0.0-0"
}
},
- "node_modules/@babel/plugin-transform-optional-chaining": {
+ "node_modules/@babel/plugin-transform-object-super": {
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.24.7.tgz",
+ "integrity": "sha512-A/vVLwN6lBrMFmMDmPPz0jnE6ZGx7Jq7d6sT/Ev4H65RER6pZ+kczlf1DthF5N0qaPHBsI7UXiE8Zy66nmAovg==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.24.7",
+ "@babel/helper-replace-supers": "^7.24.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-optional-catch-binding": {
"version": "7.24.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.7.tgz",
- "integrity": "sha512-tK+0N9yd4j+x/4hxF3F0e0fu/VdcxU18y5SevtyM/PCFlQvXbR0Zmlo2eBrKtVipGNFzpq56o8WsIIKcJFUCRQ==",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.24.7.tgz",
+ "integrity": "sha512-uLEndKqP5BfBbC/5jTwPxLh9kqPWWgzN/f8w6UwAIirAEqiIVJWWY312X72Eub09g5KF9+Zn7+hT7sDxmhRuKA==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"@babel/helper-plugin-utils": "^7.24.7",
+ "@babel/plugin-syntax-optional-catch-binding": "^7.8.3"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-optional-chaining": {
+ "version": "7.24.8",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.8.tgz",
+ "integrity": "sha512-5cTOLSMs9eypEy8JUVvIKOu6NgvbJMnpG62VpIHrTmROdQ+L5mDAaI40g25k5vXti55JWNX5jCkq3HZxXBQANw==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.24.8",
"@babel/helper-skip-transparent-expression-wrappers": "^7.24.7",
"@babel/plugin-syntax-optional-chaining": "^7.8.3"
},
@@ -1459,6 +1940,22 @@
"@babel/core": "^7.0.0-0"
}
},
+ "node_modules/@babel/plugin-transform-property-literals": {
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.24.7.tgz",
+ "integrity": "sha512-EMi4MLQSHfd2nrCqQEWxFdha2gBCqU4ZcCng4WBGZ5CJL4bBRW0ptdqqDdeirGZcpALazVVNJqRmsO8/+oNCBA==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.24.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
"node_modules/@babel/plugin-transform-react-display-name": {
"version": "7.24.7",
"resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.24.7.tgz",
@@ -1554,6 +2051,39 @@
"@babel/core": "^7.0.0-0"
}
},
+ "node_modules/@babel/plugin-transform-regenerator": {
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.24.7.tgz",
+ "integrity": "sha512-lq3fvXPdimDrlg6LWBoqj+r/DEWgONuwjuOuQCSYgRroXDH/IdM1C0IZf59fL5cHLpjEH/O6opIRBbqv7ELnuA==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.24.7",
+ "regenerator-transform": "^0.15.2"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-reserved-words": {
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.24.7.tgz",
+ "integrity": "sha512-0DUq0pHcPKbjFZCfTss/pGkYMfy3vFWydkUBd9r0GHpIyfs2eCDENvqadMycRS9wZCXR41wucAfJHJmwA0UmoQ==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.24.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
"node_modules/@babel/plugin-transform-runtime": {
"version": "7.24.7",
"resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.24.7.tgz",
@@ -1635,6 +2165,22 @@
"@babel/core": "^7.0.0-0"
}
},
+ "node_modules/@babel/plugin-transform-typeof-symbol": {
+ "version": "7.24.8",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.8.tgz",
+ "integrity": "sha512-adNTUpDCVnmAE58VEqKlAA6ZBlNkMnWD0ZcW76lyNFN3MJniyGFZfNwERVk8Ap56MCnXztmDr19T4mPTztcuaw==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.24.8"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
"node_modules/@babel/plugin-transform-typescript": {
"version": "7.24.7",
"resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.24.7.tgz",
@@ -1653,6 +2199,39 @@
"@babel/core": "^7.0.0-0"
}
},
+ "node_modules/@babel/plugin-transform-unicode-escapes": {
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.24.7.tgz",
+ "integrity": "sha512-U3ap1gm5+4edc2Q/P+9VrBNhGkfnf+8ZqppY71Bo/pzZmXhhLdqgaUl6cuB07O1+AQJtCLfaOmswiNbSQ9ivhw==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.24.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-unicode-property-regex": {
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.24.7.tgz",
+ "integrity": "sha512-uH2O4OV5M9FZYQrwc7NdVmMxQJOCCzFeYudlZSzUAHRFeOujQefa92E74TQDVskNHCzOXoigEuoyzHDhaEaK5w==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@babel/helper-create-regexp-features-plugin": "^7.24.7",
+ "@babel/helper-plugin-utils": "^7.24.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
"node_modules/@babel/plugin-transform-unicode-regex": {
"version": "7.24.7",
"resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.24.7.tgz",
@@ -1669,6 +2248,119 @@
"@babel/core": "^7.0.0-0"
}
},
+ "node_modules/@babel/plugin-transform-unicode-sets-regex": {
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.24.7.tgz",
+ "integrity": "sha512-2G8aAvF4wy1w/AGZkemprdGMRg5o6zPNhbHVImRz3lss55TYCBd6xStN19rt8XJHq20sqV0JbyWjOWwQRwV/wg==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@babel/helper-create-regexp-features-plugin": "^7.24.7",
+ "@babel/helper-plugin-utils": "^7.24.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/preset-env": {
+ "version": "7.24.8",
+ "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.24.8.tgz",
+ "integrity": "sha512-vObvMZB6hNWuDxhSaEPTKCwcqkAIuDtE+bQGn4XMXne1DSLzFVY8Vmj1bm+mUQXYNN8NmaQEO+r8MMbzPr1jBQ==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@babel/compat-data": "^7.24.8",
+ "@babel/helper-compilation-targets": "^7.24.8",
+ "@babel/helper-plugin-utils": "^7.24.8",
+ "@babel/helper-validator-option": "^7.24.8",
+ "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.24.7",
+ "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.24.7",
+ "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.24.7",
+ "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.24.7",
+ "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2",
+ "@babel/plugin-syntax-async-generators": "^7.8.4",
+ "@babel/plugin-syntax-class-properties": "^7.12.13",
+ "@babel/plugin-syntax-class-static-block": "^7.14.5",
+ "@babel/plugin-syntax-dynamic-import": "^7.8.3",
+ "@babel/plugin-syntax-export-namespace-from": "^7.8.3",
+ "@babel/plugin-syntax-import-assertions": "^7.24.7",
+ "@babel/plugin-syntax-import-attributes": "^7.24.7",
+ "@babel/plugin-syntax-import-meta": "^7.10.4",
+ "@babel/plugin-syntax-json-strings": "^7.8.3",
+ "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4",
+ "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3",
+ "@babel/plugin-syntax-numeric-separator": "^7.10.4",
+ "@babel/plugin-syntax-object-rest-spread": "^7.8.3",
+ "@babel/plugin-syntax-optional-catch-binding": "^7.8.3",
+ "@babel/plugin-syntax-optional-chaining": "^7.8.3",
+ "@babel/plugin-syntax-private-property-in-object": "^7.14.5",
+ "@babel/plugin-syntax-top-level-await": "^7.14.5",
+ "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6",
+ "@babel/plugin-transform-arrow-functions": "^7.24.7",
+ "@babel/plugin-transform-async-generator-functions": "^7.24.7",
+ "@babel/plugin-transform-async-to-generator": "^7.24.7",
+ "@babel/plugin-transform-block-scoped-functions": "^7.24.7",
+ "@babel/plugin-transform-block-scoping": "^7.24.7",
+ "@babel/plugin-transform-class-properties": "^7.24.7",
+ "@babel/plugin-transform-class-static-block": "^7.24.7",
+ "@babel/plugin-transform-classes": "^7.24.8",
+ "@babel/plugin-transform-computed-properties": "^7.24.7",
+ "@babel/plugin-transform-destructuring": "^7.24.8",
+ "@babel/plugin-transform-dotall-regex": "^7.24.7",
+ "@babel/plugin-transform-duplicate-keys": "^7.24.7",
+ "@babel/plugin-transform-dynamic-import": "^7.24.7",
+ "@babel/plugin-transform-exponentiation-operator": "^7.24.7",
+ "@babel/plugin-transform-export-namespace-from": "^7.24.7",
+ "@babel/plugin-transform-for-of": "^7.24.7",
+ "@babel/plugin-transform-function-name": "^7.24.7",
+ "@babel/plugin-transform-json-strings": "^7.24.7",
+ "@babel/plugin-transform-literals": "^7.24.7",
+ "@babel/plugin-transform-logical-assignment-operators": "^7.24.7",
+ "@babel/plugin-transform-member-expression-literals": "^7.24.7",
+ "@babel/plugin-transform-modules-amd": "^7.24.7",
+ "@babel/plugin-transform-modules-commonjs": "^7.24.8",
+ "@babel/plugin-transform-modules-systemjs": "^7.24.7",
+ "@babel/plugin-transform-modules-umd": "^7.24.7",
+ "@babel/plugin-transform-named-capturing-groups-regex": "^7.24.7",
+ "@babel/plugin-transform-new-target": "^7.24.7",
+ "@babel/plugin-transform-nullish-coalescing-operator": "^7.24.7",
+ "@babel/plugin-transform-numeric-separator": "^7.24.7",
+ "@babel/plugin-transform-object-rest-spread": "^7.24.7",
+ "@babel/plugin-transform-object-super": "^7.24.7",
+ "@babel/plugin-transform-optional-catch-binding": "^7.24.7",
+ "@babel/plugin-transform-optional-chaining": "^7.24.8",
+ "@babel/plugin-transform-parameters": "^7.24.7",
+ "@babel/plugin-transform-private-methods": "^7.24.7",
+ "@babel/plugin-transform-private-property-in-object": "^7.24.7",
+ "@babel/plugin-transform-property-literals": "^7.24.7",
+ "@babel/plugin-transform-regenerator": "^7.24.7",
+ "@babel/plugin-transform-reserved-words": "^7.24.7",
+ "@babel/plugin-transform-shorthand-properties": "^7.24.7",
+ "@babel/plugin-transform-spread": "^7.24.7",
+ "@babel/plugin-transform-sticky-regex": "^7.24.7",
+ "@babel/plugin-transform-template-literals": "^7.24.7",
+ "@babel/plugin-transform-typeof-symbol": "^7.24.8",
+ "@babel/plugin-transform-unicode-escapes": "^7.24.7",
+ "@babel/plugin-transform-unicode-property-regex": "^7.24.7",
+ "@babel/plugin-transform-unicode-regex": "^7.24.7",
+ "@babel/plugin-transform-unicode-sets-regex": "^7.24.7",
+ "@babel/preset-modules": "0.1.6-no-external-plugins",
+ "babel-plugin-polyfill-corejs2": "^0.4.10",
+ "babel-plugin-polyfill-corejs3": "^0.10.4",
+ "babel-plugin-polyfill-regenerator": "^0.6.1",
+ "core-js-compat": "^3.37.1",
+ "semver": "^6.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
"node_modules/@babel/preset-flow": {
"version": "7.24.7",
"resolved": "https://registry.npmjs.org/@babel/preset-flow/-/preset-flow-7.24.7.tgz",
@@ -1686,6 +2378,21 @@
"@babel/core": "^7.0.0-0"
}
},
+ "node_modules/@babel/preset-modules": {
+ "version": "0.1.6-no-external-plugins",
+ "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz",
+ "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.0.0",
+ "@babel/types": "^7.4.4",
+ "esutils": "^2.0.2"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0"
+ }
+ },
"node_modules/@babel/preset-react": {
"version": "7.24.7",
"resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.24.7.tgz",
@@ -4326,9 +5033,9 @@
}
},
"node_modules/@expo/metro-config": {
- "version": "0.18.8",
- "resolved": "https://registry.npmjs.org/@expo/metro-config/-/metro-config-0.18.8.tgz",
- "integrity": "sha512-YGpTlVc1/6EPzPbt0LZt92Bwrpjngulup6uHSTRbwn/heMPfFaVv1Y4VE3GAUkx7/Qwu+dTVIV0Kys4pLOAIiw==",
+ "version": "0.18.9",
+ "resolved": "https://registry.npmjs.org/@expo/metro-config/-/metro-config-0.18.9.tgz",
+ "integrity": "sha512-kcqT/wuO43zxuFeR5AR/pMuq/O9qtIyuTI1wYvBY97blHAYU/wfPJKW3xFL14fDkPqQOc87hEEhjlJiXoebvcw==",
"license": "MIT",
"dependencies": {
"@babel/core": "^7.20.0",
@@ -6016,6 +6723,12 @@
"dev": true,
"license": "ISC"
},
+ "node_modules/@ide/backoff": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/@ide/backoff/-/backoff-1.0.0.tgz",
+ "integrity": "sha512-F0YfUDjvT+Mtt/R4xdl2X0EYCHMMiJqNLdxHD++jDT5ydEFIyqbCHh51Qx2E211dgZprPKhV7sHmnXKpLuvc5g==",
+ "license": "MIT"
+ },
"node_modules/@inquirer/figures": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.3.tgz",
@@ -10426,6 +11139,40 @@
"web-streams-polyfill": "^3.1.1"
}
},
+ "node_modules/@rneui/base": {
+ "version": "4.0.0-rc.7",
+ "resolved": "https://registry.npmjs.org/@rneui/base/-/base-4.0.0-rc.7.tgz",
+ "integrity": "sha512-dffzoYek3Qp+7wJzC42QjI/Fu1HOUNxFIR88t1laDrBV5QZQB55f+Vu5zLbC80/bh1b8fYtl63HTIWpORuA3Eg==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@types/react-native-vector-icons": "^6.4.10",
+ "color": "^3.2.1",
+ "deepmerge": "^4.2.2",
+ "hoist-non-react-statics": "^3.3.2",
+ "react-native-ratings": "^8.1.0",
+ "react-native-size-matters": "^0.4.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/react-native-elements"
+ },
+ "peerDependencies": {
+ "react-native-safe-area-context": "^3.1.9 || ^4.0.0",
+ "react-native-vector-icons": ">7.0.0"
+ }
+ },
+ "node_modules/@rneui/base/node_modules/color": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/color/-/color-3.2.1.tgz",
+ "integrity": "sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "color-convert": "^1.9.3",
+ "color-string": "^1.6.0"
+ }
+ },
"node_modules/@rneui/themed": {
"version": "4.0.0-rc.8",
"resolved": "https://registry.npmjs.org/@rneui/themed/-/themed-4.0.0-rc.8.tgz",
@@ -11766,6 +12513,16 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/array-find-index": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz",
+ "integrity": "sha512-M1HQyIXcBGtVywBt8WVdim+lrNaK7VHp99Qt5pSNziXznKHViIBbXWtfRTpEFpF/c4FdfxNAsCCwPp5phBYJtw==",
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
"node_modules/array-ify": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz",
@@ -11913,6 +12670,16 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/art": {
+ "version": "0.10.3",
+ "resolved": "https://registry.npmjs.org/art/-/art-0.10.3.tgz",
+ "integrity": "sha512-HXwbdofRTiJT6qZX/FnchtldzJjS3vkLJxQilc3Xj+ma2MXjY4UAyQ0ls1XZYVnDvVIBiFZbC6QsvtW86TD6tQ==",
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": "*"
+ }
+ },
"node_modules/asap": {
"version": "2.0.6",
"resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz",
@@ -11928,6 +12695,19 @@
"safer-buffer": "~2.1.0"
}
},
+ "node_modules/assert": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/assert/-/assert-2.1.0.tgz",
+ "integrity": "sha512-eLHpSK/Y4nhMJ07gDaAzoX/XAKS8PSaojml3M0DM4JpV1LAi5JOJ/p6H/XWrl8L+DzVEvVCW1z3vWAaB9oTsQw==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "is-nan": "^1.3.2",
+ "object-is": "^1.1.5",
+ "object.assign": "^4.1.4",
+ "util": "^0.12.5"
+ }
+ },
"node_modules/assert-plus": {
"version": "0.1.5",
"resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.1.5.tgz",
@@ -11937,6 +12717,19 @@
"node": ">=0.8"
}
},
+ "node_modules/assert/node_modules/util": {
+ "version": "0.12.5",
+ "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz",
+ "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==",
+ "license": "MIT",
+ "dependencies": {
+ "inherits": "^2.0.3",
+ "is-arguments": "^1.0.4",
+ "is-generator-function": "^1.0.7",
+ "is-typed-array": "^1.1.3",
+ "which-typed-array": "^1.1.2"
+ }
+ },
"node_modules/ast-types": {
"version": "0.15.2",
"resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.15.2.tgz",
@@ -12417,6 +13210,12 @@
"@babel/core": "^7.0.0"
}
},
+ "node_modules/badgin": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/badgin/-/badgin-1.2.3.tgz",
+ "integrity": "sha512-NQGA7LcfCpSzIbGRbkgjgdWkjy7HI+Th5VLxTJfW5EeaAf3fnS+xWQaQOCYiny+q6QSvxqoSO04vCx+4u++EJw==",
+ "license": "MIT"
+ },
"node_modules/balanced-match": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
@@ -13758,6 +14557,15 @@
"node": ">=6.6.0"
}
},
+ "node_modules/core-js": {
+ "version": "2.6.12",
+ "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz",
+ "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==",
+ "deprecated": "core-js@<3.23.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js.",
+ "hasInstallScript": true,
+ "license": "MIT",
+ "peer": true
+ },
"node_modules/core-js-compat": {
"version": "3.37.1",
"resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.37.1.tgz",
@@ -13931,6 +14739,17 @@
"node": ">=8"
}
},
+ "node_modules/create-react-class": {
+ "version": "15.7.0",
+ "resolved": "https://registry.npmjs.org/create-react-class/-/create-react-class-15.7.0.tgz",
+ "integrity": "sha512-QZv4sFWG9S5RUvkTYWbflxeZX+JG7Cz0Tn33rQBJ+WFQTqTfUTjMjiv9tnfXazjsO5r0KhPs+AqCjyrQX6h2ng==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "loose-envify": "^1.3.1",
+ "object-assign": "^4.1.1"
+ }
+ },
"node_modules/create-require": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz",
@@ -14247,6 +15066,13 @@
"integrity": "sha512-okzr3f11N6WuqYtZSvm+F776mB41wRZMhKP+hc34YdW+KmtYYK9iqvHSwo2k9FEH3fhGXvOPV6yz2IcSrfRUDg==",
"license": "MIT"
},
+ "node_modules/debounce": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/debounce/-/debounce-1.2.1.tgz",
+ "integrity": "sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==",
+ "license": "MIT",
+ "peer": true
+ },
"node_modules/debug": {
"version": "4.3.5",
"resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz",
@@ -14331,6 +15157,30 @@
}
}
},
+ "node_modules/deep-assign": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/deep-assign/-/deep-assign-3.0.0.tgz",
+ "integrity": "sha512-YX2i9XjJ7h5q/aQ/IM9PEwEnDqETAIYbggmdDB3HLTlSgo1CxPsj6pvhPG68rq6SVE0+p+6Ywsm5fTYNrYtBWw==",
+ "deprecated": "Check out `lodash.merge` or `merge-options` instead.",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "is-obj": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/deep-assign/node_modules/is-obj": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz",
+ "integrity": "sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==",
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
"node_modules/deep-extend": {
"version": "0.6.0",
"resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz",
@@ -15233,6 +16083,29 @@
"node": ">= 0.8"
}
},
+ "node_modules/encoding": {
+ "version": "0.1.13",
+ "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz",
+ "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "iconv-lite": "^0.6.2"
+ }
+ },
+ "node_modules/encoding/node_modules/iconv-lite": {
+ "version": "0.6.3",
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
+ "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "safer-buffer": ">= 2.1.2 < 3.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
"node_modules/end-of-stream": {
"version": "1.4.4",
"resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz",
@@ -16015,7 +16888,6 @@
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
"integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
- "dev": true,
"license": "BSD-2-Clause",
"engines": {
"node": ">=0.10.0"
@@ -16103,16 +16975,16 @@
}
},
"node_modules/expo": {
- "version": "51.0.21",
- "resolved": "https://registry.npmjs.org/expo/-/expo-51.0.21.tgz",
- "integrity": "sha512-tCKJUw4U4F15FecFPwJTFnAwHZMmUD1Wm7FX0Z/Oj3Jr14MOkom8Lnt2OkBK6BtM91lz33EF9OhgqReX6kchLA==",
+ "version": "51.0.22",
+ "resolved": "https://registry.npmjs.org/expo/-/expo-51.0.22.tgz",
+ "integrity": "sha512-AtdqmtKNRC+cRBTsYGfwQFMLWAWWC531V2V+bAO3S9wVSTP2eLh34V06/IsBIjCCAJQPaaeR05XcST8U3apXFw==",
"license": "MIT",
"dependencies": {
"@babel/runtime": "^7.20.0",
"@expo/cli": "0.18.25",
"@expo/config": "9.0.3",
"@expo/config-plugins": "8.0.8",
- "@expo/metro-config": "0.18.8",
+ "@expo/metro-config": "0.18.9",
"@expo/vector-icons": "^14.0.0",
"babel-preset-expo": "~11.0.12",
"expo-asset": "~10.0.10",
@@ -16129,9 +17001,9 @@
}
},
"node_modules/expo-apple-authentication": {
- "version": "6.4.1",
- "resolved": "https://registry.npmjs.org/expo-apple-authentication/-/expo-apple-authentication-6.4.1.tgz",
- "integrity": "sha512-tYpCx/cLHruOAPnU5K8UpAycWJWPgdPQra7qz6FGl53Agt8UJ4ev/qEkijbL959x46Ke9+6WSMOhLqt8JoypqA==",
+ "version": "6.4.2",
+ "resolved": "https://registry.npmjs.org/expo-apple-authentication/-/expo-apple-authentication-6.4.2.tgz",
+ "integrity": "sha512-X4u1n3Ql1hOpztXHbKNq4I1l4+Ff82gC6RmEeW43Eht7VE6E8PrQBpYKw+JJv8osrCJt7R5O1PZwed6WLN5oig==",
"license": "MIT",
"peerDependencies": {
"expo": "*"
@@ -17026,6 +17898,176 @@
"expo": "*"
}
},
+ "node_modules/expo-notifications": {
+ "version": "0.28.11",
+ "resolved": "https://registry.npmjs.org/expo-notifications/-/expo-notifications-0.28.11.tgz",
+ "integrity": "sha512-fLWJ+wRcZxEHAJtM/4+bcLzgh5w6+PR9Hu4/BSf65M8ZA6QYX0ALeXi+XawCHWfgua/UOBopBY51OTPfTPei8Q==",
+ "license": "MIT",
+ "dependencies": {
+ "@expo/image-utils": "^0.5.0",
+ "@ide/backoff": "^1.0.0",
+ "abort-controller": "^3.0.0",
+ "assert": "^2.0.0",
+ "badgin": "^1.1.5",
+ "expo-application": "~5.9.0",
+ "expo-constants": "~16.0.0",
+ "fs-extra": "^9.1.0"
+ },
+ "peerDependencies": {
+ "expo": "*"
+ }
+ },
+ "node_modules/expo-notifications/node_modules/@expo/image-utils": {
+ "version": "0.5.1",
+ "resolved": "https://registry.npmjs.org/@expo/image-utils/-/image-utils-0.5.1.tgz",
+ "integrity": "sha512-U/GsFfFox88lXULmFJ9Shfl2aQGcwoKPF7fawSCLixIKtMCpsI+1r0h+5i0nQnmt9tHuzXZDL8+Dg1z6OhkI9A==",
+ "license": "MIT",
+ "dependencies": {
+ "@expo/spawn-async": "^1.7.2",
+ "chalk": "^4.0.0",
+ "fs-extra": "9.0.0",
+ "getenv": "^1.0.0",
+ "jimp-compact": "0.16.1",
+ "node-fetch": "^2.6.0",
+ "parse-png": "^2.1.0",
+ "resolve-from": "^5.0.0",
+ "semver": "^7.6.0",
+ "tempy": "0.3.0"
+ }
+ },
+ "node_modules/expo-notifications/node_modules/@expo/image-utils/node_modules/fs-extra": {
+ "version": "9.0.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.0.0.tgz",
+ "integrity": "sha512-pmEYSk3vYsG/bF651KPUXZ+hvjpgWYw/Gc7W9NFUe3ZVLczKKWIij3IKpOrQcdw4TILtibFslZ0UmR8Vvzig4g==",
+ "license": "MIT",
+ "dependencies": {
+ "at-least-node": "^1.0.0",
+ "graceful-fs": "^4.2.0",
+ "jsonfile": "^6.0.1",
+ "universalify": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/expo-notifications/node_modules/@expo/image-utils/node_modules/universalify": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-1.0.0.tgz",
+ "integrity": "sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 10.0.0"
+ }
+ },
+ "node_modules/expo-notifications/node_modules/@expo/spawn-async": {
+ "version": "1.7.2",
+ "resolved": "https://registry.npmjs.org/@expo/spawn-async/-/spawn-async-1.7.2.tgz",
+ "integrity": "sha512-QdWi16+CHB9JYP7gma19OVVg0BFkvU8zNj9GjWorYI8Iv8FUxjOCcYRuAmX4s/h91e4e7BPsskc8cSrZYho9Ew==",
+ "license": "MIT",
+ "dependencies": {
+ "cross-spawn": "^7.0.3"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/expo-notifications/node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "license": "MIT",
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/expo-notifications/node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/expo-notifications/node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "license": "MIT",
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/expo-notifications/node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "license": "MIT"
+ },
+ "node_modules/expo-notifications/node_modules/fs-extra": {
+ "version": "9.1.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz",
+ "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==",
+ "license": "MIT",
+ "dependencies": {
+ "at-least-node": "^1.0.0",
+ "graceful-fs": "^4.2.0",
+ "jsonfile": "^6.0.1",
+ "universalify": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/expo-notifications/node_modules/has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/expo-notifications/node_modules/semver": {
+ "version": "7.6.3",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz",
+ "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==",
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/expo-notifications/node_modules/supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/expo-random": {
"version": "14.0.1",
"resolved": "https://registry.npmjs.org/expo-random/-/expo-random-14.0.1.tgz",
@@ -17445,15 +18487,15 @@
}
},
"node_modules/expo-updates": {
- "version": "0.25.20",
- "resolved": "https://registry.npmjs.org/expo-updates/-/expo-updates-0.25.20.tgz",
- "integrity": "sha512-EfxRZDPNUWFXTsjn4Ii+AwIp/KLHXGKG59R8kyWzz/nHeMxXqGUDQF79qcgXcaq5lOMUpeGNlZqOBGho9cvUEg==",
+ "version": "0.25.21",
+ "resolved": "https://registry.npmjs.org/expo-updates/-/expo-updates-0.25.21.tgz",
+ "integrity": "sha512-eNElrzLFHky2au0H8MqdAJdqh40412PHCdANdXtB/P/XIS1xVte74T9rUf053iPswnLLuQfCUpZYSfRKTcsDlg==",
"license": "MIT",
"dependencies": {
"@expo/code-signing-certificates": "0.0.5",
"@expo/config": "~9.0.0-beta.0",
"@expo/config-plugins": "~8.0.8",
- "@expo/fingerprint": "^0.10.1",
+ "@expo/fingerprint": "^0.10.2",
"@expo/spawn-async": "^1.7.2",
"arg": "4.1.0",
"chalk": "^4.1.2",
@@ -17540,9 +18582,9 @@
"license": "MIT"
},
"node_modules/expo-updates/node_modules/@expo/fingerprint": {
- "version": "0.10.1",
- "resolved": "https://registry.npmjs.org/@expo/fingerprint/-/fingerprint-0.10.1.tgz",
- "integrity": "sha512-0d0lniPAm6tOZinoj6d8JPozdeaYL12hNW2lZy76YaRRfBoAVGD1xwx6pilRumgKJGFL2SxOGnRoC4ZarZel4g==",
+ "version": "0.10.2",
+ "resolved": "https://registry.npmjs.org/@expo/fingerprint/-/fingerprint-0.10.2.tgz",
+ "integrity": "sha512-q75zb4AeB08efofCnEJIddS7kCe0TX8YjHSat204mq1RLUJjv2JAN1Zgyk5HW/4i8b/sMYst0HX+BLCtszb+2A==",
"license": "MIT",
"dependencies": {
"@expo/spawn-async": "^1.7.2",
@@ -20285,6 +21327,22 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/is-nan": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/is-nan/-/is-nan-1.3.2.tgz",
+ "integrity": "sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.0",
+ "define-properties": "^1.1.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
"node_modules/is-negative-zero": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz",
@@ -20627,6 +21685,38 @@
"node": ">=0.10.0"
}
},
+ "node_modules/isomorphic-fetch": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz",
+ "integrity": "sha512-9c4TNAKYXM5PRyVcwUZrF3W09nQ+sO7+jydgs4ZGW9dhsLG2VOlISJABombdQqQRXCwuYG3sYV/puGf5rp0qmA==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "node-fetch": "^1.0.1",
+ "whatwg-fetch": ">=0.10.0"
+ }
+ },
+ "node_modules/isomorphic-fetch/node_modules/is-stream": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz",
+ "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==",
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/isomorphic-fetch/node_modules/node-fetch": {
+ "version": "1.7.3",
+ "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz",
+ "integrity": "sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "encoding": "^0.1.11",
+ "is-stream": "^1.0.1"
+ }
+ },
"node_modules/isomorphic-ws": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/isomorphic-ws/-/isomorphic-ws-4.0.1.tgz",
@@ -26140,6 +27230,13 @@
"uuid": "bin/uuid"
}
},
+ "node_modules/normalize-css-color": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/normalize-css-color/-/normalize-css-color-1.0.2.tgz",
+ "integrity": "sha512-jPJ/V7Cp1UytdidsPqviKEElFQJs22hUUgK5BOPHTwOonNCk7/2qOxhhqzEajmFrWJowADFfOFh1V+aWkRfy+w==",
+ "license": "BSD-3-Clause",
+ "peer": true
+ },
"node_modules/normalize-path": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
@@ -28675,6 +29772,22 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/object-is": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.6.tgz",
+ "integrity": "sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
"node_modules/object-keys": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
@@ -30646,6 +31759,17 @@
"react-native": "*"
}
},
+ "node_modules/react-native-phone-number-input/node_modules/css-in-js-utils": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/css-in-js-utils/-/css-in-js-utils-2.0.1.tgz",
+ "integrity": "sha512-PJF0SpJT+WdbVVt0AOYp9C8GnuruRlL/UFW7932nLWmFLQTaWEzTBQEx7/hn4BuV+WON75iAViSUJLiU3PKbpA==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "hyphenate-style-name": "^1.0.2",
+ "isobject": "^3.0.1"
+ }
+ },
"node_modules/react-native-phone-number-input/node_modules/deepmerge": {
"version": "3.3.0",
"resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-3.3.0.tgz",
@@ -30655,6 +31779,33 @@
"node": ">=0.10.0"
}
},
+ "node_modules/react-native-phone-number-input/node_modules/fbjs": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-1.0.0.tgz",
+ "integrity": "sha512-MUgcMEJaFhCaF1QtWGnmq9ZDRAzECTCRAF7O6UZIlAlkTs1SasiX9aP0Iw7wfD2mJ7wDTNfg2w7u5fSCwJk1OA==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "core-js": "^2.4.1",
+ "fbjs-css-vars": "^1.0.0",
+ "isomorphic-fetch": "^2.1.1",
+ "loose-envify": "^1.0.0",
+ "object-assign": "^4.1.0",
+ "promise": "^7.1.1",
+ "setimmediate": "^1.0.5",
+ "ua-parser-js": "^0.7.18"
+ }
+ },
+ "node_modules/react-native-phone-number-input/node_modules/inline-style-prefixer": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/inline-style-prefixer/-/inline-style-prefixer-5.1.2.tgz",
+ "integrity": "sha512-PYUF+94gDfhy+LsQxM0g3d6Hge4l1pAqOSOiZuHWzMvQEGsbRQ/ck2WioLqrY2ZkHyPgVUXxn+hrkF7D6QUGbA==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "css-in-js-utils": "^2.0.0"
+ }
+ },
"node_modules/react-native-phone-number-input/node_modules/prop-types": {
"version": "15.7.2",
"resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz",
@@ -30666,6 +31817,40 @@
"react-is": "^16.8.1"
}
},
+ "node_modules/react-native-phone-number-input/node_modules/react-art": {
+ "version": "16.13.1",
+ "resolved": "https://registry.npmjs.org/react-art/-/react-art-16.13.1.tgz",
+ "integrity": "sha512-IDXRZCUlyl3AkQ6Xf3qg0C6MSDxKhOhf7amYzWNMaelH5K2W9KqUOUHL8mGwC0k/1BXFhhusSgsE1Bekz3aHEQ==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "art": "^0.10.1",
+ "create-react-class": "^15.6.2",
+ "loose-envify": "^1.1.0",
+ "object-assign": "^4.1.1",
+ "prop-types": "^15.6.2",
+ "scheduler": "^0.19.1"
+ },
+ "peerDependencies": {
+ "react": "^16.13.1"
+ }
+ },
+ "node_modules/react-native-phone-number-input/node_modules/react-dom": {
+ "version": "16.14.0",
+ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.14.0.tgz",
+ "integrity": "sha512-1gCeQXDLoIqMgqD3IO2Ah9bnf0w9kzhwN5q4FGnHZ67hBm9yePzB5JJAIQCc8x3pFnNlwFq4RidZggNAAkzWWw==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "loose-envify": "^1.1.0",
+ "object-assign": "^4.1.1",
+ "prop-types": "^15.6.2",
+ "scheduler": "^0.19.1"
+ },
+ "peerDependencies": {
+ "react": "^16.14.0"
+ }
+ },
"node_modules/react-native-phone-number-input/node_modules/react-native-country-picker-modal": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/react-native-country-picker-modal/-/react-native-country-picker-modal-2.0.0.tgz",
@@ -30715,6 +31900,80 @@
"react-native-web": "0.9.x"
}
},
+ "node_modules/react-native-phone-number-input/node_modules/react-native-web": {
+ "version": "0.9.13",
+ "resolved": "https://registry.npmjs.org/react-native-web/-/react-native-web-0.9.13.tgz",
+ "integrity": "sha512-P1nCvBVFrv3J5BXu39iS4A3fR7m0vtGaCAy4MigAtZpakIuara/98h516fDQajPqoVy2T4cQgYZUQAr+FBnppQ==",
+ "deprecated": "< 0.16.0 is no longer supported",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "array-find-index": "^1.0.2",
+ "create-react-class": "^15.6.2",
+ "debounce": "^1.2.0",
+ "deep-assign": "^3.0.0",
+ "fbjs": "^1.0.0",
+ "hyphenate-style-name": "^1.0.2",
+ "inline-style-prefixer": "^5.0.3",
+ "normalize-css-color": "^1.0.2",
+ "prop-types": "^15.6.0",
+ "react-timer-mixin": "^0.13.4"
+ },
+ "peerDependencies": {
+ "react": ">=16.5.1",
+ "react-art": ">=16.5.1",
+ "react-dom": ">=16.5.1"
+ }
+ },
+ "node_modules/react-native-phone-number-input/node_modules/scheduler": {
+ "version": "0.19.1",
+ "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.19.1.tgz",
+ "integrity": "sha512-n/zwRWRYSUj0/3g/otKDRPMh6qv2SYMWNq85IEa8iZyAv8od9zDYpGSnpBEjNgcMNq6Scbu5KfIPxNF72R/2EA==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "loose-envify": "^1.1.0",
+ "object-assign": "^4.1.1"
+ }
+ },
+ "node_modules/react-native-phone-number-input/node_modules/ua-parser-js": {
+ "version": "0.7.38",
+ "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.38.tgz",
+ "integrity": "sha512-fYmIy7fKTSFAhG3fuPlubeGaMoAd6r0rSnfEsO5nEY55i26KSLt9EH7PLQiiqPUhNqYIJvSkTy1oArIcXAbPbA==",
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/ua-parser-js"
+ },
+ {
+ "type": "paypal",
+ "url": "https://paypal.me/faisalman"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/faisalman"
+ }
+ ],
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/react-native-ratings": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/react-native-ratings/-/react-native-ratings-8.1.0.tgz",
+ "integrity": "sha512-+QOJ4G3NjVkI1D+tk4EGx1dCvVfbD2nQdkrj9cXrcAoEiwmbep4z4bZbCKmWMpQ5h2dqbxABU8/eBnbDmvAc3g==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "lodash": "^4.17.15"
+ },
+ "peerDependencies": {
+ "react": "*",
+ "react-native": "*"
+ }
+ },
"node_modules/react-native-reanimated": {
"version": "3.10.1",
"resolved": "https://registry.npmjs.org/react-native-reanimated/-/react-native-reanimated-3.10.1.tgz",
@@ -31151,6 +32410,13 @@
"dev": true,
"license": "MIT"
},
+ "node_modules/react-timer-mixin": {
+ "version": "0.13.4",
+ "resolved": "https://registry.npmjs.org/react-timer-mixin/-/react-timer-mixin-0.13.4.tgz",
+ "integrity": "sha512-4+ow23tp/Tv7hBM5Az5/Be/eKKF7DIvJ09voz5LyHGQaqqz9WV8YMs31eFvcYQs7d451LSg7kDJV70XYN/Ug/Q==",
+ "license": "MIT",
+ "peer": true
+ },
"node_modules/readable-stream": {
"version": "2.3.8",
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz",
@@ -31308,6 +32574,16 @@
"integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==",
"license": "MIT"
},
+ "node_modules/regenerator-transform": {
+ "version": "0.15.2",
+ "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz",
+ "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@babel/runtime": "^7.8.4"
+ }
+ },
"node_modules/regexp.prototype.flags": {
"version": "1.5.2",
"resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz",
@@ -32327,7 +33603,6 @@
"version": "7.8.1",
"resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz",
"integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==",
- "dev": true,
"license": "Apache-2.0",
"dependencies": {
"tslib": "^2.1.0"
@@ -34380,7 +35655,6 @@
"version": "5.3.3",
"resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz",
"integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==",
- "dev": true,
"license": "Apache-2.0",
"bin": {
"tsc": "bin/tsc",
diff --git a/package.json b/package.json
index 60d8049..e4df2fb 100644
--- a/package.json
+++ b/package.json
@@ -45,8 +45,8 @@
"countries-list": "^3.1.0",
"dotenv": "^16.4.5",
"eas-cli": "^8.0.0",
- "expo": "~51.0.21",
- "expo-apple-authentication": "~6.4.1",
+ "expo": "~51.0.22",
+ "expo-apple-authentication": "~6.4.2",
"expo-auth-session": "~5.5.2",
"expo-av": "~14.0.6",
"expo-barcode-scanner": "~13.0.1",
@@ -72,7 +72,7 @@
"expo-splash-screen": "~0.27.5",
"expo-status-bar": "^1.12.1",
"expo-system-ui": "~3.0.7",
- "expo-updates": "~0.25.20",
+ "expo-updates": "~0.25.21",
"expo-web-browser": "~13.0.3",
"flutterwave-react-native": "^1.0.4",
"husky": "^9.0.11",
@@ -113,7 +113,8 @@
"stream-chat": "^8.37.0",
"stream-chat-expo": "^5.33.0",
"uuid": "^10.0.0",
- "vector-icons": "^0.1.0"
+ "vector-icons": "^0.1.0",
+ "expo-notifications": "~0.28.11"
},
"devDependencies": {
"@babel/core": "^7.24.0",
diff --git a/utils/LoggedInUser.ts b/utils/LoggedInUser.ts
index ce8a88c..c22a659 100644
--- a/utils/LoggedInUser.ts
+++ b/utils/LoggedInUser.ts
@@ -14,10 +14,15 @@ interface SetUserData {
(user: User): void;
}
-
-export async function getPatientData(supabase: any, userInfo: any): Promise {
+export async function getPatientData(
+ supabase: any,
+ userInfo: any
+): Promise {
try {
- const { data: { session }, error: sessionError } = await supabase.auth.getSession();
+ const {
+ data: { session },
+ error: sessionError,
+ } = await supabase.auth.getSession();
if (sessionError) {
console.error("Error fetching session:", sessionError);
@@ -38,36 +43,41 @@ export async function getPatientData(supabase: any, userInfo: any): Promise
}
}
- export async function fetchPatientData(id: string, patentInfo: any) {
- try {
- const { data, error } = await supabase
- .from("patients")
- .select(`*`)
- .eq("auth_id", id);
- if (error) {
- console.error("Error fetching patient data:", error);
- return;
- }
- patentInfo(data);
- } catch (error) {
- console.error("Error while fetching data:", error);
- return;
- }
+export async function fetchPatientData(id: string, patentInfo: any) {
+ try {
+ const { data, error } = await supabase
+ .from("patients")
+ .select(`*`)
+ .eq("auth_id", id);
+ if (error) {
+ console.error("Error fetching patient data:", error);
+ return;
}
+ patentInfo(data);
+ // console.log(data)
+ } catch (error) {
+ console.error("Error while fetching data:", error);
+ return;
+ }
+}
+
+export async function getUserImageUrl(
+ storageName: string,
+ userId: any,
+ imageUrlState: any
+) {
+ const { data, error } = await supabase.storage
+ .from(storageName)
+ .list(userId + "/", {
+ limit: 100,
+ offset: 0,
+ sortBy: { column: "name", order: "asc" },
+ });
- export async function getUserImageUrl(storageName: string,userId:any, imageUrlState:any) {
- const { data, error } = await supabase
- .storage
- .from(storageName)
- .list(userId + '/', {
- limit: 100,
- offset: 0,
- sortBy: { column: 'name', order: 'asc' },
- });
-
- if (error) {
- return
- } else {
- imageUrlState(data[0]);
- }
- }
\ No newline at end of file
+ if (error) {
+ console.error(error);
+ return;
+ } else {
+ imageUrlState(data[0]);
+ }
+}