diff --git a/components/pages/todos/AddChore.tsx b/components/pages/todos/AddChore.tsx index 955e11c..4ba3fc8 100644 --- a/components/pages/todos/AddChore.tsx +++ b/components/pages/todos/AddChore.tsx @@ -31,7 +31,7 @@ const AddChore = () => { - + {isVisible && } ); }; diff --git a/components/pages/todos/AddChoreDialog.tsx b/components/pages/todos/AddChoreDialog.tsx index 0a05bd9..13cbdc7 100644 --- a/components/pages/todos/AddChoreDialog.tsx +++ b/components/pages/todos/AddChoreDialog.tsx @@ -36,6 +36,7 @@ const defaultTodo = { rotate: false, repeatType: "Every week", assignees: [], + repeatDays: [] }; const AddChoreDialog = (addChoreDialogProps: IAddChoreDialog) => { @@ -48,14 +49,12 @@ const AddChoreDialog = (addChoreDialogProps: IAddChoreDialog) => { ); const { width, height } = Dimensions.get("screen"); const [points, setPoints] = useState(todo.points); - const [selectedDays, setSelectedDays] = useState([]); const { data: members } = useGetFamilyMembers(); const handleClose = () => { setTodo(defaultTodo); setSelectedAssignees([]); - setSelectedDays([]); addChoreDialogProps.setIsVisible(false); }; @@ -71,12 +70,20 @@ const AddChoreDialog = (addChoreDialogProps: IAddChoreDialog) => { const handleRepeatDaysChange = (day: string, set: boolean) => { if (set) { - setSelectedDays((prevState) => [...prevState, day]); + const updatedTodo = { + ...todo, + repeatDays: [...todo.repeatDays, day] + } + setTodo(updatedTodo); } else { - const array = selectedDays; + const array = todo.repeatDays ?? []; let index = array.indexOf(day); array.splice(index, 1); - setSelectedDays(array); + const updatedTodo = { + ...todo, + repeatDays: array + } + setTodo(updatedTodo); } } @@ -123,8 +130,7 @@ const AddChoreDialog = (addChoreDialogProps: IAddChoreDialog) => { updateToDo({ ...todo, points: points, - assignees: selectedAssignees, - repeatDays: selectedDays, + assignees: selectedAssignees }); } else { addToDo({ @@ -132,7 +138,7 @@ const AddChoreDialog = (addChoreDialogProps: IAddChoreDialog) => { done: false, points: points, assignees: selectedAssignees, - repeatDays: selectedDays + repeatDays: todo.repeatDays ?? [] }); } handleClose(); diff --git a/components/pages/todos/RepeatFreq.tsx b/components/pages/todos/RepeatFreq.tsx index 068c303..8399c8c 100644 --- a/components/pages/todos/RepeatFreq.tsx +++ b/components/pages/todos/RepeatFreq.tsx @@ -26,11 +26,14 @@ export default RepeatFreq; const RepeatOption = ({ value, handleRepeatDaysChange, repeatDays }: { value: string, handleRepeatDaysChange: Function, repeatDays: string[] }) => { const [isSet, setisSet] = useState(repeatDays.includes(value)); - useEffect(() => { - handleRepeatDaysChange(value, isSet); - }, [isSet]) + + const handleDayChange = () => { + handleRepeatDaysChange(value, !isSet) + setisSet(!isSet); + } + return ( - setisSet(!isSet)}> + { @@ -23,6 +22,7 @@ export const useGetTodos = () => { ...data, id: doc.id, date: data.date ? new Date(data.date.seconds * 1000) : null, + repeatDays: data.repeatDays ?? [] }; }) as IToDo[]; } diff --git a/hooks/firebase/useUpdateTodo.ts b/hooks/firebase/useUpdateTodo.ts index b1b985f..33a363e 100644 --- a/hooks/firebase/useUpdateTodo.ts +++ b/hooks/firebase/useUpdateTodo.ts @@ -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) => { 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) }