Standardize time formatting and avoid string slicing
- Created formatTimeString() utility to properly parse time strings - Replaced all .slice(0, 5) calls with proper time formatting - Handles both 'HH:MM:SS' and 'HH:MM' formats safely - More robust than string slicing
This commit is contained in:
parent
a25e84e197
commit
3c13270bc0
2 changed files with 17 additions and 4 deletions
|
|
@ -8,7 +8,7 @@ import { Header } from "../../components/Header";
|
||||||
import { useRequireAuth } from "../../hooks/useRequireAuth";
|
import { useRequireAuth } from "../../hooks/useRequireAuth";
|
||||||
import { components } from "../../generated/api";
|
import { components } from "../../generated/api";
|
||||||
import constants from "../../../../shared/constants.json";
|
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;
|
const { slotDurationMinutes, maxAdvanceDays, minAdvanceDays } = constants.booking;
|
||||||
|
|
||||||
|
|
@ -87,8 +87,8 @@ export default function AdminAvailabilityPage() {
|
||||||
setEditSlots(
|
setEditSlots(
|
||||||
existingSlots.length > 0
|
existingSlots.length > 0
|
||||||
? existingSlots.map((s) => ({
|
? existingSlots.map((s) => ({
|
||||||
start_time: s.start_time.slice(0, 5),
|
start_time: formatTimeString(s.start_time),
|
||||||
end_time: s.end_time.slice(0, 5),
|
end_time: formatTimeString(s.end_time),
|
||||||
}))
|
}))
|
||||||
: [{ start_time: "09:00", end_time: "17:00" }]
|
: [{ start_time: "09:00", end_time: "17:00" }]
|
||||||
);
|
);
|
||||||
|
|
@ -206,7 +206,7 @@ export default function AdminAvailabilityPage() {
|
||||||
};
|
};
|
||||||
|
|
||||||
const formatSlotTime = (slot: TimeSlot): string => {
|
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) {
|
if (isLoading) {
|
||||||
|
|
|
||||||
|
|
@ -46,6 +46,19 @@ export function formatDisplayDate(d: Date): string {
|
||||||
return d.toLocaleDateString("en-US", { weekday: "short", month: "short", day: "numeric" });
|
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).
|
* Get date range for booking/availability (from minAdvanceDays to maxAdvanceDays).
|
||||||
* Returns an array of Date objects starting from minAdvanceDays days from today.
|
* Returns an array of Date objects starting from minAdvanceDays days from today.
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue