@withpotter/pages-bookings 0.13.0-next.101
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/dashboard/(bookings)/attendees/page.js +8 -0
- package/dist/dashboard/(bookings)/attendees/page.js.map +1 -0
- package/dist/dashboard/(bookings)/availability/_components/availability-screen.js +714 -0
- package/dist/dashboard/(bookings)/availability/_components/availability-screen.js.map +1 -0
- package/dist/dashboard/(bookings)/availability/_components/month-availability.js +130 -0
- package/dist/dashboard/(bookings)/availability/_components/month-availability.js.map +1 -0
- package/dist/dashboard/(bookings)/availability/page.js +10 -0
- package/dist/dashboard/(bookings)/availability/page.js.map +1 -0
- package/dist/dashboard/(bookings)/bookings/[bookingId]/_components/assign-resource-modal.js +133 -0
- package/dist/dashboard/(bookings)/bookings/[bookingId]/_components/assign-resource-modal.js.map +1 -0
- package/dist/dashboard/(bookings)/bookings/[bookingId]/_components/booking-constants.js +26 -0
- package/dist/dashboard/(bookings)/bookings/[bookingId]/_components/booking-constants.js.map +1 -0
- package/dist/dashboard/(bookings)/bookings/[bookingId]/_components/booking-desktop-layout.js +194 -0
- package/dist/dashboard/(bookings)/bookings/[bookingId]/_components/booking-desktop-layout.js.map +1 -0
- package/dist/dashboard/(bookings)/bookings/[bookingId]/_components/booking-layout-props.js +1 -0
- package/dist/dashboard/(bookings)/bookings/[bookingId]/_components/booking-layout-props.js.map +1 -0
- package/dist/dashboard/(bookings)/bookings/[bookingId]/_components/booking-lede.js +189 -0
- package/dist/dashboard/(bookings)/bookings/[bookingId]/_components/booking-lede.js.map +1 -0
- package/dist/dashboard/(bookings)/bookings/[bookingId]/_components/booking-meta.js +38 -0
- package/dist/dashboard/(bookings)/bookings/[bookingId]/_components/booking-meta.js.map +1 -0
- package/dist/dashboard/(bookings)/bookings/[bookingId]/_components/booking-mobile-layout.js +315 -0
- package/dist/dashboard/(bookings)/bookings/[bookingId]/_components/booking-mobile-layout.js.map +1 -0
- package/dist/dashboard/(bookings)/bookings/[bookingId]/_components/booking-mobile-screen.js +94 -0
- package/dist/dashboard/(bookings)/bookings/[bookingId]/_components/booking-mobile-screen.js.map +1 -0
- package/dist/dashboard/(bookings)/bookings/[bookingId]/_components/booking-money.js +54 -0
- package/dist/dashboard/(bookings)/bookings/[bookingId]/_components/booking-money.js.map +1 -0
- package/dist/dashboard/(bookings)/bookings/[bookingId]/_components/booking-split.js +71 -0
- package/dist/dashboard/(bookings)/bookings/[bookingId]/_components/booking-split.js.map +1 -0
- package/dist/dashboard/(bookings)/bookings/[bookingId]/_components/cancel-booking-modal.js +102 -0
- package/dist/dashboard/(bookings)/bookings/[bookingId]/_components/cancel-booking-modal.js.map +1 -0
- package/dist/dashboard/(bookings)/bookings/[bookingId]/_components/cancellation-notice.js +33 -0
- package/dist/dashboard/(bookings)/bookings/[bookingId]/_components/cancellation-notice.js.map +1 -0
- package/dist/dashboard/(bookings)/bookings/[bookingId]/_components/customer-info-card.js +65 -0
- package/dist/dashboard/(bookings)/bookings/[bookingId]/_components/customer-info-card.js.map +1 -0
- package/dist/dashboard/(bookings)/bookings/[bookingId]/_components/index.js +23 -0
- package/dist/dashboard/(bookings)/bookings/[bookingId]/_components/index.js.map +1 -0
- package/dist/dashboard/(bookings)/bookings/[bookingId]/_components/intake-answers-card.js +19 -0
- package/dist/dashboard/(bookings)/bookings/[bookingId]/_components/intake-answers-card.js.map +1 -0
- package/dist/dashboard/(bookings)/bookings/[bookingId]/_components/refund-booking-modal.js +156 -0
- package/dist/dashboard/(bookings)/bookings/[bookingId]/_components/refund-booking-modal.js.map +1 -0
- package/dist/dashboard/(bookings)/bookings/[bookingId]/_components/reschedule-booking-modal.js +120 -0
- package/dist/dashboard/(bookings)/bookings/[bookingId]/_components/reschedule-booking-modal.js.map +1 -0
- package/dist/dashboard/(bookings)/bookings/[bookingId]/_components/security-deposit-card.js +63 -0
- package/dist/dashboard/(bookings)/bookings/[bookingId]/_components/security-deposit-card.js.map +1 -0
- package/dist/dashboard/(bookings)/bookings/[bookingId]/_components/settle-deposit-modal.js +141 -0
- package/dist/dashboard/(bookings)/bookings/[bookingId]/_components/settle-deposit-modal.js.map +1 -0
- package/dist/dashboard/(bookings)/bookings/[bookingId]/_components/ticket-row-actions.js +49 -0
- package/dist/dashboard/(bookings)/bookings/[bookingId]/_components/ticket-row-actions.js.map +1 -0
- package/dist/dashboard/(bookings)/bookings/[bookingId]/_components/waiting-queue-notice.js +42 -0
- package/dist/dashboard/(bookings)/bookings/[bookingId]/_components/waiting-queue-notice.js.map +1 -0
- package/dist/dashboard/(bookings)/bookings/[bookingId]/_components.js +1 -0
- package/dist/dashboard/(bookings)/bookings/[bookingId]/_hooks/index.js +19 -0
- package/dist/dashboard/(bookings)/bookings/[bookingId]/_hooks/index.js.map +1 -0
- package/dist/dashboard/(bookings)/bookings/[bookingId]/_hooks/use-booking-detail-data.js +352 -0
- package/dist/dashboard/(bookings)/bookings/[bookingId]/_hooks/use-booking-detail-data.js.map +1 -0
- package/dist/dashboard/(bookings)/bookings/[bookingId]/_hooks.js +1 -0
- package/dist/dashboard/(bookings)/bookings/[bookingId]/layout.js +33 -0
- package/dist/dashboard/(bookings)/bookings/[bookingId]/layout.js.map +1 -0
- package/dist/dashboard/(bookings)/bookings/[bookingId]/page.js +356 -0
- package/dist/dashboard/(bookings)/bookings/[bookingId]/page.js.map +1 -0
- package/dist/dashboard/(bookings)/bookings/_components/appointment-calendar-layout.js +34 -0
- package/dist/dashboard/(bookings)/bookings/_components/appointment-calendar-layout.js.map +1 -0
- package/dist/dashboard/(bookings)/bookings/_components/booking-constants.js +92 -0
- package/dist/dashboard/(bookings)/bookings/_components/booking-constants.js.map +1 -0
- package/dist/dashboard/(bookings)/bookings/_components/booking-tab-hints.js +32 -0
- package/dist/dashboard/(bookings)/bookings/_components/booking-tab-hints.js.map +1 -0
- package/dist/dashboard/(bookings)/bookings/_components/bookings-filter-bar.js +131 -0
- package/dist/dashboard/(bookings)/bookings/_components/bookings-filter-bar.js.map +1 -0
- package/dist/dashboard/(bookings)/bookings/_components/bookings-mobile-controls.js +119 -0
- package/dist/dashboard/(bookings)/bookings/_components/bookings-mobile-controls.js.map +1 -0
- package/dist/dashboard/(bookings)/bookings/_components/bookings-screen.js +414 -0
- package/dist/dashboard/(bookings)/bookings/_components/bookings-screen.js.map +1 -0
- package/dist/dashboard/(bookings)/bookings/_components/bookings-table.js +192 -0
- package/dist/dashboard/(bookings)/bookings/_components/bookings-table.js.map +1 -0
- package/dist/dashboard/(bookings)/bookings/_components/cannot-take-bookings.js +34 -0
- package/dist/dashboard/(bookings)/bookings/_components/cannot-take-bookings.js.map +1 -0
- package/dist/dashboard/(bookings)/bookings/_components/demo-data.js +176 -0
- package/dist/dashboard/(bookings)/bookings/_components/demo-data.js.map +1 -0
- package/dist/dashboard/(bookings)/bookings/_components/index.js +9 -0
- package/dist/dashboard/(bookings)/bookings/_components/index.js.map +1 -0
- package/dist/dashboard/(bookings)/bookings/_components/today/booking-card.js +126 -0
- package/dist/dashboard/(bookings)/bookings/_components/today/booking-card.js.map +1 -0
- package/dist/dashboard/(bookings)/bookings/_components/today/demo-data.js +142 -0
- package/dist/dashboard/(bookings)/bookings/_components/today/demo-data.js.map +1 -0
- package/dist/dashboard/(bookings)/bookings/_components/today/handover.js +128 -0
- package/dist/dashboard/(bookings)/bookings/_components/today/handover.js.map +1 -0
- package/dist/dashboard/(bookings)/bookings/_components/today/index.js +17 -0
- package/dist/dashboard/(bookings)/bookings/_components/today/index.js.map +1 -0
- package/dist/dashboard/(bookings)/bookings/_components/today/past-band.js +69 -0
- package/dist/dashboard/(bookings)/bookings/_components/today/past-band.js.map +1 -0
- package/dist/dashboard/(bookings)/bookings/_components/today/resource-board.js +111 -0
- package/dist/dashboard/(bookings)/bookings/_components/today/resource-board.js.map +1 -0
- package/dist/dashboard/(bookings)/bookings/_components/today/today-band.js +61 -0
- package/dist/dashboard/(bookings)/bookings/_components/today/today-band.js.map +1 -0
- package/dist/dashboard/(bookings)/bookings/_components/today/upcoming-band.js +113 -0
- package/dist/dashboard/(bookings)/bookings/_components/today/upcoming-band.js.map +1 -0
- package/dist/dashboard/(bookings)/bookings/_components/today/waiting-queue.js +62 -0
- package/dist/dashboard/(bookings)/bookings/_components/today/waiting-queue.js.map +1 -0
- package/dist/dashboard/(bookings)/bookings/_components/today-board.js +192 -0
- package/dist/dashboard/(bookings)/bookings/_components/today-board.js.map +1 -0
- package/dist/dashboard/(bookings)/bookings/_components/today.js +1 -0
- package/dist/dashboard/(bookings)/bookings/_components.js +1 -0
- package/dist/dashboard/(bookings)/bookings/_hooks/index.js +5 -0
- package/dist/dashboard/(bookings)/bookings/_hooks/index.js.map +1 -0
- package/dist/dashboard/(bookings)/bookings/_hooks/use-bookings-data.js +331 -0
- package/dist/dashboard/(bookings)/bookings/_hooks/use-bookings-data.js.map +1 -0
- package/dist/dashboard/(bookings)/bookings/_hooks/use-today-data.js +309 -0
- package/dist/dashboard/(bookings)/bookings/_hooks/use-today-data.js.map +1 -0
- package/dist/dashboard/(bookings)/bookings/_hooks.js +1 -0
- package/dist/dashboard/(bookings)/bookings/_lib/booking-link.js +13 -0
- package/dist/dashboard/(bookings)/bookings/_lib/booking-link.js.map +1 -0
- package/dist/dashboard/(bookings)/bookings/attendees/_components/attendee-cards.js +60 -0
- package/dist/dashboard/(bookings)/bookings/attendees/_components/attendee-cards.js.map +1 -0
- package/dist/dashboard/(bookings)/bookings/attendees/_components/qr-scanner-modal.js +225 -0
- package/dist/dashboard/(bookings)/bookings/attendees/_components/qr-scanner-modal.js.map +1 -0
- package/dist/dashboard/(bookings)/bookings/attendees/demo-data.js +195 -0
- package/dist/dashboard/(bookings)/bookings/attendees/demo-data.js.map +1 -0
- package/dist/dashboard/(bookings)/bookings/attendees/page.js +341 -0
- package/dist/dashboard/(bookings)/bookings/attendees/page.js.map +1 -0
- package/dist/dashboard/(bookings)/bookings/new/page.js +129 -0
- package/dist/dashboard/(bookings)/bookings/new/page.js.map +1 -0
- package/dist/dashboard/(bookings)/bookings/page.js +10 -0
- package/dist/dashboard/(bookings)/bookings/page.js.map +1 -0
- package/dist/dashboard/(bookings)/bookings/sessions/new/_components/save-buttons.js +36 -0
- package/dist/dashboard/(bookings)/bookings/sessions/new/_components/save-buttons.js.map +1 -0
- package/dist/dashboard/(bookings)/bookings/sessions/new/_components/session-creator.js +386 -0
- package/dist/dashboard/(bookings)/bookings/sessions/new/_components/session-creator.js.map +1 -0
- package/dist/dashboard/(bookings)/bookings/sessions/new/_lib/session-payload.js +62 -0
- package/dist/dashboard/(bookings)/bookings/sessions/new/_lib/session-payload.js.map +1 -0
- package/dist/dashboard/(bookings)/bookings/sessions/new/page.js +10 -0
- package/dist/dashboard/(bookings)/bookings/sessions/new/page.js.map +1 -0
- package/dist/dashboard/(bookings)/calendar/_components/calendar-nav.js +84 -0
- package/dist/dashboard/(bookings)/calendar/_components/calendar-nav.js.map +1 -0
- package/dist/dashboard/(bookings)/calendar/_components/calendar-range.js +84 -0
- package/dist/dashboard/(bookings)/calendar/_components/calendar-range.js.map +1 -0
- package/dist/dashboard/(bookings)/calendar/_components/day-board-view.js +279 -0
- package/dist/dashboard/(bookings)/calendar/_components/day-board-view.js.map +1 -0
- package/dist/dashboard/(bookings)/calendar/_components/event-detail-modal.js +113 -0
- package/dist/dashboard/(bookings)/calendar/_components/event-detail-modal.js.map +1 -0
- package/dist/dashboard/(bookings)/calendar/_components/format.js +22 -0
- package/dist/dashboard/(bookings)/calendar/_components/format.js.map +1 -0
- package/dist/dashboard/(bookings)/calendar/_components/month-grid.js +109 -0
- package/dist/dashboard/(bookings)/calendar/_components/month-grid.js.map +1 -0
- package/dist/dashboard/(bookings)/calendar/_components/resource-day-grid.js +325 -0
- package/dist/dashboard/(bookings)/calendar/_components/resource-day-grid.js.map +1 -0
- package/dist/dashboard/(bookings)/calendar/_components/slot-action-sheet.js +209 -0
- package/dist/dashboard/(bookings)/calendar/_components/slot-action-sheet.js.map +1 -0
- package/dist/dashboard/(bookings)/calendar/_components/use-block-drag.js +77 -0
- package/dist/dashboard/(bookings)/calendar/_components/use-block-drag.js.map +1 -0
- package/dist/dashboard/(bookings)/calendar/_components/use-calendar-nav.js +69 -0
- package/dist/dashboard/(bookings)/calendar/_components/use-calendar-nav.js.map +1 -0
- package/dist/dashboard/(bookings)/calendar/_components/week-grid.js +202 -0
- package/dist/dashboard/(bookings)/calendar/_components/week-grid.js.map +1 -0
- package/dist/dashboard/(bookings)/calendar/_components/year-grid.js +111 -0
- package/dist/dashboard/(bookings)/calendar/_components/year-grid.js.map +1 -0
- package/dist/dashboard/(bookings)/calendar/page.js +8 -0
- package/dist/dashboard/(bookings)/calendar/page.js.map +1 -0
- package/dist/dashboard/(bookings)/calendar-sync/_components/channel-feed-modal.js +126 -0
- package/dist/dashboard/(bookings)/calendar-sync/_components/channel-feed-modal.js.map +1 -0
- package/dist/dashboard/(bookings)/calendar-sync/_components/channel-feeds-section.js +99 -0
- package/dist/dashboard/(bookings)/calendar-sync/_components/channel-feeds-section.js.map +1 -0
- package/dist/dashboard/(bookings)/calendar-sync/demo-data.js +64 -0
- package/dist/dashboard/(bookings)/calendar-sync/demo-data.js.map +1 -0
- package/dist/dashboard/(bookings)/calendar-sync/page.js +15 -0
- package/dist/dashboard/(bookings)/calendar-sync/page.js.map +1 -0
- package/dist/dashboard/(bookings)/check-in/page.js +252 -0
- package/dist/dashboard/(bookings)/check-in/page.js.map +1 -0
- package/dist/dashboard/(bookings)/events/[eventId]/_components/event-attendees.js +108 -0
- package/dist/dashboard/(bookings)/events/[eventId]/_components/event-attendees.js.map +1 -0
- package/dist/dashboard/(bookings)/events/[eventId]/_components/event-share.js +73 -0
- package/dist/dashboard/(bookings)/events/[eventId]/_components/event-share.js.map +1 -0
- package/dist/dashboard/(bookings)/events/[eventId]/layout.js +10 -0
- package/dist/dashboard/(bookings)/events/[eventId]/layout.js.map +1 -0
- package/dist/dashboard/(bookings)/events/[eventId]/page.js +247 -0
- package/dist/dashboard/(bookings)/events/[eventId]/page.js.map +1 -0
- package/dist/dashboard/(bookings)/events/_components/event-grid.js +44 -0
- package/dist/dashboard/(bookings)/events/_components/event-grid.js.map +1 -0
- package/dist/dashboard/(bookings)/events/_components/event-poster.js +17 -0
- package/dist/dashboard/(bookings)/events/_components/event-poster.js.map +1 -0
- package/dist/dashboard/(bookings)/events/_hooks/use-events-data.js +55 -0
- package/dist/dashboard/(bookings)/events/_hooks/use-events-data.js.map +1 -0
- package/dist/dashboard/(bookings)/events/_lib/event-facts.js +68 -0
- package/dist/dashboard/(bookings)/events/_lib/event-facts.js.map +1 -0
- package/dist/dashboard/(bookings)/events/new/_components/event-composer.js +295 -0
- package/dist/dashboard/(bookings)/events/new/_components/event-composer.js.map +1 -0
- package/dist/dashboard/(bookings)/events/new/_components/event-poster.js +65 -0
- package/dist/dashboard/(bookings)/events/new/_components/event-poster.js.map +1 -0
- package/dist/dashboard/(bookings)/events/new/_components/ticket-tiers.js +75 -0
- package/dist/dashboard/(bookings)/events/new/_components/ticket-tiers.js.map +1 -0
- package/dist/dashboard/(bookings)/events/new/page.js +10 -0
- package/dist/dashboard/(bookings)/events/new/page.js.map +1 -0
- package/dist/dashboard/(bookings)/events/page.js +214 -0
- package/dist/dashboard/(bookings)/events/page.js.map +1 -0
- package/dist/dashboard/(bookings)/resources/[resourceId]/layout.js +36 -0
- package/dist/dashboard/(bookings)/resources/[resourceId]/layout.js.map +1 -0
- package/dist/dashboard/(bookings)/resources/[resourceId]/page.js +351 -0
- package/dist/dashboard/(bookings)/resources/[resourceId]/page.js.map +1 -0
- package/dist/dashboard/(bookings)/resources/_components/block-time-modal.js +130 -0
- package/dist/dashboard/(bookings)/resources/_components/block-time-modal.js.map +1 -0
- package/dist/dashboard/(bookings)/resources/_components/category-card.js +74 -0
- package/dist/dashboard/(bookings)/resources/_components/category-card.js.map +1 -0
- package/dist/dashboard/(bookings)/resources/_components/category-form-dialog.js +197 -0
- package/dist/dashboard/(bookings)/resources/_components/category-form-dialog.js.map +1 -0
- package/dist/dashboard/(bookings)/resources/_components/day-editor.js +194 -0
- package/dist/dashboard/(bookings)/resources/_components/day-editor.js.map +1 -0
- package/dist/dashboard/(bookings)/resources/_components/group-dialog.js +170 -0
- package/dist/dashboard/(bookings)/resources/_components/group-dialog.js.map +1 -0
- package/dist/dashboard/(bookings)/resources/_components/group-header.js +90 -0
- package/dist/dashboard/(bookings)/resources/_components/group-header.js.map +1 -0
- package/dist/dashboard/(bookings)/resources/_components/index.js +22 -0
- package/dist/dashboard/(bookings)/resources/_components/index.js.map +1 -0
- package/dist/dashboard/(bookings)/resources/_components/mobile-category-form-sheet.js +256 -0
- package/dist/dashboard/(bookings)/resources/_components/mobile-category-form-sheet.js.map +1 -0
- package/dist/dashboard/(bookings)/resources/_components/resource-form.js +420 -0
- package/dist/dashboard/(bookings)/resources/_components/resource-form.js.map +1 -0
- package/dist/dashboard/(bookings)/resources/_components/resource-picker.js +144 -0
- package/dist/dashboard/(bookings)/resources/_components/resource-picker.js.map +1 -0
- package/dist/dashboard/(bookings)/resources/_components/resource-type-picker-empty.js +109 -0
- package/dist/dashboard/(bookings)/resources/_components/resource-type-picker-empty.js.map +1 -0
- package/dist/dashboard/(bookings)/resources/_components/roster-empty.js +103 -0
- package/dist/dashboard/(bookings)/resources/_components/roster-empty.js.map +1 -0
- package/dist/dashboard/(bookings)/resources/_components/roster-grid.js +160 -0
- package/dist/dashboard/(bookings)/resources/_components/roster-grid.js.map +1 -0
- package/dist/dashboard/(bookings)/resources/_components/schedule-editor.js +244 -0
- package/dist/dashboard/(bookings)/resources/_components/schedule-editor.js.map +1 -0
- package/dist/dashboard/(bookings)/resources/_components/schedule-timezone-field.js +25 -0
- package/dist/dashboard/(bookings)/resources/_components/schedule-timezone-field.js.map +1 -0
- package/dist/dashboard/(bookings)/resources/_components/solo-schedule-view.js +146 -0
- package/dist/dashboard/(bookings)/resources/_components/solo-schedule-view.js.map +1 -0
- package/dist/dashboard/(bookings)/resources/_components/team-onboarding-dialog.js +161 -0
- package/dist/dashboard/(bookings)/resources/_components/team-onboarding-dialog.js.map +1 -0
- package/dist/dashboard/(bookings)/resources/_components/week-grid.js +175 -0
- package/dist/dashboard/(bookings)/resources/_components/week-grid.js.map +1 -0
- package/dist/dashboard/(bookings)/resources/_components.js +1 -0
- package/dist/dashboard/(bookings)/resources/_hooks/index.js +8 -0
- package/dist/dashboard/(bookings)/resources/_hooks/index.js.map +1 -0
- package/dist/dashboard/(bookings)/resources/_hooks/use-resource-categories-data.js +86 -0
- package/dist/dashboard/(bookings)/resources/_hooks/use-resource-categories-data.js.map +1 -0
- package/dist/dashboard/(bookings)/resources/_hooks/use-roster-page.js +138 -0
- package/dist/dashboard/(bookings)/resources/_hooks/use-roster-page.js.map +1 -0
- package/dist/dashboard/(bookings)/resources/_hooks/use-roster.js +182 -0
- package/dist/dashboard/(bookings)/resources/_hooks/use-roster.js.map +1 -0
- package/dist/dashboard/(bookings)/resources/_hooks.js +1 -0
- package/dist/dashboard/(bookings)/resources/_lib/presets.js +147 -0
- package/dist/dashboard/(bookings)/resources/_lib/presets.js.map +1 -0
- package/dist/dashboard/(bookings)/resources/_lib/schedule-timezone.js +17 -0
- package/dist/dashboard/(bookings)/resources/_lib/schedule-timezone.js.map +1 -0
- package/dist/dashboard/(bookings)/resources/_lib/shapes.js +105 -0
- package/dist/dashboard/(bookings)/resources/_lib/shapes.js.map +1 -0
- package/dist/dashboard/(bookings)/resources/_lib/week.js +122 -0
- package/dist/dashboard/(bookings)/resources/_lib/week.js.map +1 -0
- package/dist/dashboard/(bookings)/resources/page.js +391 -0
- package/dist/dashboard/(bookings)/resources/page.js.map +1 -0
- package/dist/dashboard/(bookings)/schedule/page.js +8 -0
- package/dist/dashboard/(bookings)/schedule/page.js.map +1 -0
- package/dist/dashboard/(bookings)/today/page.js +14 -0
- package/dist/dashboard/(bookings)/today/page.js.map +1 -0
- package/dist/dashboard/(bookings)/waitlist/_components/demo-data.js +99 -0
- package/dist/dashboard/(bookings)/waitlist/_components/demo-data.js.map +1 -0
- package/dist/dashboard/(bookings)/waitlist/_components/offer-spot-modal.js +71 -0
- package/dist/dashboard/(bookings)/waitlist/_components/offer-spot-modal.js.map +1 -0
- package/dist/dashboard/(bookings)/waitlist/_components/waitlist-entry-editor.js +150 -0
- package/dist/dashboard/(bookings)/waitlist/_components/waitlist-entry-editor.js.map +1 -0
- package/dist/dashboard/(bookings)/waitlist/new/page.js +59 -0
- package/dist/dashboard/(bookings)/waitlist/new/page.js.map +1 -0
- package/dist/dashboard/(bookings)/waitlist/page.js +317 -0
- package/dist/dashboard/(bookings)/waitlist/page.js.map +1 -0
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -0
- package/package.json +60 -0
|
@@ -0,0 +1,352 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { useState } from "react";
|
|
3
|
+
import { useAuth } from "@withpotter/lib/auth-context";
|
|
4
|
+
import { useFormatCurrency } from "@withpotter/hooks/use-format-currency";
|
|
5
|
+
import { useApiQuery } from "@withpotter/hooks/use-api-query";
|
|
6
|
+
import { useDemoMode } from "@withpotter/hooks/use-demo-mode";
|
|
7
|
+
import { useApiFeatures } from "@withpotter/hooks/use-api-features";
|
|
8
|
+
import { bookingsApi } from "@withpotter/lib/api/bookings";
|
|
9
|
+
import { BOX_HIDE_SPLITS } from "@withpotter/lib/box-splits";
|
|
10
|
+
import { loyaltyApi } from "@withpotter/lib/api/loyalty";
|
|
11
|
+
import { useRouter } from "next/navigation";
|
|
12
|
+
import { useItemLinks } from "@withpotter/lib/use-item-links";
|
|
13
|
+
import { DEMO_BOOKINGS } from "@withpotter/pages-bookings/dashboard/(bookings)/bookings/_components/demo-data";
|
|
14
|
+
import { useBookingStatusConfig } from "@withpotter/pages-bookings/dashboard/(bookings)/bookings/_components/booking-constants";
|
|
15
|
+
import {
|
|
16
|
+
BOOKING_STATUS_CONFIG,
|
|
17
|
+
useBookingStatusConfig as useBookingStatusConfig2
|
|
18
|
+
} from "@withpotter/pages-bookings/dashboard/(bookings)/bookings/_components/booking-constants";
|
|
19
|
+
const ARCHETYPE_BY_BOOKING_TYPE = {
|
|
20
|
+
table: "dine-in",
|
|
21
|
+
room: "rent-property",
|
|
22
|
+
event: "event-tickets",
|
|
23
|
+
appointment: "take-bookings",
|
|
24
|
+
class: "take-bookings",
|
|
25
|
+
resource: "take-bookings"
|
|
26
|
+
};
|
|
27
|
+
const STATUS_TRANSITIONS = {
|
|
28
|
+
pending: ["confirmed", "cancelled"],
|
|
29
|
+
confirmed: ["checked_in", "completed", "cancelled", "no_show"],
|
|
30
|
+
checked_in: ["completed"],
|
|
31
|
+
in_progress: ["completed"],
|
|
32
|
+
completed: [],
|
|
33
|
+
cancelled: [],
|
|
34
|
+
no_show: [],
|
|
35
|
+
waitlist: ["confirmed", "cancelled"]
|
|
36
|
+
};
|
|
37
|
+
function formatFullDate(dateString) {
|
|
38
|
+
return new Date(dateString).toLocaleDateString("en-US", {
|
|
39
|
+
weekday: "long",
|
|
40
|
+
month: "long",
|
|
41
|
+
day: "numeric",
|
|
42
|
+
year: "numeric"
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
function formatTime(time) {
|
|
46
|
+
if (!time) return "";
|
|
47
|
+
const [h, m] = time.split(":");
|
|
48
|
+
const hour = parseInt(h, 10);
|
|
49
|
+
const ampm = hour >= 12 ? "PM" : "AM";
|
|
50
|
+
const h12 = hour % 12 || 12;
|
|
51
|
+
return `${h12}:${m} ${ampm}`;
|
|
52
|
+
}
|
|
53
|
+
function formatDateTime(dateString) {
|
|
54
|
+
return new Date(dateString).toLocaleDateString("en-US", {
|
|
55
|
+
month: "short",
|
|
56
|
+
day: "numeric",
|
|
57
|
+
year: "numeric",
|
|
58
|
+
hour: "numeric",
|
|
59
|
+
minute: "2-digit"
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
function useBookingDetailData(bookingId) {
|
|
63
|
+
const { tenant } = useAuth();
|
|
64
|
+
const resolvedStatuses = useBookingStatusConfig();
|
|
65
|
+
const { features } = useApiFeatures();
|
|
66
|
+
const formatCurrency = useFormatCurrency();
|
|
67
|
+
const router = useRouter();
|
|
68
|
+
const links = useItemLinks();
|
|
69
|
+
const [updatingStatus, setUpdatingStatus] = useState(false);
|
|
70
|
+
const [showStatusDropdown, setShowStatusDropdown] = useState(false);
|
|
71
|
+
const [showCancelModal, setShowCancelModal] = useState(false);
|
|
72
|
+
const [cancelReason, setCancelReason] = useState("");
|
|
73
|
+
const [showRescheduleModal, setShowRescheduleModal] = useState(false);
|
|
74
|
+
const [rescheduling, setRescheduling] = useState(false);
|
|
75
|
+
const [rescheduleError, setRescheduleError] = useState(null);
|
|
76
|
+
const [showRecordPaymentModal, setShowRecordPaymentModal] = useState(false);
|
|
77
|
+
const [recordingPayment, setRecordingPayment] = useState(false);
|
|
78
|
+
const [recordPaymentError, setRecordPaymentError] = useState(
|
|
79
|
+
null
|
|
80
|
+
);
|
|
81
|
+
const [showRefundModal, setShowRefundModal] = useState(false);
|
|
82
|
+
const [refunding, setRefunding] = useState(false);
|
|
83
|
+
const [refundError, setRefundError] = useState(null);
|
|
84
|
+
const [showSettleDepositModal, setShowSettleDepositModal] = useState(false);
|
|
85
|
+
const [settlingDeposit, setSettlingDeposit] = useState(false);
|
|
86
|
+
const [settleDepositError, setSettleDepositError] = useState(
|
|
87
|
+
null
|
|
88
|
+
);
|
|
89
|
+
const demoActive = useDemoMode();
|
|
90
|
+
const demoBooking = demoActive ? DEMO_BOOKINGS.find((b) => b.id === bookingId) : void 0;
|
|
91
|
+
const isUuid = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(
|
|
92
|
+
bookingId
|
|
93
|
+
);
|
|
94
|
+
const isValidId = isUuid;
|
|
95
|
+
if (!isValidId && !demoBooking && typeof window !== "undefined") {
|
|
96
|
+
router.replace(links.bookings);
|
|
97
|
+
}
|
|
98
|
+
const {
|
|
99
|
+
data: liveBooking,
|
|
100
|
+
isLoading: liveLoading,
|
|
101
|
+
error: queryError,
|
|
102
|
+
refetch
|
|
103
|
+
} = useApiQuery(
|
|
104
|
+
["booking-detail", bookingId],
|
|
105
|
+
(slug) => bookingsApi.get(slug, bookingId),
|
|
106
|
+
{ enabled: isValidId && !demoBooking }
|
|
107
|
+
);
|
|
108
|
+
const booking = demoBooking ?? liveBooking;
|
|
109
|
+
const loading = demoBooking ? false : liveLoading;
|
|
110
|
+
const memberId = booking?.memberId ?? void 0;
|
|
111
|
+
const { data: loyaltyBalance, refetch: refetchLoyalty } = useApiQuery(
|
|
112
|
+
["booking-loyalty-balance", bookingId],
|
|
113
|
+
(slug) => loyaltyApi.getMemberBalance(slug, memberId).catch(() => null),
|
|
114
|
+
{ enabled: Boolean(memberId) }
|
|
115
|
+
);
|
|
116
|
+
const { data: loyaltyPrograms } = useApiQuery(
|
|
117
|
+
["loyalty-programs"],
|
|
118
|
+
(slug) => loyaltyApi.listPrograms(slug).catch(() => null),
|
|
119
|
+
{ enabled: Boolean(memberId) }
|
|
120
|
+
);
|
|
121
|
+
const isEventBooking = booking?.type === "event";
|
|
122
|
+
const { data: tickets } = useApiQuery(
|
|
123
|
+
["booking-tickets", bookingId],
|
|
124
|
+
(slug) => bookingsApi.getTickets(slug, bookingId),
|
|
125
|
+
{ enabled: isValidId && isEventBooking, retry: 1 }
|
|
126
|
+
);
|
|
127
|
+
const { data: finance, refetch: refetchFinance } = useApiQuery(
|
|
128
|
+
["booking-finance", bookingId],
|
|
129
|
+
(slug) => bookingsApi.getFinance(slug, bookingId),
|
|
130
|
+
{ enabled: isValidId && features.bookingManualPayments, retry: 1 }
|
|
131
|
+
);
|
|
132
|
+
const { data: split } = useApiQuery(
|
|
133
|
+
["booking-split", bookingId],
|
|
134
|
+
(slug) => bookingsApi.getSplit(slug, bookingId),
|
|
135
|
+
{ enabled: isValidId && !BOX_HIDE_SPLITS, retry: 1 }
|
|
136
|
+
);
|
|
137
|
+
const error = queryError?.message ?? null;
|
|
138
|
+
const handleStatusUpdate = async (newStatus) => {
|
|
139
|
+
if (!tenant?.slug || !booking) return;
|
|
140
|
+
if (newStatus === "cancelled") {
|
|
141
|
+
setShowCancelModal(true);
|
|
142
|
+
setShowStatusDropdown(false);
|
|
143
|
+
return;
|
|
144
|
+
}
|
|
145
|
+
setUpdatingStatus(true);
|
|
146
|
+
try {
|
|
147
|
+
switch (newStatus) {
|
|
148
|
+
case "confirmed":
|
|
149
|
+
await bookingsApi.confirm(tenant.slug, booking.id);
|
|
150
|
+
break;
|
|
151
|
+
case "completed":
|
|
152
|
+
await bookingsApi.complete(tenant.slug, booking.id);
|
|
153
|
+
break;
|
|
154
|
+
case "checked_in":
|
|
155
|
+
await bookingsApi.checkIn(tenant.slug, booking.id);
|
|
156
|
+
break;
|
|
157
|
+
case "no_show":
|
|
158
|
+
await bookingsApi.noShow(tenant.slug, booking.id);
|
|
159
|
+
break;
|
|
160
|
+
default:
|
|
161
|
+
return;
|
|
162
|
+
}
|
|
163
|
+
refetch();
|
|
164
|
+
setShowStatusDropdown(false);
|
|
165
|
+
} catch (err) {
|
|
166
|
+
console.error("Failed to update booking status:", err);
|
|
167
|
+
} finally {
|
|
168
|
+
setUpdatingStatus(false);
|
|
169
|
+
}
|
|
170
|
+
};
|
|
171
|
+
const handleCancel = async () => {
|
|
172
|
+
if (!tenant?.slug || !booking) return;
|
|
173
|
+
setUpdatingStatus(true);
|
|
174
|
+
try {
|
|
175
|
+
await bookingsApi.cancel(tenant.slug, booking.id, cancelReason);
|
|
176
|
+
refetch();
|
|
177
|
+
setShowCancelModal(false);
|
|
178
|
+
setCancelReason("");
|
|
179
|
+
} catch (err) {
|
|
180
|
+
console.error("Failed to cancel booking:", err);
|
|
181
|
+
} finally {
|
|
182
|
+
setUpdatingStatus(false);
|
|
183
|
+
}
|
|
184
|
+
};
|
|
185
|
+
const handleReschedule = async (data) => {
|
|
186
|
+
if (!tenant?.slug || !booking) return;
|
|
187
|
+
setRescheduling(true);
|
|
188
|
+
setRescheduleError(null);
|
|
189
|
+
try {
|
|
190
|
+
await bookingsApi.reschedule(tenant.slug, booking.id, data);
|
|
191
|
+
refetch();
|
|
192
|
+
setShowRescheduleModal(false);
|
|
193
|
+
} catch (err) {
|
|
194
|
+
setRescheduleError(
|
|
195
|
+
err instanceof Error ? err.message : "Could not reschedule. Try another slot."
|
|
196
|
+
);
|
|
197
|
+
} finally {
|
|
198
|
+
setRescheduling(false);
|
|
199
|
+
}
|
|
200
|
+
};
|
|
201
|
+
const handleRecordPayment = async (data) => {
|
|
202
|
+
if (!tenant?.slug || !booking) return;
|
|
203
|
+
setRecordingPayment(true);
|
|
204
|
+
setRecordPaymentError(null);
|
|
205
|
+
try {
|
|
206
|
+
if (data.redeemPoints && data.redeemValue && loyaltyBalance) {
|
|
207
|
+
await bookingsApi.recordPayment(tenant.slug, booking.id, {
|
|
208
|
+
amount: data.redeemValue,
|
|
209
|
+
channel: "loyalty",
|
|
210
|
+
note: `${data.redeemPoints.toLocaleString()} points`
|
|
211
|
+
});
|
|
212
|
+
await loyaltyApi.adjustPoints(tenant.slug, loyaltyBalance.memberId, {
|
|
213
|
+
points: -data.redeemPoints,
|
|
214
|
+
reason: `Redeemed against booking #${booking.bookingNumber}`
|
|
215
|
+
});
|
|
216
|
+
}
|
|
217
|
+
if (data.amount > 0) {
|
|
218
|
+
await bookingsApi.recordPayment(tenant.slug, booking.id, {
|
|
219
|
+
amount: data.amount,
|
|
220
|
+
channel: data.channel,
|
|
221
|
+
note: data.note
|
|
222
|
+
});
|
|
223
|
+
}
|
|
224
|
+
refetch();
|
|
225
|
+
refetchLoyalty();
|
|
226
|
+
setShowRecordPaymentModal(false);
|
|
227
|
+
} catch (err) {
|
|
228
|
+
setRecordPaymentError(
|
|
229
|
+
err instanceof Error ? err.message : "Could not record the payment."
|
|
230
|
+
);
|
|
231
|
+
} finally {
|
|
232
|
+
setRecordingPayment(false);
|
|
233
|
+
}
|
|
234
|
+
};
|
|
235
|
+
const handleRefund = async (data) => {
|
|
236
|
+
if (!tenant?.slug || !booking) return;
|
|
237
|
+
setRefunding(true);
|
|
238
|
+
setRefundError(null);
|
|
239
|
+
try {
|
|
240
|
+
await bookingsApi.refund(tenant.slug, booking.id, data);
|
|
241
|
+
refetch();
|
|
242
|
+
refetchFinance();
|
|
243
|
+
setShowRefundModal(false);
|
|
244
|
+
} catch (err) {
|
|
245
|
+
setRefundError(
|
|
246
|
+
err instanceof Error ? err.message : "Could not process the refund."
|
|
247
|
+
);
|
|
248
|
+
} finally {
|
|
249
|
+
setRefunding(false);
|
|
250
|
+
}
|
|
251
|
+
};
|
|
252
|
+
const handleSettleDeposit = async (data) => {
|
|
253
|
+
if (!tenant?.slug || !booking) return;
|
|
254
|
+
setSettlingDeposit(true);
|
|
255
|
+
setSettleDepositError(null);
|
|
256
|
+
try {
|
|
257
|
+
await bookingsApi.settleDeposit(tenant.slug, booking.id, data);
|
|
258
|
+
refetch();
|
|
259
|
+
refetchFinance();
|
|
260
|
+
setShowSettleDepositModal(false);
|
|
261
|
+
} catch (err) {
|
|
262
|
+
setSettleDepositError(
|
|
263
|
+
err instanceof Error ? err.message : "Could not settle the deposit."
|
|
264
|
+
);
|
|
265
|
+
} finally {
|
|
266
|
+
setSettlingDeposit(false);
|
|
267
|
+
}
|
|
268
|
+
};
|
|
269
|
+
const currentStatus = booking?.status || "pending";
|
|
270
|
+
const rowStatuses = resolvedStatuses(booking?.type);
|
|
271
|
+
const statusConfig = rowStatuses[currentStatus] || rowStatuses.pending;
|
|
272
|
+
const isPaid = booking?.data?.isPaid === true;
|
|
273
|
+
const bookingAmount = booking?.data?.paymentAmount || booking?.data?.total || booking?.content?.price || 0;
|
|
274
|
+
const bookingTotal = booking?.data?.total || booking?.content?.price || booking?.data?.paymentAmount || 0;
|
|
275
|
+
const paidAmount = isPaid ? bookingTotal : booking?.data?.paymentAmount || booking?.data?.depositAmount || 0;
|
|
276
|
+
const paymentReference = booking?.data?.paymentReference;
|
|
277
|
+
const paidAt = booking?.data?.paidAt;
|
|
278
|
+
const allowedTransitions = STATUS_TRANSITIONS[currentStatus] || [];
|
|
279
|
+
const canReschedule = currentStatus === "pending" || currentStatus === "confirmed";
|
|
280
|
+
const balanceDue = Math.max(0, bookingTotal - paidAmount);
|
|
281
|
+
const canRecordPayment = features.bookingManualPayments && balanceDue > 0;
|
|
282
|
+
const canRefund = features.bookingManualPayments && !!finance && finance.paid - finance.refunded > 0;
|
|
283
|
+
return {
|
|
284
|
+
tenant,
|
|
285
|
+
formatCurrency,
|
|
286
|
+
refetchBooking: refetch,
|
|
287
|
+
booking: booking ?? null,
|
|
288
|
+
tickets: tickets ?? [],
|
|
289
|
+
loading,
|
|
290
|
+
error,
|
|
291
|
+
updatingStatus,
|
|
292
|
+
showStatusDropdown,
|
|
293
|
+
setShowStatusDropdown,
|
|
294
|
+
showCancelModal,
|
|
295
|
+
setShowCancelModal,
|
|
296
|
+
cancelReason,
|
|
297
|
+
setCancelReason,
|
|
298
|
+
handleStatusUpdate,
|
|
299
|
+
handleCancel,
|
|
300
|
+
currentStatus,
|
|
301
|
+
statusConfig,
|
|
302
|
+
isPaid,
|
|
303
|
+
bookingAmount,
|
|
304
|
+
bookingTotal,
|
|
305
|
+
paidAmount,
|
|
306
|
+
paymentReference,
|
|
307
|
+
paidAt,
|
|
308
|
+
allowedTransitions,
|
|
309
|
+
canReschedule,
|
|
310
|
+
showRescheduleModal,
|
|
311
|
+
setShowRescheduleModal,
|
|
312
|
+
rescheduling,
|
|
313
|
+
rescheduleError,
|
|
314
|
+
handleReschedule,
|
|
315
|
+
balanceDue,
|
|
316
|
+
canRecordPayment,
|
|
317
|
+
showRecordPaymentModal,
|
|
318
|
+
setShowRecordPaymentModal,
|
|
319
|
+
recordingPayment,
|
|
320
|
+
recordPaymentError,
|
|
321
|
+
handleRecordPayment,
|
|
322
|
+
loyaltyBalance: loyaltyBalance ?? null,
|
|
323
|
+
loyaltyProgram: loyaltyPrograms?.[0] ?? null,
|
|
324
|
+
finance: finance ?? null,
|
|
325
|
+
split: split ?? null,
|
|
326
|
+
canRefund,
|
|
327
|
+
showRefundModal,
|
|
328
|
+
setShowRefundModal,
|
|
329
|
+
refunding,
|
|
330
|
+
refundError,
|
|
331
|
+
handleRefund,
|
|
332
|
+
// The refundable deposit, read from the money picture rather than the
|
|
333
|
+
// booking row so it always agrees with the transactions behind it.
|
|
334
|
+
securityDeposit: finance?.securityDeposit ?? null,
|
|
335
|
+
depositStatus: finance?.depositStatus ?? null,
|
|
336
|
+
showSettleDepositModal,
|
|
337
|
+
setShowSettleDepositModal,
|
|
338
|
+
settlingDeposit,
|
|
339
|
+
settleDepositError,
|
|
340
|
+
handleSettleDeposit
|
|
341
|
+
};
|
|
342
|
+
}
|
|
343
|
+
export {
|
|
344
|
+
BOOKING_STATUS_CONFIG,
|
|
345
|
+
STATUS_TRANSITIONS,
|
|
346
|
+
formatDateTime,
|
|
347
|
+
formatFullDate,
|
|
348
|
+
formatTime,
|
|
349
|
+
useBookingDetailData,
|
|
350
|
+
useBookingStatusConfig2 as useBookingStatusConfig
|
|
351
|
+
};
|
|
352
|
+
//# sourceMappingURL=use-booking-detail-data.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../../src/dashboard/%28bookings%29/bookings/%5BbookingId%5D/_hooks/use-booking-detail-data.ts"],"sourcesContent":["'use client';\n\nimport { useState, useMemo } from 'react';\nimport { useAuth } from '@withpotter/lib/auth-context';\nimport { useFormatCurrency } from '@withpotter/hooks/use-format-currency';\nimport { useApiQuery } from '@withpotter/hooks/use-api-query';\nimport { useDemoMode } from '@withpotter/hooks/use-demo-mode';\nimport { useApiFeatures } from '@withpotter/hooks/use-api-features';\nimport { bookingsApi } from '@withpotter/lib/api/bookings';\nimport { BOX_HIDE_SPLITS } from '@withpotter/lib/box-splits';\nimport { loyaltyApi } from '@withpotter/lib/api/loyalty';\nimport type {\n BookingItem,\n TicketItem,\n BookingFinance,\n SplitBooking,\n LoyaltyBalance,\n} from '@withpotter/lib/api/types';\nimport { useRouter } from 'next/navigation';\nimport { useItemLinks } from '@withpotter/lib/use-item-links';\nimport { useIntentConfig } from '@withpotter/lib/intents/use-intent-config';\nimport { DEMO_BOOKINGS } from '@withpotter/pages-bookings/dashboard/(bookings)/bookings/_components/demo-data';\nimport {\n Clock,\n CheckCircle2,\n XCircle,\n RefreshCw,\n UserX,\n LogIn,\n} from 'lucide-react';\nimport React from 'react';\nimport { useBookingStatusConfig } from '@withpotter/pages-bookings/dashboard/(bookings)/bookings/_components/booking-constants';\n\n// ─── Status Configuration ────────────────────────────────────────────────────\n\nexport type BookingStatus =\n | 'pending'\n | 'confirmed'\n | 'checked_in'\n | 'in_progress'\n | 'completed'\n | 'cancelled'\n | 'no_show'\n | 'waitlist';\n\n/**\n * Both of these live in `bookings/_components/booking-constants`.\n *\n * They were declared HERE as well, byte for byte — the same eight-status map\n * and the same archetype-aware hook, in two files, imported by two halves of\n * the same feature. That is how the map drifted the first time: one copy\n * painted `pending` amber and `cancelled` grey while the other did not.\n *\n * Re-exported rather than moved, so the six call sites that reach for them\n * through this hook's barrel keep working.\n */\nexport {\n BOOKING_STATUS_CONFIG,\n useBookingStatusConfig,\n} from '@withpotter/pages-bookings/dashboard/(bookings)/bookings/_components/booking-constants';\n/**\n * The same statuses, in this business's words.\n *\n * `checked_in` is one row in the database and four different events in a\n * merchant's day: a guest checking into a room, a ticket holder coming through\n * the door, a table being Served, a takeaway being Ready for Pickup. Every\n * intent config already says which — `orderDisplay.statusLabels` — and both\n * status maps in this folder hardcoded \"Checked In\" for all of them.\n *\n * Labels come from the archetype; glyph and colour stay in the map, because\n * those separate the states rather than name them.\n */\nconst ARCHETYPE_BY_BOOKING_TYPE: Record<string, string> = {\n table: 'dine-in',\n room: 'rent-property',\n event: 'event-tickets',\n appointment: 'take-bookings',\n class: 'take-bookings',\n resource: 'take-bookings',\n};\n\nexport const STATUS_TRANSITIONS: Record<BookingStatus, BookingStatus[]> = {\n pending: ['confirmed', 'cancelled'],\n confirmed: ['checked_in', 'completed', 'cancelled', 'no_show'],\n checked_in: ['completed'],\n in_progress: ['completed'],\n completed: [],\n cancelled: [],\n no_show: [],\n waitlist: ['confirmed', 'cancelled'],\n};\n\n// ─── Helpers ─────────────────────────────────────────────────────────────────\n\nexport function formatFullDate(dateString: string) {\n return new Date(dateString).toLocaleDateString('en-US', {\n weekday: 'long',\n month: 'long',\n day: 'numeric',\n year: 'numeric',\n });\n}\n\nexport function formatTime(time?: string | null) {\n if (!time) return '';\n const [h, m] = time.split(':');\n const hour = parseInt(h, 10);\n const ampm = hour >= 12 ? 'PM' : 'AM';\n const h12 = hour % 12 || 12;\n return `${h12}:${m} ${ampm}`;\n}\n\nexport function formatDateTime(dateString: string) {\n return new Date(dateString).toLocaleDateString('en-US', {\n month: 'short',\n day: 'numeric',\n year: 'numeric',\n hour: 'numeric',\n minute: '2-digit',\n });\n}\n\nexport function useBookingDetailData(bookingId: string) {\n const { tenant } = useAuth();\n const resolvedStatuses = useBookingStatusConfig();\n const { features } = useApiFeatures();\n const formatCurrency = useFormatCurrency();\n const router = useRouter();\n const links = useItemLinks();\n const [updatingStatus, setUpdatingStatus] = useState(false);\n const [showStatusDropdown, setShowStatusDropdown] = useState(false);\n const [showCancelModal, setShowCancelModal] = useState(false);\n const [cancelReason, setCancelReason] = useState('');\n const [showRescheduleModal, setShowRescheduleModal] = useState(false);\n const [rescheduling, setRescheduling] = useState(false);\n const [rescheduleError, setRescheduleError] = useState<string | null>(null);\n const [showRecordPaymentModal, setShowRecordPaymentModal] = useState(false);\n const [recordingPayment, setRecordingPayment] = useState(false);\n const [recordPaymentError, setRecordPaymentError] = useState<string | null>(\n null,\n );\n const [showRefundModal, setShowRefundModal] = useState(false);\n const [refunding, setRefunding] = useState(false);\n const [refundError, setRefundError] = useState<string | null>(null);\n const [showSettleDepositModal, setShowSettleDepositModal] = useState(false);\n const [settlingDeposit, setSettlingDeposit] = useState(false);\n const [settleDepositError, setSettleDepositError] = useState<string | null>(\n null,\n );\n\n /**\n * The list seeds itself under `?demo=1` and this screen never did, so every\n * row in demo led here and 400ed: the seeded ids are `demo-b1`, the route\n * takes a UUID, and the only thing on screen was the API's own words —\n * \"Validation failed (uuid is expected)\".\n */\n const demoActive = useDemoMode();\n const demoBooking = demoActive\n ? (DEMO_BOOKINGS.find((b: BookingItem) => b.id === bookingId) as\n BookingItem | undefined)\n : undefined;\n\n /**\n * A real id, not merely \"not the word new\".\n *\n * `bookingId !== 'new'` let anything else through to a route guarded by\n * ParseUUIDPipe, so a stale link, a typo or a seeded id produced a 400 with\n * the validator's words in it rather than the list this screen falls back to.\n */\n const isUuid =\n /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(\n bookingId,\n );\n const isValidId = isUuid;\n if (!isValidId && !demoBooking && typeof window !== 'undefined') {\n router.replace(links.bookings);\n }\n\n const {\n data: liveBooking,\n isLoading: liveLoading,\n error: queryError,\n refetch,\n } = useApiQuery<BookingItem>(\n ['booking-detail', bookingId],\n (slug) => bookingsApi.get(slug, bookingId),\n { enabled: isValidId && !demoBooking },\n );\n const booking = demoBooking ?? liveBooking;\n const loading = demoBooking ? false : liveLoading;\n\n const memberId = booking?.memberId ?? undefined;\n\n /**\n * What this customer has to spend, asked where the money is taken.\n *\n * Earning is automatic and spending was a separate screen, so a desk taking\n * ₦12,000 had no idea the person was sitting on ₦4,000 of points. Nobody\n * offered, nothing was redeemed, and the balance grew as an unfunded\n * liability. Square and Smile.io both put the balance in front of whoever is\n * settling the bill; this is that.\n */\n const { data: loyaltyBalance, refetch: refetchLoyalty } =\n useApiQuery<LoyaltyBalance | null>(\n ['booking-loyalty-balance', bookingId],\n (slug) =>\n loyaltyApi.getMemberBalance(slug, memberId as string).catch(() => null),\n { enabled: Boolean(memberId) },\n );\n\n const { data: loyaltyPrograms } = useApiQuery(\n ['loyalty-programs'],\n (slug) => loyaltyApi.listPrograms(slug).catch(() => null),\n { enabled: Boolean(memberId) },\n );\n\n // Fetch individual tickets for event bookings\n const isEventBooking = booking?.type === 'event';\n const { data: tickets } = useApiQuery<TicketItem[]>(\n ['booking-tickets', bookingId],\n (slug) => bookingsApi.getTickets(slug, bookingId),\n { enabled: isValidId && isEventBooking, retry: 1 },\n );\n\n // The authoritative money picture (payments + refunds) for refund + display.\n const { data: finance, refetch: refetchFinance } =\n useApiQuery<BookingFinance>(\n ['booking-finance', bookingId],\n (slug) => bookingsApi.getFinance(slug, bookingId),\n { enabled: isValidId && features.bookingManualPayments, retry: 1 },\n );\n\n // Group/split state (participants + who has paid). Backend is live on\n // staging; returns an empty split for non-split bookings. A box without\n // split payments (NEXT_PUBLIC_BOX_HIDE_SPLITS) never asks, so no Group split\n // card is drawn.\n const { data: split } = useApiQuery<SplitBooking>(\n ['booking-split', bookingId],\n (slug) => bookingsApi.getSplit(slug, bookingId),\n { enabled: isValidId && !BOX_HIDE_SPLITS, retry: 1 },\n );\n\n const error = queryError?.message ?? null;\n\n const handleStatusUpdate = async (newStatus: BookingStatus) => {\n if (!tenant?.slug || !booking) return;\n\n if (newStatus === 'cancelled') {\n setShowCancelModal(true);\n setShowStatusDropdown(false);\n return;\n }\n\n setUpdatingStatus(true);\n try {\n switch (newStatus) {\n case 'confirmed':\n await bookingsApi.confirm(tenant.slug, booking.id);\n break;\n case 'completed':\n await bookingsApi.complete(tenant.slug, booking.id);\n break;\n case 'checked_in':\n await bookingsApi.checkIn(tenant.slug, booking.id);\n break;\n case 'no_show':\n await bookingsApi.noShow(tenant.slug, booking.id);\n break;\n default:\n return;\n }\n refetch();\n setShowStatusDropdown(false);\n } catch (err) {\n console.error('Failed to update booking status:', err);\n } finally {\n setUpdatingStatus(false);\n }\n };\n\n const handleCancel = async () => {\n if (!tenant?.slug || !booking) return;\n\n setUpdatingStatus(true);\n try {\n await bookingsApi.cancel(tenant.slug, booking.id, cancelReason);\n refetch();\n setShowCancelModal(false);\n setCancelReason('');\n } catch (err) {\n console.error('Failed to cancel booking:', err);\n } finally {\n setUpdatingStatus(false);\n }\n };\n\n const handleReschedule = async (data: {\n date: string;\n startTime: string;\n endTime?: string;\n resourceId?: string;\n reason?: string;\n }) => {\n if (!tenant?.slug || !booking) return;\n setRescheduling(true);\n setRescheduleError(null);\n try {\n await bookingsApi.reschedule(tenant.slug, booking.id, data);\n refetch();\n setShowRescheduleModal(false);\n } catch (err) {\n setRescheduleError(\n err instanceof Error\n ? err.message\n : 'Could not reschedule. Try another slot.',\n );\n } finally {\n setRescheduling(false);\n }\n };\n\n const handleRecordPayment = async (data: {\n amount: number;\n channel: 'cash' | 'card' | 'bank_transfer';\n note?: string;\n /** Points the customer is spending against this bill, if any. */\n redeemPoints?: number;\n redeemValue?: number;\n }) => {\n if (!tenant?.slug || !booking) return;\n setRecordingPayment(true);\n setRecordPaymentError(null);\n try {\n /**\n * The points first, and in two steps that must happen in this order.\n *\n * Record what they settle before deducting them: if the deduction ran\n * first and the payment then failed, the customer would be short the\n * points and the bill would still be open, which is the one outcome a\n * desk cannot explain to somebody standing in front of them. The other\n * way round, a failure leaves an unspent balance and an unpaid bill —\n * recoverable by trying again.\n */\n if (data.redeemPoints && data.redeemValue && loyaltyBalance) {\n await bookingsApi.recordPayment(tenant.slug, booking.id, {\n amount: data.redeemValue,\n channel: 'loyalty',\n note: `${data.redeemPoints.toLocaleString()} points`,\n });\n await loyaltyApi.adjustPoints(tenant.slug, loyaltyBalance.memberId, {\n points: -data.redeemPoints,\n reason: `Redeemed against booking #${booking.bookingNumber}`,\n });\n }\n\n if (data.amount > 0) {\n await bookingsApi.recordPayment(tenant.slug, booking.id, {\n amount: data.amount,\n channel: data.channel,\n note: data.note,\n });\n }\n\n refetch();\n refetchLoyalty();\n setShowRecordPaymentModal(false);\n } catch (err) {\n setRecordPaymentError(\n err instanceof Error ? err.message : 'Could not record the payment.',\n );\n } finally {\n setRecordingPayment(false);\n }\n };\n\n const handleRefund = async (data: {\n transactionId: string;\n amount: number;\n reason?: string;\n }) => {\n if (!tenant?.slug || !booking) return;\n setRefunding(true);\n setRefundError(null);\n try {\n await bookingsApi.refund(tenant.slug, booking.id, data);\n refetch();\n refetchFinance();\n setShowRefundModal(false);\n } catch (err) {\n setRefundError(\n err instanceof Error ? err.message : 'Could not process the refund.',\n );\n } finally {\n setRefunding(false);\n }\n };\n\n const handleSettleDeposit = async (data: {\n action: 'release' | 'forfeit';\n amount?: number;\n reason?: string;\n }) => {\n if (!tenant?.slug || !booking) return;\n setSettlingDeposit(true);\n setSettleDepositError(null);\n try {\n await bookingsApi.settleDeposit(tenant.slug, booking.id, data);\n refetch();\n refetchFinance();\n setShowSettleDepositModal(false);\n } catch (err) {\n setSettleDepositError(\n err instanceof Error ? err.message : 'Could not settle the deposit.',\n );\n } finally {\n setSettlingDeposit(false);\n }\n };\n\n // Derived values\n const currentStatus = (booking?.status as BookingStatus) || 'pending';\n const rowStatuses = resolvedStatuses(booking?.type);\n const statusConfig = rowStatuses[currentStatus] || rowStatuses.pending;\n const isPaid = booking?.data?.isPaid === true;\n const bookingAmount =\n (booking?.data?.paymentAmount as number) ||\n (booking?.data?.total as number) ||\n booking?.content?.price ||\n 0;\n // The full price of the booking (not the deposit) — bookingAmount above can\n // resolve to a partial paymentAmount, so the money record needs its own total.\n const bookingTotal =\n (booking?.data?.total as number) ||\n booking?.content?.price ||\n (booking?.data?.paymentAmount as number) ||\n 0;\n // How much has actually been collected: the full total when paid, else any\n // deposit taken.\n const paidAmount = isPaid\n ? bookingTotal\n : (booking?.data?.paymentAmount as number) ||\n (booking?.data?.depositAmount as number) ||\n 0;\n const paymentReference = booking?.data?.paymentReference as\n string | undefined;\n const paidAt = booking?.data?.paidAt as string | undefined;\n const allowedTransitions = STATUS_TRANSITIONS[currentStatus] || [];\n const canReschedule =\n currentStatus === 'pending' || currentStatus === 'confirmed';\n const balanceDue = Math.max(0, bookingTotal - paidAmount);\n // Recording a transfer and issuing a refund are the two things a merchant\n // taking bank payments most needs at the desk, and both spent months behind a\n // const because the routes were on develop and not on staging. The API says\n // now, so the buttons appear the day the deploy lands, not the day someone\n // remembers.\n const canRecordPayment = features.bookingManualPayments && balanceDue > 0;\n const canRefund =\n features.bookingManualPayments &&\n !!finance &&\n finance.paid - finance.refunded > 0;\n\n return {\n tenant,\n formatCurrency,\n refetchBooking: refetch,\n booking: booking ?? null,\n tickets: tickets ?? [],\n loading,\n error,\n updatingStatus,\n showStatusDropdown,\n setShowStatusDropdown,\n showCancelModal,\n setShowCancelModal,\n cancelReason,\n setCancelReason,\n handleStatusUpdate,\n handleCancel,\n currentStatus,\n statusConfig,\n isPaid,\n bookingAmount,\n bookingTotal,\n paidAmount,\n paymentReference,\n paidAt,\n allowedTransitions,\n canReschedule,\n showRescheduleModal,\n setShowRescheduleModal,\n rescheduling,\n rescheduleError,\n handleReschedule,\n balanceDue,\n canRecordPayment,\n showRecordPaymentModal,\n setShowRecordPaymentModal,\n recordingPayment,\n recordPaymentError,\n handleRecordPayment,\n loyaltyBalance: loyaltyBalance ?? null,\n loyaltyProgram: loyaltyPrograms?.[0] ?? null,\n finance: finance ?? null,\n split: split ?? null,\n canRefund,\n showRefundModal,\n setShowRefundModal,\n refunding,\n refundError,\n handleRefund,\n // The refundable deposit, read from the money picture rather than the\n // booking row so it always agrees with the transactions behind it.\n securityDeposit: finance?.securityDeposit ?? null,\n depositStatus: finance?.depositStatus ?? null,\n showSettleDepositModal,\n setShowSettleDepositModal,\n settlingDeposit,\n settleDepositError,\n handleSettleDeposit,\n };\n}\n"],"mappings":"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","names":["useBookingStatusConfig"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './_hooks/index.js';
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { Fragment, jsx } from "react/jsx-runtime";
|
|
3
|
+
import { useParams } from "next/navigation";
|
|
4
|
+
import { useAuth } from "@withpotter/lib/auth-context";
|
|
5
|
+
import { useApiQuery } from "@withpotter/hooks/use-api-query";
|
|
6
|
+
import { bookingsApi } from "@withpotter/lib/api/bookings";
|
|
7
|
+
import { IntentScope } from "@withpotter/lib/intents/intent-scope";
|
|
8
|
+
import { INTENTS } from "@withpotter/components/intents";
|
|
9
|
+
import { ownerIntentOfBooking } from "@withpotter/components/intents/item-owner";
|
|
10
|
+
import { scopeLabelsFor } from "@withpotter/components/intents/scope-labels";
|
|
11
|
+
function BookingLayout({ children }) {
|
|
12
|
+
const { bookingId } = useParams();
|
|
13
|
+
const { tenant } = useAuth();
|
|
14
|
+
const { data: booking } = useApiQuery(
|
|
15
|
+
["booking-detail", bookingId],
|
|
16
|
+
(slug) => bookingsApi.get(slug, bookingId),
|
|
17
|
+
{ enabled: Boolean(bookingId && tenant?.slug) }
|
|
18
|
+
);
|
|
19
|
+
const owner = ownerIntentOfBooking(booking?.type, INTENTS);
|
|
20
|
+
if (!owner) return /* @__PURE__ */ jsx(Fragment, { children });
|
|
21
|
+
return /* @__PURE__ */ jsx(
|
|
22
|
+
IntentScope,
|
|
23
|
+
{
|
|
24
|
+
intentKey: owner.key,
|
|
25
|
+
labels: scopeLabelsFor(owner, owner.nav.label),
|
|
26
|
+
children
|
|
27
|
+
}
|
|
28
|
+
);
|
|
29
|
+
}
|
|
30
|
+
export {
|
|
31
|
+
BookingLayout as default
|
|
32
|
+
};
|
|
33
|
+
//# sourceMappingURL=layout.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../src/dashboard/%28bookings%29/bookings/%5BbookingId%5D/layout.tsx"],"sourcesContent":["'use client';\n\nimport { useParams } from 'next/navigation';\nimport type { ReactNode } from 'react';\nimport { useAuth } from '@withpotter/lib/auth-context';\nimport { useApiQuery } from '@withpotter/hooks/use-api-query';\nimport { bookingsApi } from '@withpotter/lib/api/bookings';\nimport { IntentScope } from '@withpotter/lib/intents/intent-scope';\nimport { INTENTS } from '@withpotter/components/intents';\nimport { ownerIntentOfBooking } from '@withpotter/components/intents/item-owner';\nimport { scopeLabelsFor } from '@withpotter/components/intents/scope-labels';\n\n/**\n * A booking's screen, spoken in the words of the intent that took it.\n *\n * A booking says what kind it is (a table, a room, an appointment, an event),\n * and each intent's list declares the kinds it asks for, so the owner is the\n * intent whose list would have shown it. Reservations read as a restaurant's,\n * stays as a rental's. It shares the detail screen's query key, so the booking\n * is fetched once.\n */\nexport default function BookingLayout({ children }: { children: ReactNode }) {\n const { bookingId } = useParams<{ bookingId: string }>();\n const { tenant } = useAuth();\n\n const { data: booking } = useApiQuery(\n ['booking-detail', bookingId],\n (slug) => bookingsApi.get(slug, bookingId),\n { enabled: Boolean(bookingId && tenant?.slug) },\n );\n\n const owner = ownerIntentOfBooking(booking?.type, INTENTS);\n if (!owner) return <>{children}</>;\n\n return (\n <IntentScope\n intentKey={owner.key}\n labels={scopeLabelsFor(owner, owner.nav.label)}\n >\n {children}\n </IntentScope>\n );\n}\n"],"mappings":";AAgCqB;AA9BrB,SAAS,iBAAiB;AAE1B,SAAS,eAAe;AACxB,SAAS,mBAAmB;AAC5B,SAAS,mBAAmB;AAC5B,SAAS,mBAAmB;AAC5B,SAAS,eAAe;AACxB,SAAS,4BAA4B;AACrC,SAAS,sBAAsB;AAWhB,SAAR,cAA+B,EAAE,SAAS,GAA4B;AAC3E,QAAM,EAAE,UAAU,IAAI,UAAiC;AACvD,QAAM,EAAE,OAAO,IAAI,QAAQ;AAE3B,QAAM,EAAE,MAAM,QAAQ,IAAI;AAAA,IACxB,CAAC,kBAAkB,SAAS;AAAA,IAC5B,CAAC,SAAS,YAAY,IAAI,MAAM,SAAS;AAAA,IACzC,EAAE,SAAS,QAAQ,aAAa,QAAQ,IAAI,EAAE;AAAA,EAChD;AAEA,QAAM,QAAQ,qBAAqB,SAAS,MAAM,OAAO;AACzD,MAAI,CAAC,MAAO,QAAO,gCAAG,UAAS;AAE/B,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAW,MAAM;AAAA,MACjB,QAAQ,eAAe,OAAO,MAAM,IAAI,KAAK;AAAA,MAE5C;AAAA;AAAA,EACH;AAEJ;","names":[]}
|