Files
calendar/apps/web/components/dialog/CancelBookingDialog.tsx
T
Eunjae LeeandGitHub 3986d61f40 feat(bookings): improve bookings redesign (#25251)
* use booking.uid instead of booking.id for url param

* show timezone on calendar

* fix type

* restore horizontal tab and remove header and subtitle

* clean up sidebar items

* fix event propagation from attendees

* fetch all statuses except for cancelled on calendar view

* clean up styles of the badges on BookingListItem

* fix useMediaQuery

* add close button to the header

* add assignment reason to the details sheet

* use separator row

* use ToggleGroup for the top bookings tab

* move ViewToggleButton

* resize the action button

* remove wrong prop

* fix type error

* fix type error

* hide view toggle button on mobile (and fix the breakpoint)

* remove unused e2e tests

* fix e2e tests

* hide toggle button when feature flag is off

* update skeleton

* improve attendees on booking list item and slide over

* improve attendee dropdown

* fix type error

* move query to containers

* select attendee email

* infinite fetching for calendar view

* update styles

* fix compatibility

* fix: add backward compatibility for status field in getAllUserBookings

* increase calendar height

* fix type error

* support Member filter only for admin / owners

* add debug log (TEMP)

* add event border color

* show Reject / Accept buttons on BookingDetailsSheet

* move description section to the top

* update When section

* update style of Who section

* add CancelBookingDialog WIP

* fix CancelBookingDialog

* increase clickable area

* add schedule info section WIP

* fix flaky reject button

* fixing reschedule info WIP

* add fromReschedule index to Booking

* improve rescheduled information

* improve reassignment

* fix type error

* fix unit test

* respect user's weekStart value on the booking calendar view

* update debug log

* improve payment section

* clean up

* fix log message

* reposition filters on list view

* fix bookings controller api2 e2e test

* clean up file by extracting logic into custom hooks

* rename files

* merge BookingCalendar into its container

* extract logic into separate hook files

* remove redundant logic

* rearrange items on calendar view

* add WeekPicker

* extract filter button

* responsive header on list view

* horizontal scroll for ToggleGroup WIP

* fix type error

* fix cancelling recurring event

* address feedback

* fix e2e tests

* fix unit test

* fix e2e tests

* make hover style more visible for ToggleGroup

* fix margin on CancelBookingDialog

* update styles on the slide over (mostly font weight)

* update style of CancelBookingDialog

* update styles

* update margin top for the header

* refactor getBookingDetails handler

* fix gap in who section

* auto-filter the current user on the calendar view

* calculate calendar height considering top banners

* improve booking details sheet interaction without overlay

* update calendar event styles

* update reject dialog style

* put uid first in the query params

* fix class name

* memoize functions in useMediaQuery

* query attendee with id instead of email

* update margins

* replace TRPCError with ErrorWithCode

* move calculation outside loop

* remove dead code
2025-12-10 13:40:04 +00:00

123 lines
3.4 KiB
TypeScript

import type { Dispatch, SetStateAction } from "react";
import { Dialog } from "@calcom/features/components/controlled-dialog";
import { useLocale } from "@calcom/lib/hooks/useLocale";
import { trpc } from "@calcom/trpc/react";
import type { RecurringEvent } from "@calcom/types/Calendar";
import { DialogContent, DialogHeader } from "@calcom/ui/components/dialog";
import { showToast } from "@calcom/ui/components/toast";
import CancelBooking from "@components/booking/CancelBooking";
interface ICancelBookingDialog {
isOpenDialog: boolean;
setIsOpenDialog: Dispatch<SetStateAction<boolean>>;
booking: {
uid: string;
id: number;
title: string;
startTime: Date;
payment?: {
amount: number;
currency: string;
success: boolean;
paymentOption?: string | null;
appId?: string | null;
refunded?: boolean;
}[];
};
profile: {
name: string | null;
slug: string | null;
};
recurringEvent: RecurringEvent | null;
team?: string | null;
teamId?: number;
allRemainingBookings?: boolean;
seatReferenceUid?: string;
currentUserEmail?: string;
bookingCancelledEventProps: {
booking: unknown;
organizer: {
name: string;
email: string;
timeZone?: string;
};
eventType: unknown;
};
isHost: boolean;
internalNotePresets?: { id: number; name: string; cancellationReason: string | null }[];
eventTypeMetadata?: Record<string, unknown> | null;
}
export const CancelBookingDialog = (props: ICancelBookingDialog) => {
const { t } = useLocale();
const {
isOpenDialog,
setIsOpenDialog,
booking,
profile,
recurringEvent,
team,
teamId,
allRemainingBookings = false,
seatReferenceUid,
currentUserEmail,
bookingCancelledEventProps,
isHost,
internalNotePresets = [],
eventTypeMetadata,
} = props;
const utils = trpc.useUtils();
// Get the first payment if it exists and map to expected format
const payment =
booking.payment && booking.payment.length > 0
? {
amount: booking.payment[0].amount,
currency: booking.payment[0].currency,
appId: booking.payment[0].appId || null,
}
: null;
const handleCanceled = () => {
utils.viewer.bookings.invalidate();
showToast(t("booking_cancelled"), "success");
setIsOpenDialog(false);
};
return (
<Dialog open={isOpenDialog} onOpenChange={setIsOpenDialog}>
<DialogContent enableOverflow data-testid="cancel-dialog">
<DialogHeader title={allRemainingBookings ? t("cancel_all_remaining") : t("cancel_event")} />
<CancelBooking
renderContext="dialog"
booking={{
uid: booking.uid,
id: booking.id,
title: booking.title,
startTime: booking.startTime,
payment: payment,
}}
profile={profile}
recurringEvent={recurringEvent}
team={team}
teamId={teamId}
setIsCancellationMode={setIsOpenDialog}
theme={null}
allRemainingBookings={allRemainingBookings}
seatReferenceUid={seatReferenceUid}
currentUserEmail={currentUserEmail}
bookingCancelledEventProps={bookingCancelledEventProps}
isHost={isHost}
internalNotePresets={internalNotePresets}
eventTypeMetadata={eventTypeMetadata}
showErrorAsToast={true}
onCanceled={handleCanceled}
/>
</DialogContent>
</Dialog>
);
};