diff --git a/apps/web/components/booking/AvailableTimes.tsx b/apps/web/components/booking/AvailableTimes.tsx index 03904f3d10..1a8d73185a 100644 --- a/apps/web/components/booking/AvailableTimes.tsx +++ b/apps/web/components/booking/AvailableTimes.tsx @@ -16,7 +16,7 @@ type AvailableTimesProps = { eventTypeId: number; recurringCount: number | undefined; eventTypeSlug: string; - date: Dayjs; + date?: Dayjs; seatsPerTimeSlot?: number | null; slots?: Slot[]; isLoading: boolean; @@ -44,8 +44,10 @@ const AvailableTimes: FC = ({ setBrand(getComputedStyle(document.documentElement).getPropertyValue("--brand-color").trim()); }, []); + if (!date) return null; + return ( -
+
{nameOfDay(i18n.language, Number(date.format("d")))} @@ -150,4 +152,6 @@ const AvailableTimes: FC = ({ ); }; +AvailableTimes.displayName = "AvailableTimes"; + export default AvailableTimes; diff --git a/apps/web/components/booking/pages/AvailabilityPage.tsx b/apps/web/components/booking/pages/AvailabilityPage.tsx index 4fdc09a81f..c1a4219d14 100644 --- a/apps/web/components/booking/pages/AvailabilityPage.tsx +++ b/apps/web/components/booking/pages/AvailabilityPage.tsx @@ -1,10 +1,11 @@ // Get router variables +import autoAnimate from "@formkit/auto-animate"; import { EventType } from "@prisma/client"; import { SchedulingType } from "@prisma/client"; import * as Popover from "@radix-ui/react-popover"; import { TFunction } from "next-i18next"; import { useRouter } from "next/router"; -import { useReducer, useEffect, useMemo, useState } from "react"; +import { useReducer, useEffect, useMemo, useState, useRef } from "react"; import { Toaster } from "react-hot-toast"; import { FormattedNumber, IntlProvider } from "react-intl"; import { z } from "zod"; @@ -128,6 +129,11 @@ const SlotPicker = ({ const { date, setQuery: setDate } = useRouterQuery("date"); const { month, setQuery: setMonth } = useRouterQuery("month"); const router = useRouter(); + const slotPickerRef = useRef(null); + + useEffect(() => { + slotPickerRef.current && autoAnimate(slotPickerRef.current); + }, [slotPickerRef]); useEffect(() => { if (!router.isReady) return; @@ -175,10 +181,8 @@ const SlotPicker = ({ slots[k].length > 0)} locale={isLocaleReady ? i18n.language : "en"} @@ -193,10 +197,10 @@ const SlotPicker = ({ weekStart={weekStart} /> - {selectedDate && ( +
- )} +
); }; @@ -317,7 +321,6 @@ const AvailabilityPage = ({ profile, eventType }: Props) => { const [timeZone, setTimeZone] = useState(); const [timeFormat, setTimeFormat] = useState(timeFormatFromProfile || detectBrowserTimeFormat); - const [isAvailableTimesVisible, setIsAvailableTimesVisible] = useState(); const [gateState, gateDispatcher] = useReducer( (state: GateState, newState: Partial) => ({ ...state, @@ -330,10 +333,6 @@ const AvailabilityPage = ({ profile, eventType }: Props) => { setTimeZone(localStorageTimeZone() || dayjs.tz.guess()); }, []); - useEffect(() => { - setIsAvailableTimesVisible(!!query.date); - }, [query.date]); - // TODO: Improve this; useExposePlanGlobally(eventType.users.length === 1 ? eventType.users[0].plan : "PRO"); @@ -352,14 +351,7 @@ const AvailabilityPage = ({ profile, eventType }: Props) => { // get dynamic user list here const userList = eventType.users ? eventType.users.map((user) => user.username).filter(notEmpty) : []; - // Recurring event sidebar requires more space - const maxWidth = isAvailableTimesVisible - ? recurringEventCount - ? "max-w-6xl" - : "max-w-5xl" - : recurringEventCount - ? "max-w-4xl" - : "max-w-3xl"; + const timezoneDropdown = useMemo( () => ( {
-
- {/* mobile: details */} -
-
- -
-
-

- {profile.name} -

-

- {eventType.title} -

-
- {eventType?.description && ( -
-
- -
- +
+
+
+
+ +

+ {profile.name} +

+

+ {eventType.title} +

+
+ {eventType?.description && ( +
+
+
- )} - {eventType?.requiresConfirmation && ( -

- - {t("requires_confirmation")} -

- )} - -

- - {eventType.length} {t("minutes")} + +

+ )} + {eventType?.requiresConfirmation && ( +
+
+ +
+ {t("requires_confirmation")} +
+ )} + +

+ + {eventType.length} {t("minutes")} +

+ {!rescheduleUid && eventType.recurringEvent && ( +
+ +
+

+ {getRecurringFreq({ t, recurringEvent: eventType.recurringEvent })} +

+ { + setRecurringEventCount(parseInt(event?.target.value)); + }} + /> +

+ {t("occurrence", { + count: recurringEventCount, + })} +

+
+
+ )} + {eventType.price > 0 && ( +

+ + + +

- {eventType.price > 0 && ( -
- - - - -
- )} - {!rescheduleUid && eventType.recurringEvent && ( -
- -
-

- {getRecurringFreq({ t, recurringEvent: eventType.recurringEvent })} -

- { - setRecurringEventCount(parseInt(event?.target.value)); - }} - /> -

- {t("occurrence", { - count: recurringEventCount, - })} -

-
-
- )} - {timezoneDropdown} - -
- {/* Temp disabled booking?.startTime && rescheduleUid && ( -
-

- {t("former_time")} -

-

- - {typeof booking.startTime === "string" && - parseDate(dayjs(booking.startTime), i18n)} -

-
- )*/} -
-
+ )} + {timezoneDropdown}
-
-
-
-
- -
+ {(!eventType.users[0] || !isBrandingHidden(eventType.users[0])) && !isEmbed && }
- {(!eventType.users[0] || !isBrandingHidden(eventType.users[0])) && !isEmbed && }