Fix: hydration error /booking/[uid] (#7732)

pull/7324/head
Nafees Nazik 2023-03-16 01:37:35 +05:30 committed by GitHub
parent 3924731266
commit a57519040e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 42 additions and 31 deletions

View File

@ -1,5 +1,5 @@
import { useRouter } from "next/router";
import { useState } from "react";
import { useCallback, useState } from "react";
import { useLocale } from "@calcom/lib/hooks/useLocale";
import useTheme from "@calcom/lib/hooks/useTheme";
@ -36,6 +36,13 @@ export default function CancelBooking(props: Props) {
const [error, setError] = useState<string | null>(booking ? null : t("booking_already_cancelled"));
useTheme(props.theme);
const cancelBookingRef = useCallback((node: HTMLTextAreaElement) => {
if (node !== null) {
node.scrollIntoView({ behavior: "smooth" });
node.focus();
}
// eslint-disable-next-line react-hooks/exhaustive-deps
}, []);
return (
<>
{error && (
@ -54,6 +61,7 @@ export default function CancelBooking(props: Props) {
<div className="mt-5 sm:mt-6">
<label className="text-bookingdark font-medium dark:text-white">{t("cancellation_reason")}</label>
<TextArea
ref={cancelBookingRef}
placeholder={t("cancellation_reason_placeholder")}
value={cancellationReason}
onChange={(e) => setCancellationReason(e.target.value)}

View File

@ -47,7 +47,7 @@ import prisma from "@calcom/prisma";
import type { Prisma } from "@calcom/prisma/client";
import { bookingMetadataSchema } from "@calcom/prisma/zod-utils";
import { customInputSchema, EventTypeMetaDataSchema } from "@calcom/prisma/zod-utils";
import { Badge, Button, EmailInput, HeadSeo } from "@calcom/ui";
import { Button, EmailInput, HeadSeo, Badge } from "@calcom/ui";
import { FiX, FiExternalLink, FiChevronLeft, FiCheck, FiCalendar } from "@calcom/ui/components/icon";
import { timeZone } from "@lib/clock";
@ -199,9 +199,6 @@ export default function Success(props: SuccessProps) {
seatReferenceUid,
} = querySchema.parse(router.query);
if ((isCancellationMode || changes) && typeof window !== "undefined") {
window.scrollTo(0, document.body.scrollHeight);
}
const tz =
(isSuccessBookingPage
? props.bookingInfo.attendees.find((attendee) => attendee.email === email)?.timeZone
@ -213,10 +210,6 @@ export default function Success(props: SuccessProps) {
props?.bookingInfo?.metadata || {}
)?.videoCallUrl;
if (!location) {
// Can't use logger.error because it throws error on client. stdout isn't available to it.
console.error(`No location found `);
}
const status = props.bookingInfo?.status;
const reschedule = props.bookingInfo.status === BookingStatus.ACCEPTED;
const cancellationReason = props.bookingInfo.cancellationReason || props.bookingInfo.rejectionReason;
@ -239,12 +232,24 @@ export default function Success(props: SuccessProps) {
const [calculatedDuration, setCalculatedDuration] = useState<number | undefined>(undefined);
function setIsCancellationMode(value: boolean) {
if (value) router.query.cancel = "true";
else delete router.query.cancel;
router.replace({
pathname: router.pathname,
query: { ...router.query },
});
const query_ = { ...router.query };
if (value) {
query_.cancel = "true";
} else {
if (query_.cancel) {
delete query_.cancel;
}
}
router.replace(
{
pathname: router.pathname,
query: { ...query_ },
},
undefined,
{ scroll: false }
);
}
const eventNameObject = {
@ -514,23 +519,21 @@ export default function Success(props: SuccessProps) {
<>
<div className="font-medium">{t("who")}</div>
<div className="col-span-2 last:mb-0">
<>
{bookingInfo?.user && (
<div className="mb-3">
<p>
<span className="mr-2">{bookingInfo.user.name}</span>
<Badge variant="blue">{t("Host")}</Badge>
</p>
<p className="text-bookinglight">{bookingInfo.user.email}</p>
{bookingInfo?.user && (
<div className="mb-3">
<div>
<span className="mr-2">{bookingInfo.user.name}</span>
<Badge variant="blue">{t("Host")}</Badge>
</div>
)}
{bookingInfo?.attendees.map((attendee) => (
<div key={attendee.name} className="mb-3 last:mb-0">
{attendee.name && <p>{attendee.name}</p>}
<p className="text-bookinglight">{attendee.email}</p>
</div>
))}
</>
<p className="text-bookinglight">{bookingInfo.user.email}</p>
</div>
)}
{bookingInfo?.attendees.map((attendee) => (
<div key={attendee.name} className="mb-3 last:mb-0">
{attendee.name && <p>{attendee.name}</p>}
<p className="text-bookinglight">{attendee.email}</p>
</div>
))}
</div>
</>
)}