import { useState } from 'react'; import { Plus, Edit2, Trash2 } from 'lucide-react'; import { useTimeEntries } from '@/hooks/useTimeEntries'; import { Spinner } from '@/components/Spinner'; import { ProjectColorDot } from '@/components/ProjectColorDot'; import { TimeEntryFormModal } from '@/components/TimeEntryFormModal'; import { ConfirmModal } from '@/components/ConfirmModal'; import { formatDate, formatTime, formatDurationFromDatesHoursMinutes } from '@/utils/dateUtils'; import type { TimeEntry } from '@/types'; export function TimeEntriesPage() { const { data, isLoading, createTimeEntry, updateTimeEntry, deleteTimeEntry } = useTimeEntries(); const [isModalOpen, setIsModalOpen] = useState(false); const [editingEntry, setEditingEntry] = useState(null); const [confirmEntry, setConfirmEntry] = useState(null); const handleOpenModal = (entry?: TimeEntry) => { setEditingEntry(entry ?? null); setIsModalOpen(true); }; const handleCloseModal = () => { setIsModalOpen(false); setEditingEntry(null); }; const handleDeleteConfirmed = async () => { if (!confirmEntry) return; try { await deleteTimeEntry.mutateAsync(confirmEntry.id); } catch (err) { alert(err instanceof Error ? err.message : 'Failed to delete'); } }; if (isLoading) { return ; } return (

Time Entries

Manage your tracked time

{data?.entries.map((entry) => ( ))}
Date Project Duration Actions
{formatDate(entry.startTime)}
{formatTime(entry.startTime)} – {formatTime(entry.endTime)}
{entry.project.name}
{entry.project.client.name}
{formatDurationFromDatesHoursMinutes(entry.startTime, entry.endTime)}
{data?.entries.length === 0 && (
No time entries yet
)}
{isModalOpen && ( )} {confirmEntry && ( setConfirmEntry(null)} /> )}
); }