diff --git a/frontend/app/admin/availability/page.tsx b/frontend/app/admin/availability/page.tsx index 002a8ed..be544b6 100644 --- a/frontend/app/admin/availability/page.tsx +++ b/frontend/app/admin/availability/page.tsx @@ -8,7 +8,7 @@ import { Header } from "../../components/Header"; import { useRequireAuth } from "../../hooks/useRequireAuth"; import { components } from "../../generated/api"; import constants from "../../../../shared/constants.json"; -import { formatDate, formatDisplayDate, getDateRange } from "../../utils/date"; +import { formatDate, formatDisplayDate, getDateRange, formatTimeString } from "../../utils/date"; const { slotDurationMinutes, maxAdvanceDays, minAdvanceDays } = constants.booking; @@ -87,8 +87,8 @@ export default function AdminAvailabilityPage() { setEditSlots( existingSlots.length > 0 ? existingSlots.map((s) => ({ - start_time: s.start_time.slice(0, 5), - end_time: s.end_time.slice(0, 5), + start_time: formatTimeString(s.start_time), + end_time: formatTimeString(s.end_time), })) : [{ start_time: "09:00", end_time: "17:00" }] ); @@ -206,7 +206,7 @@ export default function AdminAvailabilityPage() { }; const formatSlotTime = (slot: TimeSlot): string => { - return `${slot.start_time.slice(0, 5)} - ${slot.end_time.slice(0, 5)}`; + return `${formatTimeString(slot.start_time)} - ${formatTimeString(slot.end_time)}`; }; if (isLoading) { diff --git a/frontend/app/utils/date.ts b/frontend/app/utils/date.ts index e314893..3868ab9 100644 --- a/frontend/app/utils/date.ts +++ b/frontend/app/utils/date.ts @@ -46,6 +46,19 @@ export function formatDisplayDate(d: Date): string { return d.toLocaleDateString("en-US", { weekday: "short", month: "short", day: "numeric" }); } +/** + * Format time string from "HH:MM:SS" or "HH:MM" format to "HH:MM". + * Avoids string slicing by properly parsing the time. + */ +export function formatTimeString(timeStr: string): string { + // Handle both "HH:MM:SS" and "HH:MM" formats + const parts = timeStr.split(":"); + if (parts.length >= 2) { + return `${parts[0].padStart(2, "0")}:${parts[1].padStart(2, "0")}`; + } + return timeStr; +} + /** * Get date range for booking/availability (from minAdvanceDays to maxAdvanceDays). * Returns an array of Date objects starting from minAdvanceDays days from today.