mirror of
https://github.com/urosran/cally.git
synced 2025-07-10 15:17:17 +00:00
- Fixed an issue with the Tod dialog
- Implementation of update todo and adding new days in the rule for a repeatable todo
This commit is contained in:
@ -1,6 +1,8 @@
|
||||
import { useMutation, useQueryClient } from "react-query";
|
||||
import firestore from "@react-native-firebase/firestore";
|
||||
import { IToDo } from "@/hooks/firebase/types/todoData";
|
||||
import {IToDo} from "@/hooks/firebase/types/todoData";
|
||||
import {addDays, addWeeks, compareAsc, format, subDays} from "date-fns";
|
||||
import {daysOfWeek} from "@/hooks/firebase/useCreateTodo";
|
||||
|
||||
export const useUpdateTodo = () => {
|
||||
const queryClients = useQueryClient()
|
||||
@ -9,10 +11,94 @@ export const useUpdateTodo = () => {
|
||||
mutationKey: ["updateTodo"],
|
||||
mutationFn: async (todoData: Partial<IToDo>) => {
|
||||
try {
|
||||
await firestore()
|
||||
.collection("Todos")
|
||||
.doc(todoData.id)
|
||||
.update(todoData);
|
||||
if (todoData.connectedTodoId) {
|
||||
console.log("CONNECTED TODO");
|
||||
const snapshot = await firestore()
|
||||
.collection("Todos")
|
||||
.where("connectedTodoId", "==", todoData.connectedTodoId)
|
||||
.get();
|
||||
|
||||
|
||||
const connectedTodos = snapshot.docs.map((doc) => {
|
||||
const data = doc.data();
|
||||
|
||||
return {
|
||||
...data,
|
||||
id: doc.id,
|
||||
date: data.date ? new Date(data.date.seconds * 1000) : null,
|
||||
ref: doc.ref
|
||||
};
|
||||
}) as IToDo[];
|
||||
|
||||
let filteredTodos = connectedTodos?.filter((item) => item.date >= todoData.date).sort((a,b) =>{
|
||||
return b.date?.getSeconds() - a.date?.getSeconds();
|
||||
});
|
||||
console.log(filteredTodos);
|
||||
|
||||
let firstTodo = filteredTodos?.[0];
|
||||
// resolve the repeating
|
||||
const batch = firestore().batch();
|
||||
const todosToAddCycles = filteredTodos?.length / firstTodo?.repeatDays?.length;
|
||||
console.log(todosToAddCycles);
|
||||
if (firstTodo?.repeatDays !== todoData.repeatDays) {
|
||||
let newRepeatDays = todoData.repeatDays?.filter((element) => firstTodo?.repeatDays?.indexOf(element) === -1);
|
||||
const dates = [];
|
||||
|
||||
let date = firstTodo?.date;
|
||||
const originalDateDay = format(date, 'EEEE');
|
||||
const originalNumber = daysOfWeek.indexOf(originalDateDay);
|
||||
newRepeatDays?.forEach((day) => {
|
||||
let number = daysOfWeek.indexOf(day);
|
||||
let newDate;
|
||||
if (originalNumber > number) {
|
||||
let diff = originalNumber - number;
|
||||
newDate = subDays(date, diff);
|
||||
} else {
|
||||
let diff = number - originalNumber;
|
||||
newDate = addDays(date, diff);
|
||||
}
|
||||
dates.push(newDate);
|
||||
});
|
||||
|
||||
console.log("REPEAT")
|
||||
console.log(newRepeatDays);
|
||||
console.log(dates);
|
||||
|
||||
filteredTodos?.forEach((item) => {
|
||||
|
||||
batch.update(item.ref, {...todoData, date: item.date});
|
||||
})
|
||||
// TODO: for the next connected -> filtered todos - number of weeks
|
||||
for (let i = 0; i < todosToAddCycles; i++) {
|
||||
dates?.forEach((dateToAdd) => {
|
||||
let newTodoDate = addWeeks(dateToAdd, i);
|
||||
if (compareAsc(newTodoDate, firstTodo?.date) !== 0) {
|
||||
const newTodo = { ...todoData, date: newTodoDate };
|
||||
|
||||
let docRef = firestore().collection("Todos").doc();
|
||||
batch.set(docRef, newTodo);
|
||||
console.log("ADD")
|
||||
console.log(newTodo);
|
||||
}
|
||||
})
|
||||
}
|
||||
} else {
|
||||
filteredTodos?.forEach((item) => {
|
||||
|
||||
console.log("UPDATE");
|
||||
batch.update(item.ref, {...todoData, date: item.date});
|
||||
})
|
||||
}
|
||||
|
||||
await batch.commit();
|
||||
} else {
|
||||
console.log("Update");
|
||||
console.log(todoData);
|
||||
await firestore()
|
||||
.collection("Todos")
|
||||
.doc(todoData.id)
|
||||
.update(todoData);
|
||||
}
|
||||
} catch (e) {
|
||||
console.error(e)
|
||||
}
|
||||
|
Reference in New Issue
Block a user