diff --git a/apps/web/components/booking/BookingListItem.tsx b/apps/web/components/booking/BookingListItem.tsx index 11300140e3..a1b80a01d5 100644 --- a/apps/web/components/booking/BookingListItem.tsx +++ b/apps/web/components/booking/BookingListItem.tsx @@ -27,10 +27,6 @@ import type { ActionType } from "@calcom/ui"; import { Badge, Button, - Dialog, - DialogClose, - DialogContent, - DialogFooter, Dropdown, DropdownItem, DropdownMenuCheckboxItem, @@ -43,7 +39,6 @@ import { MeetingTimeInTimezones, showToast, TableActions, - TextAreaField, Tooltip, } from "@calcom/ui"; @@ -75,19 +70,12 @@ function BookingListItem(booking: BookingItemProps) { i18n: { language }, } = useLocale(); const utils = trpc.useUtils(); - const [rejectionReason, setRejectionReason] = useState(""); - const [rejectionDialogIsOpen, setRejectionDialogIsOpen] = useState(false); const [chargeCardDialogIsOpen, setChargeCardDialogIsOpen] = useState(false); const [viewRecordingsDialogIsOpen, setViewRecordingsDialogIsOpen] = useState(false); const cardCharged = booking?.payment[0]?.success; const mutation = trpc.viewer.bookings.confirm.useMutation({ - onSuccess: (data) => { - if (data?.status === BookingStatus.REJECTED) { - setRejectionDialogIsOpen(false); - showToast(t("booking_rejection_success"), "success"); - } else { - showToast(t("booking_confirmation_success"), "success"); - } + onSuccess: () => { + showToast(t("booking_confirmation_success"), "success"); utils.viewer.bookings.invalidate(); }, onError: () => { @@ -122,7 +110,7 @@ function BookingListItem(booking: BookingItemProps) { let body = { bookingId: booking.id, confirmed: confirm, - reason: rejectionReason, + reason: "", }; /** * Only pass down the recurring event id when we need to confirm the entire series, which happens in @@ -145,9 +133,7 @@ function BookingListItem(booking: BookingItemProps) { { id: "reject", label: (isTabRecurring || isTabUnconfirmed) && isRecurring ? t("reject_all") : t("reject"), - onClick: () => { - setRejectionDialogIsOpen(true); - }, + href: `/booking/${booking.uid}?reject=true`, icon: "ban", disabled: mutation.isPending, }, @@ -347,37 +333,6 @@ function BookingListItem(booking: BookingItemProps) { timeFormat={userTimeFormat ?? null} /> )} - {/* NOTE: Should refactor this dialog component as is being rendered multiple times */} - - -
- - {t("rejection_reason")} - (Optional) - - } - value={rejectionReason} - onChange={(e) => setRejectionReason(e.target.value)} - /> -
- - - - - -
-
- diff --git a/apps/web/components/booking/RejectBooking.tsx b/apps/web/components/booking/RejectBooking.tsx new file mode 100644 index 0000000000..8d9b3f32cc --- /dev/null +++ b/apps/web/components/booking/RejectBooking.tsx @@ -0,0 +1,88 @@ +import { useCallback, useState } from "react"; + +import { useLocale } from "@calcom/lib/hooks/useLocale"; +import { trpc } from "@calcom/trpc/react"; +import { Button, TextArea } from "@calcom/ui"; + +type Props = { + booking: { + uid?: string | null; + id: number; + recurringEventId: string | null; + }; + setIsRejectionMode: () => void; +}; + +export default function RejectBooking(props: Props) { + const [rejectionReason, setRejectionReason] = useState(""); + const { t } = useLocale(); + const utils = trpc.useUtils(); + const { booking } = props; + const isRecurring = booking.recurringEventId !== null; + + const mutation = trpc.viewer.bookings.confirm.useMutation({ + onSuccess: () => { + props.setIsRejectionMode(); + utils.viewer.bookings.invalidate(); + }, + onError: () => { + utils.viewer.bookings.invalidate(); + }, + }); + + const bookingConfirm = async (confirm: boolean) => { + let body = { + bookingId: booking.id, + confirmed: confirm, + reason: rejectionReason, + }; + if (isRecurring) { + body = Object.assign({}, body, { recurringEventId: booking.recurringEventId }); + } + mutation.mutate(body); + }; + + const rejectBookingRef = useCallback((node: HTMLTextAreaElement) => { + if (node !== null) { + node.scrollIntoView({ behavior: "smooth" }); + node.focus(); + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + + return ( + <> +
+ +