diff --git a/src/app/(owner)/owner/appointments/[id]/page.tsx b/src/app/(owner)/owner/appointments/[id]/page.tsx index 6628567..88af4d5 100644 --- a/src/app/(owner)/owner/appointments/[id]/page.tsx +++ b/src/app/(owner)/owner/appointments/[id]/page.tsx @@ -1,5 +1,5 @@ import type { Metadata } from "next"; -import { CalendarPlus, Mail, Phone } from "lucide-react"; +import { Mail, Phone } from "lucide-react"; import Link from "next/link"; import { notFound, redirect } from "next/navigation"; import { auth } from "@/auth"; @@ -196,11 +196,16 @@ export default async function OwnerAppointmentDetailsPage({ {loyalty?.isEnabled && (
- Loyalty -

- {loyalty.currentStamps}/{resolveRewardThreshold(loyalty)} stamps - {loyalty.availableReward && · Reward available} -

+
+
+ Loyalty +

+ {loyalty.currentStamps}/{resolveRewardThreshold(loyalty)} stamps + {loyalty.availableReward && · Reward available} +

+
+ +
{loyaltyTransactions.length > 0 && (
); diff --git a/src/features/staff/components/appointment-status-actions.tsx b/src/features/staff/components/appointment-status-actions.tsx index 0f59bf1..bd90d96 100644 --- a/src/features/staff/components/appointment-status-actions.tsx +++ b/src/features/staff/components/appointment-status-actions.tsx @@ -57,14 +57,17 @@ export function AppointmentStatusActions({ actions = DEFAULT_ACTIONS, layout = "wrap", rescheduleUrl, + rescheduleLabel = "Reschedule", }: { appointmentId: string; status: RawStatus; actions?: AppointmentActionSet; /** "stack" renders one full-width button per row (used by both Current Appointment and Appointment Details); "wrap" (default) keeps the original inline small buttons. */ layout?: "wrap" | "stack"; - /** When given, renders a "Reschedule" link right after the primary status button and before Mark No-Show/Cancel — the caller (Appointment Details) decides whether the status is actually reschedulable, this component just renders what it's given. */ + /** When given, renders a reschedule link right after the primary status button and before Mark No-Show/Cancel — the caller (Appointment Details) decides whether the status is actually reschedulable, this component just renders what it's given. */ rescheduleUrl?: string; + /** Owner's variant reads "Reschedule / Reassign" (they can also hand the appointment to a different staff member); staff's own reschedule can't reassign anyone, so it stays plain "Reschedule". */ + rescheduleLabel?: string; }) { const router = useRouter(); const [isPending, startTransition] = useTransition(); @@ -175,7 +178,7 @@ export function AppointmentStatusActions({ )} {rescheduleUrl && ( )} {status === "CONFIRMED" && (