From 704da59f9c62688fba8e521ce9efa2ae748d9824 Mon Sep 17 00:00:00 2001
From: chelsea
Date: Mon, 16 Feb 2026 00:46:34 -0600
Subject: [PATCH] bug fixes
---
.../src/app/dashboard/routines/page.tsx | 53 +++++--------------
synculous-client/src/lib/api.ts | 1 -
2 files changed, 13 insertions(+), 41 deletions(-)
diff --git a/synculous-client/src/app/dashboard/routines/page.tsx b/synculous-client/src/app/dashboard/routines/page.tsx
index dabee32..4628265 100644
--- a/synculous-client/src/app/dashboard/routines/page.tsx
+++ b/synculous-client/src/app/dashboard/routines/page.tsx
@@ -112,14 +112,6 @@ function timeToMinutes(t: string): number {
return h * 60 + m;
}
-function timeToMinutesLocal(t: string, offsetMinutes: number): number {
- const mins = timeToMinutes(t);
- const localMins = mins - offsetMinutes;
- if (localMins < 0) return localMins + 24 * 60;
- if (localMins >= 24 * 60) return localMins - 24 * 60;
- return localMins;
-}
-
function minutesToTop(minutes: number, startHour: number): number {
return ((minutes - startHour * 60) / 60) * HOUR_HEIGHT;
}
@@ -135,17 +127,6 @@ function formatTime(t: string): string {
return `${dh}:${String(m).padStart(2, '0')} ${period}`;
}
-function formatTimeLocal(t: string, offsetMinutes: number): string {
- const totalMins = timeToMinutes(t) - offsetMinutes;
- let h = Math.floor(totalMins / 60) % 24;
- if (h < 0) h += 24;
- let m = totalMins % 60;
- if (m < 0) m += 60;
- const period = h >= 12 ? 'PM' : 'AM';
- const dh = h > 12 ? h - 12 : h === 0 ? 12 : h;
- return `${dh}:${String(m).padStart(2, '0')} ${period}`;
-}
-
function addMinutesToTime(t: string, mins: number): string {
const [h, m] = t.split(':').map(Number);
const total = h * 60 + m + mins;
@@ -229,7 +210,6 @@ export default function RoutinesPage() {
const [todayMeds, setTodayMeds] = useState([]);
const [isLoading, setIsLoading] = useState(true);
const [selectedDate, setSelectedDate] = useState(() => new Date());
- const [timezoneOffset, setTimezoneOffset] = useState(0);
const [nowMinutes, setNowMinutes] = useState(() => {
const n = new Date();
return n.getHours() * 60 + n.getMinutes();
@@ -250,7 +230,7 @@ export default function RoutinesPage() {
const scheduledForDay = allSchedules
.filter((s) => s.days.includes(dayKey))
- .sort((a, b) => timeToMinutesLocal(a.time, timezoneOffset) - timeToMinutesLocal(b.time, timezoneOffset));
+ .sort((a, b) => timeToMinutes(a.time) - timeToMinutes(b.time));
const scheduledRoutineIds = new Set(allSchedules.map((s) => s.routine_id));
const unscheduledRoutines = allRoutines.filter(
@@ -317,18 +297,14 @@ export default function RoutinesPage() {
// ── Dynamic time window ───────────────────────────────────────
const allEventMins = [
- nowMinutes,
- ...scheduledForDay.map((e) => timeToMinutesLocal(e.time, timezoneOffset)),
- ...groupedMedEntries.map((e) => timeToMinutesLocal(e.time, timezoneOffset)),
+ ...scheduledForDay.map((e) => timeToMinutes(e.time)),
+ ...groupedMedEntries.map((e) => timeToMinutes(e.time)),
];
- const displayStartHour =
- allEventMins.length > 0
- ? Math.max(5, Math.floor(Math.min(...allEventMins) / 60) - 1)
- : DEFAULT_START_HOUR;
- const displayEndHour =
- allEventMins.length > 0
- ? Math.min(24, Math.ceil(Math.max(...allEventMins) / 60) + 2)
- : DEFAULT_END_HOUR;
+ const eventStartHour = allEventMins.length > 0 ? Math.floor(Math.min(...allEventMins) / 60) : DEFAULT_START_HOUR;
+ const eventEndHour = allEventMins.length > 0 ? Math.ceil(Math.max(...allEventMins) / 60) : DEFAULT_END_HOUR;
+ // Always include current time in the view
+ const displayStartHour = Math.min(Math.max(0, eventStartHour - 1), Math.floor(nowMinutes / 60));
+ const displayEndHour = Math.max(Math.min(24, eventEndHour + 2), Math.ceil(nowMinutes / 60) + 1);
const nowTopPx = minutesToTop(nowMinutes, displayStartHour);
@@ -440,13 +416,11 @@ export default function RoutinesPage() {
api.routines.list(),
api.routines.listAllSchedules(),
api.medications.getToday().catch(() => []),
- api.preferences.get().catch(() => ({ timezone_offset: 0 })),
])
- .then(([routines, schedules, meds, prefs]) => {
+ .then(([routines, schedules, meds]) => {
setAllRoutines(routines);
setAllSchedules(schedules);
setTodayMeds(meds);
- setTimezoneOffset((prefs as any).timezone_offset || 0);
})
.catch(() => {})
.finally(() => setIsLoading(false));
@@ -640,7 +614,7 @@ export default function RoutinesPage() {
{/* Routine cards */}
{scheduledForDay.map((entry) => {
- const startMin = timeToMinutesLocal(entry.time, timezoneOffset);
+ const startMin = timeToMinutes(entry.time);
const topPx = minutesToTop(startMin, displayStartHour);
const heightPx = durationToHeight(entry.total_duration_minutes);
const endMin = startMin + entry.total_duration_minutes;
@@ -678,17 +652,16 @@ export default function RoutinesPage() {
{entry.routine_name}
- {formatTimeLocal(entry.time, timezoneOffset)}
+ {formatTime(entry.time)}
{entry.total_duration_minutes > 0 && (
<>
{' '}
-{' '}
- {formatTimeLocal(
+ {formatTime(
addMinutesToTime(
entry.time,
entry.total_duration_minutes
- ),
- timezoneOffset
+ )
)}
>
)}
diff --git a/synculous-client/src/lib/api.ts b/synculous-client/src/lib/api.ts
index 6cfc496..a75cac3 100644
--- a/synculous-client/src/lib/api.ts
+++ b/synculous-client/src/lib/api.ts
@@ -627,7 +627,6 @@ export const api = {
haptic_enabled: boolean;
show_launch_screen: boolean;
celebration_style: string;
- timezone_offset: number;
}>('/api/preferences', { method: 'GET' });
},