Extract duplicate status display logic to shared utility

- Created frontend/app/utils/appointment.ts with getStatusDisplay()
- Supports context-aware text (isOwnView parameter)
- Updated both appointments pages to use shared utility
This commit is contained in:
counterweight 2025-12-21 17:50:24 +01:00
parent d24acfd322
commit 8cc2cfa2e4
Signed by: counterweight
GPG key ID: 883EDBAA726BD96C
3 changed files with 37 additions and 30 deletions

View file

@ -8,23 +8,10 @@ import { Header } from "../components/Header";
import { useRequireAuth } from "../hooks/useRequireAuth";
import { components } from "../generated/api";
import { formatDateTime } from "../utils/date";
import { getStatusDisplay } from "../utils/appointment";
type AppointmentResponse = components["schemas"]["AppointmentResponse"];
// Helper to get status display
function getStatusDisplay(status: string): { text: string; bgColor: string; textColor: string } {
switch (status) {
case "booked":
return { text: "Booked", bgColor: "rgba(34, 197, 94, 0.2)", textColor: "#4ade80" };
case "cancelled_by_user":
return { text: "Cancelled by you", bgColor: "rgba(239, 68, 68, 0.2)", textColor: "#f87171" };
case "cancelled_by_admin":
return { text: "Cancelled by admin", bgColor: "rgba(239, 68, 68, 0.2)", textColor: "#f87171" };
default:
return { text: status, bgColor: "rgba(255,255,255,0.1)", textColor: "rgba(255,255,255,0.6)" };
}
}
const styles: Record<string, React.CSSProperties> = {
main: {
minHeight: "100vh",
@ -266,7 +253,7 @@ export default function AppointmentsPage() {
</h2>
<div style={styles.appointmentList}>
{upcomingAppointments.map((apt) => {
const status = getStatusDisplay(apt.status);
const status = getStatusDisplay(apt.status, true);
return (
<div key={apt.id} style={styles.appointmentCard}>
<div style={styles.appointmentHeader}>
@ -332,7 +319,7 @@ export default function AppointmentsPage() {
</h2>
<div style={styles.appointmentList}>
{pastOrCancelledAppointments.map((apt) => {
const status = getStatusDisplay(apt.status);
const status = getStatusDisplay(apt.status, true);
return (
<div key={apt.id} style={{...styles.appointmentCard, ...styles.appointmentCardPast}}>
<div style={styles.appointmentTime}>