bugfixes and some redesign

This commit is contained in:
2026-04-26 17:57:05 +02:00
parent 8ba22fc4a0
commit 2fd00013f1
36 changed files with 1133 additions and 89 deletions
+32
View File
@@ -0,0 +1,32 @@
import { useState, useEffect } from 'react';
const STORAGE_KEY = 'baby-sleep-settings';
const DEFAULT_SETTINGS = {
dayStart: '07:00',
dayEnd: '20:00',
wakeupRef: '04:00',
bedtimeRef: '19:00',
statsInterval: 7,
};
export function useSettings() {
const [settings, setSettings] = useState(() => {
if (typeof window === 'undefined')
return DEFAULT_SETTINGS;
const stored = localStorage.getItem(STORAGE_KEY);
if (stored) {
try {
return { ...DEFAULT_SETTINGS, ...JSON.parse(stored) };
}
catch {
return DEFAULT_SETTINGS;
}
}
return DEFAULT_SETTINGS;
});
useEffect(() => {
localStorage.setItem(STORAGE_KEY, JSON.stringify(settings));
}, [settings]);
const update = (key, value) => {
setSettings((prev) => ({ ...prev, [key]: value }));
};
return { settings, update };
}
+60
View File
@@ -0,0 +1,60 @@
import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';
import { fetchActiveSession, createSession, endSession, fetchSessions, deleteSession, updateSession } from '../api/client';
export function useSleepSession() {
const queryClient = useQueryClient();
const activeSessionQuery = useQuery({
queryKey: ['activeSession'],
queryFn: fetchActiveSession,
refetchInterval: 30000, // Poll every 30 seconds
});
const createMutation = useMutation({
mutationFn: createSession,
onSuccess: () => {
queryClient.invalidateQueries({ queryKey: ['activeSession'] });
queryClient.invalidateQueries({ queryKey: ['sessions'] });
},
});
const endMutation = useMutation({
mutationFn: ({ sessionId, endTime }) => endSession(sessionId, { end_time: endTime }),
onSuccess: () => {
queryClient.invalidateQueries({ queryKey: ['activeSession'] });
queryClient.invalidateQueries({ queryKey: ['sessions'] });
},
});
return {
activeSession: activeSessionQuery.data,
isLoading: activeSessionQuery.isLoading,
isFetching: activeSessionQuery.isFetching,
createSession: createMutation.mutateAsync,
endSession: endMutation.mutateAsync,
isCreating: createMutation.isPending,
isEnding: endMutation.isPending,
};
}
export function useSessions() {
const queryClient = useQueryClient();
const sessionsQuery = useQuery({
queryKey: ['sessions'],
queryFn: () => fetchSessions(),
});
const deleteMutation = useMutation({
mutationFn: deleteSession,
onSuccess: () => {
queryClient.invalidateQueries({ queryKey: ['sessions'] });
},
});
const updateMutation = useMutation({
mutationFn: ({ sessionId, payload }) => updateSession(sessionId, payload),
onSuccess: () => {
queryClient.invalidateQueries({ queryKey: ['sessions'] });
},
});
return {
sessions: sessionsQuery.data?.sessions || [],
total: sessionsQuery.data?.total || 0,
isLoading: sessionsQuery.isLoading,
isDeleting: deleteMutation.isPending,
deleteSession: deleteMutation.mutateAsync,
updateSession: updateMutation.mutateAsync,
};
}
+22
View File
@@ -0,0 +1,22 @@
import { useQuery } from '@tanstack/react-query';
import { fetchDailySummary, fetchTimetable, fetchWakeSleepTimes } from '../api/client';
export function useStats(from_date, to_date, day_start = '07:00', day_end = '20:00', wakeup_ref = '04:00', bedtime_ref = '19:00') {
const dailySummaryQuery = useQuery({
queryKey: ['dailySummary', from_date, to_date, day_start, day_end],
queryFn: () => fetchDailySummary(from_date, to_date, day_start, day_end),
});
const timetableQuery = useQuery({
queryKey: ['timetable', from_date, to_date, day_start, day_end],
queryFn: () => fetchTimetable(from_date, to_date, day_start, day_end),
});
const wakeupBedtimeQuery = useQuery({
queryKey: ['wakeSleepTimes', from_date, to_date, wakeup_ref, bedtime_ref],
queryFn: () => fetchWakeSleepTimes(from_date, to_date, wakeup_ref, bedtime_ref),
});
return {
dailySummary: dailySummaryQuery.data,
timetable: timetableQuery.data,
wakeupBedtime: wakeupBedtimeQuery.data,
isLoading: dailySummaryQuery.isLoading || timetableQuery.isLoading || wakeupBedtimeQuery.isLoading,
};
}