import React, { useState } from 'react'; import { useSessions } from '../../hooks/useSleepSession'; import { useSettings } from '../../hooks/useSettings'; import { Pagination } from './Pagination'; import { Edit2, Check, X, Trash2 } from 'lucide-react'; import type { SleepSessionRead } from '../../types'; import { formatDateTime, toLocalDatetimeInputValue, getDurationMinutes, formatMinutes } from '../../utils/time'; export function SessionList() { const { sessions, isLoading, updateSession, deleteSession, isDeleting } = useSessions(); const { settings } = useSettings(); const sessionsPerPage = settings.sessionsPerPage; const [currentPage, setCurrentPage] = useState(1); const [editingId, setEditingId] = useState(null); const [editStart, setEditStart] = useState(''); const [editEnd, setEditEnd] = useState(''); const totalPages = Math.ceil(sessions.length / sessionsPerPage); const clampedPage = Math.max(1, Math.min(currentPage, totalPages || 1)); const paginatedSessions = sessions.slice( (clampedPage - 1) * sessionsPerPage, clampedPage * sessionsPerPage ); if (isLoading) return
Loading sessions...
; if (!sessions.length) return
No sessions recorded.
; const handleSave = async (id: number) => { try { await updateSession({ sessionId: id, payload: { start_time: new Date(editStart).toISOString(), end_time: editEnd ? new Date(editEnd).toISOString() : undefined, } }); setEditingId(null); } catch (err) { console.error(err); alert('Failed to update session'); } }; const handleDelete = async (e: React.MouseEvent, id: number) => { e.stopPropagation(); if (window.confirm('Are you sure you want to delete this sleep session?')) { try { await deleteSession(id); } catch (err) { console.error(err); alert('Failed to delete session'); } } }; const startEditing = (s: SleepSessionRead) => { setEditingId(s.id); setEditStart(toLocalDatetimeInputValue(new Date(s.start_time))); setEditEnd(s.end_time ? toLocalDatetimeInputValue(new Date(s.end_time)) : ''); }; const handleCancel = () => { setEditingId(null); }; return (

Sleep Sessions

{paginatedSessions.map((s) => (
{editingId === s.id ? (
Start Time setEditStart(e.target.value)} />
End Time setEditEnd(e.target.value)} />
) : (
startEditing(s)} >
{formatDateTime(s.start_time)} {s.end_time && s.start_time ? formatMinutes(getDurationMinutes(s.start_time, s.end_time)) : '—'}
{s.end_time ? `${formatDateTime(s.start_time)} → ${formatDateTime(s.end_time)}` : 'In progress'}
{s.end_time && s.start_time ? formatMinutes(getDurationMinutes(s.start_time, s.end_time)) : '—'}
)}
))}
{sessions.length > sessionsPerPage && ( )}
); }