task-managment / src / hooks / useGroupTasks.ts
useGroupTasks.ts
Raw
import { TasksByDate } from "@/server/task/domain/models";
import { TaskSections } from "@/types";
import moment from "moment";
import { useEffect, useState } from "react";

function getNextWeek() {
  const today = moment().startOf("day");
  const nextMonday = today.clone().startOf("isoWeek").add(1, "week");
  const sixDaysLater = nextMonday.clone().add(6, "days").toISOString(); // Seis días después del próximo lunes
  return {
    startNextWeek: new Date(nextMonday.toISOString()),
    endNextWeek: new Date(sixDaysLater),
  };
}

const useGroupTasks = (tasks: TasksByDate[] | undefined) => {
  const [rearrangedTaks, setRearrangedTaks] = useState<TaskSections | null>(
    null
  );

  const todayDate = moment().startOf("day").toDate();
  const tomorrow = moment(todayDate, "YYYY-MM-DD")
    .add(1, "days")
    .startOf("day")
    .toDate();

  const { startNextWeek, endNextWeek } = getNextWeek();
  useEffect(() => {
    if (!tasks) return;
    const tasksData: TaskSections = tasks?.reduce(
      (acc: any, task) => {
        const taskDate = moment(task.startDate, "YYYY-MM-DD").toDate();
        const updatedDate = new Date(task.tasks[0].updatedAt!);
        const createdAt = new Date(task.tasks[0].createdAt!);

        if (updatedDate >= todayDate || createdAt >= todayDate) {
          acc.recently.list.push(...task.tasks);
        }

        if (todayDate >= taskDate && taskDate <= tomorrow) {
          acc.today.list.push(...task.tasks);
        } else if (startNextWeek >= taskDate && taskDate <= endNextWeek) {
          acc.thisWeek.list.push(...task.tasks);
        } else {
          acc.later.list.push(...task.tasks);
        }
        return acc;
      },
      {
        recently: { label: "Recientes", list: [] },
        today: { label: "Hoy", list: [] },
        thisWeek: { label: "Esta semana", list: [] },
        later: { label: "Mas tarde", list: [] },
      }
    );

    setRearrangedTaks(tasksData);
  }, [tasks]); // eslint-disable-next-line react-hooks/exhaustive-deps

  return {
    rearrangedTaks,
  };
};

export default useGroupTasks;