Booking tools

This commit is contained in:
Jose Selesan
2026-05-06 15:31:02 -03:00
parent b97eb9c8a4
commit 01688cf042
5 changed files with 341 additions and 15 deletions

View File

@@ -57,12 +57,14 @@ interface BookingContextValue {
summary: BookingSummary;
currentTime: string | null;
selectedSlot: BookingSlotDraft | null;
selectedSegment: BookingTimelineSegment | null;
isLoading: boolean;
isError: boolean;
errorMessage: string | null;
isCreateBookingOpen: boolean;
createBookingError: string | null;
isCreatingBooking: boolean;
bookingToolsOpen: boolean;
setSelectedDate: (date: string) => void;
moveSelectedDate: (amount: number) => void;
setSelectedSportId: (sportId: string) => void;
@@ -72,8 +74,10 @@ interface BookingContextValue {
openCreateBooking: (draft?: Partial<BookingSlotDraft>) => void;
closeCreateBooking: () => void;
createBooking: (payload: CreateManualBookingPayload) => Promise<void>;
updateBookingStatus: (bookingId: string, status: 'CANCELLED' | 'COMPLETED') => void;
updateBookingStatus: (bookingId: string, status: 'CANCELLED' | 'COMPLETED' | 'NOSHOW') => void;
exportDayReport: () => void;
openBookingTools: (segment?: BookingTimelineSegment) => void;
closeBookingTools: () => void;
}
const BookingContext = createContext<BookingContextValue | null>(null);
@@ -230,6 +234,8 @@ export function BookingProvider({ children, complex }: BookingProviderProps) {
const [visibleTimeRange, setVisibleTimeRange] = useState(DEFAULT_TIME_RANGE);
const [selectedSlot, setSelectedSlot] = useState<BookingSlotDraft | null>(null);
const [isCreateBookingOpen, setIsCreateBookingOpen] = useState(false);
const [selectedSegment, setSelectedSegment] = useState<BookingTimelineSegment | null>(null);
const [bookingToolsOpen, setBookingToolsOpen] = useState(false);
const courtsQuery = useQuery({
queryKey: ['courts', complex.id],
@@ -249,7 +255,7 @@ export function BookingProvider({ children, complex }: BookingProviderProps) {
[bookingsQuery.data?.bookings, selectedDate]
);
const courts = useMemo(() => courtsQuery.data ?? [], [courtsQuery.data]);
const courts = useMemo(() => courtsQuery.data?.sort((a, b) => a.name.localeCompare(b.name)) ?? [], [courtsQuery.data]);
const filteredCourts = useMemo(() => {
if (selectedSportId === 'all') return courts;
@@ -315,7 +321,7 @@ export function BookingProvider({ children, complex }: BookingProviderProps) {
});
const updateStatusMutation = useMutation({
mutationFn: (payload: { bookingId: string; status: 'CANCELLED' | 'COMPLETED' }) =>
mutationFn: (payload: { bookingId: string; status: 'CANCELLED' | 'COMPLETED' | 'NOSHOW' }) =>
apiClient.adminBookings.updateStatus(payload.bookingId, { status: payload.status }),
onSuccess: async () => {
await queryClient.invalidateQueries({ queryKey: ['admin-bookings', complex.id] });
@@ -335,6 +341,15 @@ export function BookingProvider({ children, complex }: BookingProviderProps) {
[selectedDate]
);
const openBookingTools = useCallback(
(segment?: BookingTimelineSegment) => {
setSelectedSegment(segment ?? null);
setBookingToolsOpen(true);
console.log(JSON.stringify(segment, null, 2))
}, [selectedDate]);
const closeBookingTools = () => setBookingToolsOpen(false)
useEffect(() => {
const handleOpenCreateBooking = () => {
openCreateBooking();
@@ -361,7 +376,7 @@ export function BookingProvider({ children, complex }: BookingProviderProps) {
);
const updateBookingStatus = useCallback(
(bookingId: string, status: 'CANCELLED' | 'COMPLETED') => {
(bookingId: string, status: 'CANCELLED' | 'COMPLETED' | 'NOSHOW') => {
updateStatusMutation.mutate({ bookingId, status });
},
[updateStatusMutation]
@@ -431,6 +446,10 @@ export function BookingProvider({ children, complex }: BookingProviderProps) {
createBooking,
updateBookingStatus,
exportDayReport,
bookingToolsOpen,
openBookingTools,
closeBookingTools,
selectedSegment
}),
[
bookings,
@@ -461,6 +480,7 @@ export function BookingProvider({ children, complex }: BookingProviderProps) {
updateBookingStatus,
viewMode,
visibleTimeRange,
bookingToolsOpen
]
);