- Implemented the complete update of recurring todo and handle changing the recurring rule and date

This commit is contained in:
Dejan
2024-10-26 13:20:09 +02:00
parent d064d5c9c2
commit 5c67ffccbd
2 changed files with 153 additions and 68 deletions

View File

@ -2,7 +2,7 @@ import {useMutation, useQueryClient} from "react-query";
import firestore from "@react-native-firebase/firestore";
import {useAuthContext} from "@/contexts/AuthContext";
import {DAYS_OF_WEEK_ENUM, IToDo, REPEAT_TYPE} from "@/hooks/firebase/types/todoData";
import {addDays, addMonths, addWeeks, compareAsc, format, getDay, subDays} from "date-fns";
import {addDays, addMonths, addWeeks, addYears, compareAsc, format, subDays} from "date-fns";
export const daysOfWeek = [
DAYS_OF_WEEK_ENUM.MONDAY,
@ -21,14 +21,20 @@ export const useCreateTodo = () => {
mutationKey: ["createTodo"],
mutationFn: async (todoData: Partial<IToDo>) => {
try {
// Create the one original to do
const newDoc = firestore().collection('Todos').doc();
let originalTodo = {...todoData, id: newDoc.id, familyId: profileData?.familyId, creatorId: currentUser?.uid}
await firestore()
.collection("Todos")
.add(originalTodo);
if (todoData.repeatType === REPEAT_TYPE.NONE) {
const newDoc = firestore().collection('Todos').doc();
let originalTodo = {...todoData, id: newDoc.id, familyId: profileData?.familyId, creatorId: currentUser?.uid}
await firestore()
.collection("Todos")
.add(originalTodo);
} else {
// Create the one original to do
const newDoc = firestore().collection('Todos').doc();
let originalTodo = {...todoData, id: newDoc.id, familyId: profileData?.familyId, creatorId: currentUser?.uid, connectedTodoId: newDoc.id};
await firestore()
.collection("Todos")
.add(originalTodo);
if (todoData.repeatType !== REPEAT_TYPE.NONE) {
const batch = firestore().batch();
if (todoData.repeatType === REPEAT_TYPE.EVERY_WEEK) {
@ -57,36 +63,33 @@ export const useCreateTodo = () => {
dates?.forEach((dateToAdd) => {
let newTodoDate = addWeeks(dateToAdd, i);
if (compareAsc(newTodoDate, originalTodo.date) !== 0) {
const newTodo = { ...originalTodo, date: newTodoDate, connectedTodoId: newDoc.id };
let docRef = firestore().collection("Todos").doc();
const newTodo = { ...originalTodo, id: docRef.id, date: newTodoDate, connectedTodoId: newDoc.id };
batch.set(docRef, newTodo);
console.log(newTodo);
}
})
}
} else if (todoData.repeatType === REPEAT_TYPE.ONCE_A_MONTH) {
// for the next 12 months
for (let i = 0; i < 12; i++) {
for (let i = 1; i < 12; i++) {
let date = originalTodo.date;
const nextMonth = addMonths(date, i + 1);
const newTodo = { ...originalTodo, date: nextMonth, connectedTodoId: newDoc.id };
console.log(newTodo);
const nextMonth = addMonths(date, i);
let docRef = firestore().collection("Todos").doc();
const newTodo = { ...originalTodo, id: docRef.id, date: nextMonth, connectedTodoId: newDoc.id };
batch.set(docRef, newTodo);
}
} else if (todoData.repeatType === REPEAT_TYPE.ONCE_A_YEAR) {
// for the next 5 years
for (let i = 0; i < 5; i++) {
for (let i = 1; i < 5; i++) {
let date = originalTodo.date;
const nextMonth = addMonths(date, i + 1);
const newTodo = { ...originalTodo, date: nextMonth, connectedTodoId: newDoc.id };
console.log(newTodo);
const nextMonth = addYears(date, i);
let docRef = firestore().collection("Todos").doc();
const newTodo = { ...originalTodo, id: docRef.id, date: nextMonth, connectedTodoId: newDoc.id };
batch.set(docRef, newTodo);
}
}