Syncing improvement

This commit is contained in:
Milan Paunovic
2024-10-19 19:55:46 +02:00
parent 043b80baa9
commit 00b6225a1c
5 changed files with 80 additions and 63 deletions

View File

@ -1,4 +1,4 @@
export async function fetchGoogleCalendarEvents(token, startDate, endDate) { export async function fetchGoogleCalendarEvents(token, email, startDate, endDate) {
console.log(token); console.log(token);
const response = await fetch( const response = await fetch(
`https://www.googleapis.com/calendar/v3/calendars/primary/events?single_events=true&time_min=${startDate}&time_max=${endDate}`, `https://www.googleapis.com/calendar/v3/calendars/primary/events?single_events=true&time_min=${startDate}&time_max=${endDate}`,
@ -45,6 +45,7 @@ export async function fetchGoogleCalendarEvents(token, startDate, endDate) {
startDate: startDateTime, startDate: startDateTime,
endDate: endDateTime, endDate: endDateTime,
allDay: isAllDay, allDay: isAllDay,
email
}; };
googleEvents.push(googleEvent); googleEvents.push(googleEvent);
}); });

View File

@ -1,4 +1,4 @@
export async function fetchMicrosoftCalendarEvents(token, startDate, endDate) { export async function fetchMicrosoftCalendarEvents(token, email, startDate, endDate) {
const response = await fetch( const response = await fetch(
`https://graph.microsoft.com/v1.0/me/calendar/calendarView?startDateTime=${startDate}&endDateTime=${endDate}`, `https://graph.microsoft.com/v1.0/me/calendar/calendarView?startDateTime=${startDate}&endDateTime=${endDate}`,
{ {
@ -34,6 +34,7 @@ export async function fetchMicrosoftCalendarEvents(token, startDate, endDate) {
startDate: startDateTime, startDate: startDateTime,
endDate: endDateTime, endDate: endDateTime,
allDay: item.isAllDay, allDay: item.isAllDay,
email
}; };

View File

@ -23,6 +23,8 @@ export const EventCalendar: React.FC<EventCalendarProps> = memo(({calendarHeight
const setEventForEdit = useSetAtom(eventForEditAtom) const setEventForEdit = useSetAtom(eventForEditAtom)
const setSelectedNewEndDate = useSetAtom(selectedNewEventDateAtom) const setSelectedNewEndDate = useSetAtom(selectedNewEventDateAtom)
console.log("Events: ", events)
return ( return (
<Calendar <Calendar
bodyContainerStyle={styles.calHeader} bodyContainerStyle={styles.calHeader}

View File

@ -6,7 +6,7 @@ import {colorMap} from "@/contexts/SettingsContext";
import {TouchableOpacity} from "react-native-gesture-handler"; import {TouchableOpacity} from "react-native-gesture-handler";
import {fetchGoogleCalendarEvents} from "@/calendar-integration/google-calendar-utils"; import {fetchGoogleCalendarEvents} from "@/calendar-integration/google-calendar-utils";
import {fetchMicrosoftCalendarEvents} from "@/calendar-integration/microsoft-calendar-utils"; import {fetchMicrosoftCalendarEvents} from "@/calendar-integration/microsoft-calendar-utils";
import {useCreateEventFromProvider} from "@/hooks/firebase/useCreateEvent"; import {useCreateEventsFromProvider} from "@/hooks/firebase/useCreateEvent";
import {useAuthContext} from "@/contexts/AuthContext"; import {useAuthContext} from "@/contexts/AuthContext";
import {useUpdateUserData} from "@/hooks/firebase/useUpdateUserData"; import {useUpdateUserData} from "@/hooks/firebase/useUpdateUserData";
import debounce from "debounce"; import debounce from "debounce";
@ -60,7 +60,7 @@ const CalendarSettingsPage = (props: {
profileData?.eventColor ?? colorMap.pink profileData?.eventColor ?? colorMap.pink
); );
const {mutateAsync: createEventFromProvider} = useCreateEventFromProvider(); const {mutateAsync: createEventsFromProvider} = useCreateEventsFromProvider();
const {mutateAsync: updateUserData} = useUpdateUserData(); const {mutateAsync: updateUserData} = useUpdateUserData();
WebBrowser.maybeCompleteAuthSession(); WebBrowser.maybeCompleteAuthSession();
@ -70,41 +70,46 @@ const CalendarSettingsPage = (props: {
signInWithGoogle(); signInWithGoogle();
}, [response]); }, [response]);
const fetchAndSaveGoogleEvents = () => { const fetchAndSaveGoogleEvents = async (token?: string, email?: string) => {
console.log("fetch"); console.log("Fetching Google Calendar events...");
const timeMin = new Date(new Date().setHours(0, 0, 0, 0)); const timeMin = new Date(new Date().setFullYear(new Date().getFullYear() - 1));
const timeMax = new Date( const timeMax = new Date(new Date().setFullYear(new Date().getFullYear() + 5));
new Date(new Date().setHours(0, 0, 0, 0)).setDate(timeMin.getDate() + 30)
);
console.log("Token: ", token ?? profileData?.googleToken)
fetchGoogleCalendarEvents( fetchGoogleCalendarEvents(
profileData?.googleToken, token ?? profileData?.googleToken,
email ?? profileData?.googleMail,
timeMin.toISOString().slice(0, -5) + "Z", timeMin.toISOString().slice(0, -5) + "Z",
timeMax.toISOString().slice(0, -5) + "Z" timeMax.toISOString().slice(0, -5) + "Z"
).then((response) => { ).then(async (response) => {
response?.forEach((item) => saveData(item)); console.log("Google Calendar events fetched:", response);
const items = response?.map((item) => {
if (item.allDay) {
item.startDate = new Date(new Date(item.startDate).setHours(0, 0, 0, 0))
item.endDate = item.startDate
}
return item;
}) || [];
await createEventsFromProvider(items);
}).catch((error) => {
console.error("Error fetching Google Calendar events:", error);
}); });
}; };
async function saveData(item: any) { const fetchAndSaveMicrosoftEvents = async (token?: string, email?: string) => {
await createEventFromProvider(item); const timeMin = new Date(new Date().setFullYear(new Date().getFullYear() - 1));
} const timeMax = new Date(new Date().setFullYear(new Date().getFullYear() + 3));
const fetchAndSaveMicrosoftEvents = () => { console.log("Token: ", token ?? profileData?.microsoftToken)
const startDateTime = new Date(new Date().setHours(0, 0, 0, 0)); fetchMicrosoftCalendarEvents(
const endDateTime = new Date( token ?? profileData?.microsoftToken,
new Date(new Date().setHours(0, 0, 0, 0)).setDate( email ?? profileData?.outlookMail,
startDateTime.getDate() + 30 timeMin.toISOString().slice(0, -5) + "Z",
) timeMax.toISOString().slice(0, -5) + "Z"
); ).then(async (response) => {
fetchMicrosoftCalendarEvents(
profileData?.microsoftToken,
startDateTime.toISOString().slice(0, -5) + "Z",
endDateTime.toISOString().slice(0, -5) + "Z"
).then((response) => {
console.log(response); console.log(response);
response?.forEach((item) => saveData(item)); const items = response ?? [];
await createEventsFromProvider(items);
}); });
}; };
@ -126,6 +131,8 @@ const CalendarSettingsPage = (props: {
await updateUserData({ await updateUserData({
newUserData: {googleToken: accessToken, googleMail: googleMail}, newUserData: {googleToken: accessToken, googleMail: googleMail},
}); });
await fetchAndSaveGoogleEvents(accessToken, googleMail)
} }
} catch (error) { } catch (error) {
console.error("Error during Google sign-in:", error); console.error("Error during Google sign-in:", error);
@ -207,6 +214,7 @@ const CalendarSettingsPage = (props: {
newUserData: {microsoftToken: tokenData.access_token, outlookMail: outlookMail}, newUserData: {microsoftToken: tokenData.access_token, outlookMail: outlookMail},
}); });
await fetchAndSaveMicrosoftEvents(tokenData.access_token, outlookMail)
console.log("User data updated successfully."); console.log("User data updated successfully.");
} }
} }
@ -257,7 +265,7 @@ const CalendarSettingsPage = (props: {
return ( return (
<ScrollView> <ScrollView>
<View marginH-30> <View marginH-30 marginB-30>
<TouchableOpacity onPress={() => props.setSelectedPage(0)}> <TouchableOpacity onPress={() => props.setSelectedPage(0)}>
<View row marginT-20 marginB-35 centerV> <View row marginT-20 marginB-35 centerV>
<Ionicons <Ionicons
@ -359,7 +367,7 @@ const CalendarSettingsPage = (props: {
label={profileData?.googleToken ? `Disconnect ${profileData.googleMail}` : "Connect Google"} label={profileData?.googleToken ? `Disconnect ${profileData.googleMail}` : "Connect Google"}
labelStyle={styles.addCalLbl} labelStyle={styles.addCalLbl}
labelProps={{ labelProps={{
numberOfLines:2 numberOfLines: 2
}} }}
iconSource={() => ( iconSource={() => (
<View marginR-15> <View marginR-15>
@ -374,7 +382,7 @@ const CalendarSettingsPage = (props: {
label="Connect Apple" label="Connect Apple"
labelStyle={styles.addCalLbl} labelStyle={styles.addCalLbl}
labelProps={{ labelProps={{
numberOfLines:2 numberOfLines: 2
}} }}
iconSource={() => ( iconSource={() => (
<View marginR-15> <View marginR-15>
@ -390,7 +398,7 @@ const CalendarSettingsPage = (props: {
label={profileData?.microsoftToken ? `Disconnect ${profileData.outlookMail}` : "Connect Outlook"} label={profileData?.microsoftToken ? `Disconnect ${profileData.outlookMail}` : "Connect Outlook"}
labelStyle={styles.addCalLbl} labelStyle={styles.addCalLbl}
labelProps={{ labelProps={{
numberOfLines:2 numberOfLines: 2
}} }}
iconSource={() => ( iconSource={() => (
<View marginR-15> <View marginR-15>
@ -412,9 +420,10 @@ const CalendarSettingsPage = (props: {
<View style={{marginTop: 20}}> <View style={{marginTop: 20}}>
{!!profileData?.googleMail && ( {!!profileData?.googleMail && (
<Button <Button
onPress={fetchAndSaveGoogleEvents} onPress={() => fetchAndSaveGoogleEvents()}
label={`Sync ${profileData?.googleMail}`} label={`Sync ${profileData?.googleMail}`}
labelStyle={styles.addCalLbl} labelStyle={styles.addCalLbl}
labelProps={{numberOfLines: 2}}
iconSource={() => ( iconSource={() => (
<View marginR-15> <View marginR-15>
<GoogleIcon/> <GoogleIcon/>
@ -428,9 +437,10 @@ const CalendarSettingsPage = (props: {
{!!profileData?.outlookMail && ( {!!profileData?.outlookMail && (
<Button <Button
onPress={fetchAndSaveMicrosoftEvents} onPress={() => fetchAndSaveMicrosoftEvents()}
label={`Sync ${profileData?.outlookMail}`} label={`Sync ${profileData?.outlookMail}`}
labelStyle={styles.addCalLbl} labelStyle={styles.addCalLbl}
labelProps={{numberOfLines: 2}}
iconSource={() => ( iconSource={() => (
<View marginR-15> <View marginR-15>
<OutlookIcon/> <OutlookIcon/>

View File

@ -1,7 +1,7 @@
import { useAuthContext } from "@/contexts/AuthContext"; import {useAuthContext} from "@/contexts/AuthContext";
import { useMutation, useQueryClient } from "react-query"; import {useMutation, useQueryClient} from "react-query";
import firestore from "@react-native-firebase/firestore"; import firestore from "@react-native-firebase/firestore";
import { EventData } from "@/hooks/firebase/types/eventData"; import {EventData} from "@/hooks/firebase/types/eventData";
export const useCreateEvent = () => { export const useCreateEvent = () => {
const {user: currentUser, profileData} = useAuthContext() const {user: currentUser, profileData} = useAuthContext()
@ -11,7 +11,6 @@ export const useCreateEvent = () => {
mutationKey: ["createEvent"], mutationKey: ["createEvent"],
mutationFn: async (eventData: Partial<EventData>) => { mutationFn: async (eventData: Partial<EventData>) => {
try { try {
console.log("CALLLLL")
await firestore() await firestore()
.collection("Events") .collection("Events")
.add({...eventData, creatorId: currentUser?.uid, familyId: profileData?.familyId}) .add({...eventData, creatorId: currentUser?.uid, familyId: profileData?.familyId})
@ -25,37 +24,41 @@ export const useCreateEvent = () => {
}) })
} }
export const useCreateEventFromProvider = () => { export const useCreateEventsFromProvider = () => {
const {user: currentUser} = useAuthContext() const {user: currentUser} = useAuthContext();
const queryClients = useQueryClient() const queryClient = useQueryClient();
return useMutation({ return useMutation({
mutationKey: ["createEventFromProvider"], mutationKey: ["createEventsFromProvider"],
mutationFn: async (eventData: Partial<EventData>) => { mutationFn: async (eventDataArray: Partial<EventData>[]) => {
try { try {
const snapshot = await firestore() for (const eventData of eventDataArray) {
.collection("Events") console.log("Processing EventData: ", eventData);
.where("id", "==", eventData.id)
.get();
if (snapshot.empty) { const snapshot = await firestore()
await firestore()
.collection("Events") .collection("Events")
.add({...eventData, creatorId: currentUser?.uid}) .where("id", "==", eventData.id)
} else { .get();
console.log("ENTER HERE")
const docId = snapshot.docs[0].id; if (snapshot.empty) {
await firestore() await firestore()
.collection("Events") .collection("Events")
.doc(docId) .add({...eventData, creatorId: currentUser?.uid});
.update({...eventData, creatorId: currentUser?.uid}); } else {
console.log("Event already exists, updating...");
const docId = snapshot.docs[0].id;
await firestore()
.collection("Events")
.doc(docId)
.set({...eventData, creatorId: currentUser?.uid}, {merge: true});
}
} }
} catch (e) { } catch (e) {
console.error(e) console.error("Error creating/updating events: ", e);
} }
}, },
onSuccess: () => { onSuccess: () => {
queryClients.invalidateQueries("events") queryClient.invalidateQueries("events");
} }
}) });
} };