import { type FC, useEffect, useMemo, useState } from "react"; import { useTranslation } from "react-i18next"; import { toast } from "react-toastify"; import { ErrorType } from "../../../../../helpers/types"; import { useEndTimeTracking, useGetTaskTimes, useStartTimeTracking } from "../../../task/hooks/useTaskTimeData"; import { formatElapsedTime, getActiveTimeEntry, getElapsedSeconds } from "./utils"; type Props = { taskId: string; }; const TaskDetailTimePopover: FC = ({ taskId }) => { const { t } = useTranslation("global"); const getTaskTimes = useGetTaskTimes(taskId); const startTimeTracking = useStartTimeTracking(); const endTimeTracking = useEndTimeTracking(); const times = useMemo(() => getTaskTimes.data?.data ?? [], [getTaskTimes.data]); const activeEntry = useMemo(() => getActiveTimeEntry(times), [times]); const isTracking = !!activeEntry; const isSubmitting = startTimeTracking.isPending || endTimeTracking.isPending; const [elapsedSeconds, setElapsedSeconds] = useState(() => activeEntry ? getElapsedSeconds(activeEntry.startedAt) : 0, ); useEffect(() => { if (!activeEntry) { setElapsedSeconds(0); return; } const updateElapsed = () => { setElapsedSeconds(getElapsedSeconds(activeEntry.startedAt)); }; updateElapsed(); const intervalId = window.setInterval(updateElapsed, 1000); return () => { window.clearInterval(intervalId); }; }, [activeEntry?.id, activeEntry?.startedAt]); const handleStart = () => { startTimeTracking.mutate(taskId, { onSuccess: () => { toast.success(t("success")); }, onError: (error: ErrorType) => { toast.error(error.response?.data?.error.message[0]); }, }); }; const handleStop = () => { endTimeTracking.mutate(taskId, { onSuccess: () => { toast.success(t("success")); }, onError: (error: ErrorType) => { toast.error(error.response?.data?.error.message[0]); }, }); }; return (
{isTracking ? (
{formatElapsedTime(elapsedSeconds)}
) : ( )}
); }; export default TaskDetailTimePopover;