+7
![kodiakhq[bot] <49736102+kodiakhq[bot]@users.noreply.github.com>](/assets/img/avatar_default.png)

![kodiakhq[bot] <49736102+kodiakhq[bot]@users.noreply.github.com>](/assets/img/avatar_default.png)



![depfu[bot] <23717796+depfu[bot]@users.noreply.github.com>](/assets/img/avatar_default.png)


Carina Wollendorfer
GitHub
depfu[bot] <23717796+depfu[bot]@users.noreply.github.com>
zomars
CarinaWolli
Agusti Fernandez Pardo
kodiakhq[bot] <49736102+kodiakhq[bot]@users.noreply.github.com>
Bailey Pumfleet
kodiakhq[bot] <49736102+kodiakhq[bot]@users.noreply.github.com>
Alex van Andel
depfu[bot] <23717796+depfu[bot]@users.noreply.github.com>
sean-brydon
Hariom Balhara
Joe Au-Yeung
iamkun
Agusti Fernandez Pardo
kodiakhq[bot] <49736102+kodiakhq[bot]@users.noreply.github.com>
4b6c701c48
* move custom inputs from description to own json object * show custom inputs on success page * fix type error * add custom inputs to email and webhook * add custom inputs to all emails * add values for custom inputs when rescheduling * add custom input everywhere description is shown * fix bug with boolean value * fix issues with null values * disable custom inputs and add notes for organizer * don't show custom input with empty string * don't show custom inputs with empty string in calender event and email * add link to booking details page * redirect to success page to see booking details * add functionality to cancel and reschedule booking * fix bookings that require confirmation * clean code * fix infinite lopp in useEffect of success page * show web conference details message when integration as location * improve design of cancelling event * clean code * disable darkmode for organizer on booking details page * fix dark mode for cancelling booking * fix build error * Fixes infinite loop * Fixes infinite loop * Fixes infinite loop * Update all Yarn dependencies (2022-05-16) (#2769) * Update all Yarn dependencies (2022-05-16) * Upgrade dependencies * Removes deprecated packages * Upgrades deps * Updates submodules * Update yarn.lock * Linting * Linting * Update website * Build fixes * TODO: fix this * Module resolving * Type fixes * Intercom fixes on SSG * Fixes infinite loop * Upgrades to React 18 * Type fixes * Locks node version to 14 * Upgrades daily-js * Readds missing types * Upgrades playwright * Noop when intercom is not installed * Update website * Removed yarn.lock in favor of monorepo Co-authored-by: depfu[bot] <23717796+depfu[bot]@users.noreply.github.com> Co-authored-by: zomars <zomars@me.com> * Create ci.yml * Update ci.yml * Reintroduces typescript-eslint Buckle up! * Type fixes * Update ci.yml * Update api * Update admin * Reusable inferSSRProps * Linting * Linting * Prisma fixes * Update ci.yml * Cache testing * Update e2e.yml * Update DatePicker.tsx * Update e2e.yml * Revert "Linting" This reverts commitadf817766e. * Revert "Linting" This reverts commit1b59dacd64. * Linting * Update e2e.yml * Ci updates * Add team Id to hash url (#2803) * Fix missing tabs - Embed (#2804) * Fix missing tabs * Fix Eslint error * Fix Eslint errors * Add import statement (#2812) * Add import statement * Update apps/docs/next.config.js Co-authored-by: Omar López <zomars@me.com> * Show success page if booking was deleted on calendar (#2808) * Add exception to 410 * Fix type error * Add GoogelCalError type * only show invite link for app.cal.dev (#2807) Co-authored-by: CarinaWolli <wollencarina@gmail.com> Co-authored-by: Omar López <zomars@me.com> * fix: update eslint config to test .ts and .js separately (#2805) * fix: update eslint config * fix: update ts ignore * fix: update eslint config * Update TeamAvailabilityScreen.tsx * Type fixes * Update useIntercom.ts Co-authored-by: Omar López <zomars@me.com> * fix: sync api to latest commit (#2810) Co-authored-by: Agusti Fernandez Pardo <git@agusti.me> Co-authored-by: kodiakhq[bot] <49736102+kodiakhq[bot]@users.noreply.github.com> * Embed React improvements (#2782) * Add off support. Add getApi export. * Add publish command * Add embed-snippet in prod deps * Update README * Update package.json Co-authored-by: Bailey Pumfleet <pumfleet@hey.com> Co-authored-by: zomars <zomars@me.com> Co-authored-by: kodiakhq[bot] <49736102+kodiakhq[bot]@users.noreply.github.com> * Consolidates test-results * Type fixes * Abstracts minimal booking select * Type fixes * Update listBookings.ts * Update common.json * Update bookingReminder.ts * Consolidates isOutOfBounds * Update webhookResponse-chromium.txt * Update TableActions.tsx * Type fixes * Update BookingPage.tsx * Update webhookResponse-chromium.txt Co-authored-by: CarinaWolli <wollencarina@gmail.com> Co-authored-by: Alex van Andel <me@alexvanandel.com> Co-authored-by: Bailey Pumfleet <pumfleet@hey.com> Co-authored-by: zomars <zomars@me.com> Co-authored-by: depfu[bot] <23717796+depfu[bot]@users.noreply.github.com> Co-authored-by: sean-brydon <55134778+sean-brydon@users.noreply.github.com> Co-authored-by: Hariom Balhara <hariombalhara@gmail.com> Co-authored-by: Joe Au-Yeung <65426560+joeauyeung@users.noreply.github.com> Co-authored-by: iamkun <kunhello@outlook.com> Co-authored-by: Agusti Fernandez Pardo <me@agusti.me> Co-authored-by: Agusti Fernandez Pardo <git@agusti.me> Co-authored-by: kodiakhq[bot] <49736102+kodiakhq[bot]@users.noreply.github.com>
120 lines
4.1 KiB
TypeScript
120 lines
4.1 KiB
TypeScript
import { XIcon } from "@heroicons/react/solid";
|
|
import { useRouter } from "next/router";
|
|
import { useState } from "react";
|
|
|
|
import { useLocale } from "@calcom/lib/hooks/useLocale";
|
|
import { Button } from "@calcom/ui/Button";
|
|
|
|
import useTheme from "@lib/hooks/useTheme";
|
|
import { collectPageParameters, telemetryEventTypes, useTelemetry } from "@lib/telemetry";
|
|
|
|
type Props = {
|
|
booking: {
|
|
title?: string;
|
|
uid?: string;
|
|
};
|
|
profile: {
|
|
name: string | null;
|
|
slug: string | null;
|
|
};
|
|
team?: string | null;
|
|
setIsCancellationMode: (value: boolean) => void;
|
|
theme: string | null;
|
|
};
|
|
|
|
export default function CancelBooking(props: Props) {
|
|
const [cancellationReason, setCancellationReason] = useState<string>("");
|
|
const { t } = useLocale();
|
|
const router = useRouter();
|
|
const { booking, profile, team } = props;
|
|
const [loading, setLoading] = useState(false);
|
|
const telemetry = useTelemetry();
|
|
const [error, setError] = useState<string | null>(booking ? null : t("booking_already_cancelled"));
|
|
const { isReady, Theme } = useTheme(props.theme);
|
|
|
|
if (isReady) {
|
|
return (
|
|
<>
|
|
<Theme />
|
|
{error && (
|
|
<div>
|
|
<div className="mx-auto flex h-12 w-12 items-center justify-center rounded-full bg-red-100">
|
|
<XIcon className="h-6 w-6 text-red-600" />
|
|
</div>
|
|
<div className="mt-3 text-center sm:mt-5">
|
|
<h3 className="text-lg font-medium leading-6 text-gray-900" id="modal-title">
|
|
{error}
|
|
</h3>
|
|
</div>
|
|
</div>
|
|
)}
|
|
{!error && (
|
|
<div className="mt-5 sm:mt-6">
|
|
<label className="text-bookingdark font-medium dark:text-white">{t("cancellation_reason")}</label>
|
|
<textarea
|
|
placeholder={t("cancellation_reason_placeholder")}
|
|
value={cancellationReason}
|
|
onChange={(e) => setCancellationReason(e.target.value)}
|
|
className="mt-2 mb-3 w-full dark:border-gray-900 dark:bg-gray-700 dark:text-white sm:mb-3 "
|
|
rows={3}
|
|
/>
|
|
<div className="flex rtl:space-x-reverse">
|
|
<div className="w-full">
|
|
<Button color="secondary" onClick={() => router.push("/reschedule/" + booking?.uid)}>
|
|
{t("reschedule_this")}
|
|
</Button>
|
|
</div>
|
|
<div className="w-full space-x-2 text-right">
|
|
<Button color="secondary" onClick={() => props.setIsCancellationMode(false)}>
|
|
{t("nevermind")}
|
|
</Button>
|
|
<Button
|
|
data-testid="cancel"
|
|
onClick={async () => {
|
|
setLoading(true);
|
|
|
|
const payload = {
|
|
uid: booking?.uid,
|
|
reason: cancellationReason,
|
|
};
|
|
|
|
telemetry.withJitsu((jitsu) =>
|
|
jitsu.track(telemetryEventTypes.bookingCancelled, collectPageParameters())
|
|
);
|
|
|
|
const res = await fetch("/api/cancel", {
|
|
body: JSON.stringify(payload),
|
|
headers: {
|
|
"Content-Type": "application/json",
|
|
},
|
|
method: "DELETE",
|
|
});
|
|
|
|
if (res.status >= 200 && res.status < 300) {
|
|
await router.push(
|
|
`/cancel/success?name=${props.profile.name}&title=${booking?.title}&eventPage=${
|
|
profile.slug
|
|
}&team=${team ? 1 : 0}`
|
|
);
|
|
} else {
|
|
setLoading(false);
|
|
setError(
|
|
`${t("error_with_status_code_occured", { status: res.status })} ${t(
|
|
"please_try_again"
|
|
)}`
|
|
);
|
|
}
|
|
}}
|
|
loading={loading}>
|
|
{t("cancel_event")}
|
|
</Button>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
)}
|
|
</>
|
|
);
|
|
}
|
|
return <></>;
|
|
}
|