// Get router variables import { ChevronDownIcon, ChevronUpIcon, ClockIcon, CreditCardIcon, GlobeIcon } from "@heroicons/react/solid"; import * as Collapsible from "@radix-ui/react-collapsible"; import dayjs, { Dayjs } from "dayjs"; import customParseFormat from "dayjs/plugin/customParseFormat"; import utc from "dayjs/plugin/utc"; import { useRouter } from "next/router"; import { useEffect, useMemo, useState } from "react"; import { FormattedNumber, IntlProvider } from "react-intl"; import { asStringOrNull } from "@lib/asStringOrNull"; import { timeZone } from "@lib/clock"; import useTheme from "@lib/hooks/useTheme"; import { isBrandingHidden } from "@lib/isBrandingHidden"; import { collectPageParameters, telemetryEventTypes, useTelemetry } from "@lib/telemetry"; import AvailableTimes from "@components/booking/AvailableTimes"; import DatePicker from "@components/booking/DatePicker"; import TimeOptions from "@components/booking/TimeOptions"; import { HeadSeo } from "@components/seo/head-seo"; import AvatarGroup from "@components/ui/AvatarGroup"; import PoweredByCal from "@components/ui/PoweredByCal"; import { AvailabilityPageProps } from "../../../pages/[user]/[type]"; import { AvailabilityTeamPageProps } from "../../../pages/team/[slug]/[type]"; dayjs.extend(utc); dayjs.extend(customParseFormat); type Props = AvailabilityTeamPageProps | AvailabilityPageProps; const AvailabilityPage = ({ profile, eventType, workingHours }: Props) => { const router = useRouter(); const { rescheduleUid } = router.query; const { isReady } = useTheme(profile.theme); const selectedDate = useMemo(() => { const dateString = asStringOrNull(router.query.date); if (dateString) { // todo some extra validation maybe. const utcOffsetAsDate = dayjs(dateString.substr(11, 14), "Hmm"); const utcOffset = parseInt( dateString.substr(10, 1) + (utcOffsetAsDate.hour() * 60 + utcOffsetAsDate.minute()) ); const date = dayjs(dateString.substr(0, 10)).utcOffset(utcOffset, true); return date.isValid() ? date : null; } return null; }, [router.query.date]); const [isTimeOptionsOpen, setIsTimeOptionsOpen] = useState(false); const [timeFormat, setTimeFormat] = useState("h:mma"); const telemetry = useTelemetry(); useEffect(() => { handleToggle24hClock(localStorage.getItem("timeOption.is24hClock") === "true"); telemetry.withJitsu((jitsu) => jitsu.track(telemetryEventTypes.pageView, collectPageParameters())); }, [telemetry]); const changeDate = (newDate: Dayjs) => { telemetry.withJitsu((jitsu) => jitsu.track(telemetryEventTypes.dateSelected, collectPageParameters())); router.replace( { query: { ...router.query, date: newDate.format("YYYY-MM-DDZZ"), }, }, undefined, { shallow: true, } ); }; const handleSelectTimeZone = (selectedTimeZone: string): void => { if (selectedDate) { changeDate(selectedDate.tz(selectedTimeZone, true)); } timeZone(selectedTimeZone); setIsTimeOptionsOpen(false); }; const handleToggle24hClock = (is24hClock: boolean) => { setTimeFormat(is24hClock ? "HH:mm" : "h:mma"); }; return ( <>
{isReady && (
{/* mobile: details */}
user.name !== profile.name) .map((user) => ({ title: user.name, image: user.avatar, })) )} size={9} truncateAfter={5} />

{profile.name}

{eventType.title}
{eventType.length} minutes
{eventType.price > 0 && (
)}

{eventType.description}

user.name !== profile.name) .map((user) => ({ title: user.name, image: user.avatar, })) )} size={10} truncateAfter={3} />

{profile.name}

{eventType.title}

{eventType.length} minutes

{eventType.price > 0 && (

)}

{eventType.description}

{selectedDate && ( )}
)} {(!eventType.users[0] || !isBrandingHidden(eventType.users[0])) && }
); function TimezoneDropdown() { return ( {timeZone()} {isTimeOptionsOpen ? ( ) : ( )} ); } }; export default AvailabilityPage;