Drying out

This commit is contained in:
2026-05-27 15:18:29 +02:00
parent 7cef6da5f2
commit 3e8a2092cd
8 changed files with 89 additions and 106 deletions
+8 -26
View File
@@ -2,26 +2,7 @@ import React, { useState } from 'react';
import { useSessions } from '../../hooks/useSleepSession';
import { Edit2, Check, X } from 'lucide-react';
import type { SleepSessionRead } from '../../types';
function formatDateTime(isoString: string): string {
const iso = isoString.endsWith('Z') ? isoString : isoString + 'Z';
const d = new Date(iso);
return d.toLocaleString('sv-SE', {
year: 'numeric',
month: '2-digit',
day: '2-digit',
hour: '2-digit',
minute: '2-digit',
hour12: false
}).replace(',', ' ');
}
function toDatetimeLocal(isoString: string): string {
const iso = isoString.endsWith('Z') ? isoString : isoString + 'Z';
const d = new Date(iso);
const pad = (n: number) => n.toString().padStart(2, '0');
return `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())}T${pad(d.getHours())}:${pad(d.getMinutes())}`;
}
import { formatDateTime, toLocalDatetimeInputValue, getDurationMinutes } from '../../utils/time';
export function SessionList() {
const { sessions, isLoading, updateSession } = useSessions();
@@ -50,8 +31,8 @@ export function SessionList() {
const startEditing = (s: SleepSessionRead) => {
setEditingId(s.id);
setEditStart(toDatetimeLocal(s.start_time));
setEditEnd(s.end_time ? toDatetimeLocal(s.end_time) : '');
setEditStart(toLocalDatetimeInputValue(new Date(s.start_time)));
setEditEnd(s.end_time ? toLocalDatetimeInputValue(new Date(s.end_time)) : '');
};
const handleCancel = () => {
@@ -120,10 +101,11 @@ export function SessionList() {
</div>
<div className="flex items-center space-x-2">
<span className="text-blue-600 font-mono text-sm">
{s.end_time && s.start_time
? `${Math.round((new Date(s.end_time + 'Z').getTime() - new Date(s.start_time + 'Z').getTime()) / 60000)} min`
: '—'}
</span>
{s.end_time && s.start_time
? `${getDurationMinutes(s.start_time, s.end_time)} min`
: '—'}
</span>
<Edit2 size={14} className="text-gray-400" />
</div>
</div>
+2 -11
View File
@@ -1,6 +1,6 @@
import { useEffect, useState } from 'react';
import { useStats } from '../../hooks/useStats';
import { formatMinutesAfter, getToday, getLocalOffsetFromReference, timeToMinutes } from '../../utils/time';
import { formatMinutesAfter, getToday, getLocalOffsetFromReference } from '../../utils/time';
import {
LineChart,
Line,
@@ -35,16 +35,7 @@ const WakeupPlot: React.FC<WakeupBedtimeProps> = ({ from_date, to_date, wakeup_r
let offsetFromRef = 0;
if (day.wakeup_minutes !== null) {
const refMins = timeToMinutes(wakeup_ref);
// If wakeup_minutes is significantly smaller than the reference,
// it's likely already an offset (relative), not absolute minutes from midnight.
const isLikelyOffset = day.wakeup_minutes < refMins && day.wakeup_minutes < 120;
if (isLikelyOffset) {
offsetFromRef = day.wakeup_minutes;
} else {
offsetFromRef = day.wakeup_minutes - refMins;
}
offsetFromRef = getLocalOffsetFromReference(day.wakeup_minutes, wakeup_ref);
}
return {
@@ -1,23 +1,11 @@
import React, { useState, useEffect } from 'react';
import { toLocalDatetimeInputValue, toUTCFromLocalInput } from '../../utils/time';
interface TimeAdjusterProps {
onTimeChange: (time: string) => void;
defaultValue?: string;
}
function toLocalDatetimeInputValue(date: Date): string {
const pad = (n: number) => String(n).padStart(2, '0');
return `${date.getFullYear()}-${pad(date.getMonth() + 1)}-${pad(date.getDate())}T${pad(date.getHours())}:${pad(date.getMinutes())}`;
}
function toUTCFromLocalInput(inputValue: string): string {
const [datePart, timePart] = inputValue.split('T');
const [year, month, day] = datePart.split('-').map(Number);
const [hours, minutes] = timePart.split(':').map(Number);
const localDate = new Date(year, month - 1, day, hours, minutes);
return localDate.toISOString();
}
const TimeAdjuster: React.FC<TimeAdjusterProps> = ({ onTimeChange, defaultValue }) => {
const [value, setValue] = useState(() => {
if (defaultValue) {