From 793351fe96f8bef29bae04ed24cadd9c0b7bcfa9 Mon Sep 17 00:00:00 2001 From: Femi Odugbesan Date: Tue, 13 Jul 2021 11:10:22 -0500 Subject: [PATCH] [cal-184] add and handle date query params for event types (#359) --- components/booking/DatePicker.tsx | 11 ++++++++-- pages/[user]/[type].tsx | 35 +++++++++++++++++++++++++++---- 2 files changed, 40 insertions(+), 6 deletions(-) diff --git a/components/booking/DatePicker.tsx b/components/booking/DatePicker.tsx index 62907e1603..ff28095c2a 100644 --- a/components/booking/DatePicker.tsx +++ b/components/booking/DatePicker.tsx @@ -15,12 +15,19 @@ const DatePicker = ({ organizerTimeZone, inviteeTimeZone, eventLength, + date, }) => { const [calendar, setCalendar] = useState([]); - const [selectedMonth, setSelectedMonth]: number = useState(); - const [selectedDate, setSelectedDate]: Dayjs = useState(); + const [selectedMonth, setSelectedMonth] = useState(); + const [selectedDate, setSelectedDate] = useState(); useEffect(() => { + if (date) { + setSelectedDate(dayjs(date).tz(inviteeTimeZone)); + setSelectedMonth(dayjs(date).tz(inviteeTimeZone).month()); + return; + } + setSelectedMonth(dayjs().tz(inviteeTimeZone).month()); }, []); diff --git a/pages/[user]/[type].tsx b/pages/[user]/[type].tsx index 9716a3d52f..8c9c97b135 100644 --- a/pages/[user]/[type].tsx +++ b/pages/[user]/[type].tsx @@ -1,9 +1,9 @@ import { useEffect, useState } from "react"; -import { GetServerSideProps } from "next"; +import { GetServerSideProps, GetServerSidePropsContext } from "next"; import Head from "next/head"; import { ChevronDownIcon, ClockIcon, GlobeIcon } from "@heroicons/react/solid"; import { useRouter } from "next/router"; -import { Dayjs } from "dayjs"; +import dayjs, { Dayjs } from "dayjs"; import prisma, { whereAndSelect } from "@lib/prisma"; import { collectPageParameters, telemetryEventTypes, useTelemetry } from "../../lib/telemetry"; @@ -22,7 +22,9 @@ export default function Type(props): Type { const { isReady } = Theme(props.user.theme); - const [selectedDate, setSelectedDate] = useState(); + const [selectedDate, setSelectedDate] = useState(() => { + return props.date && dayjs(props.date).isValid() ? dayjs(props.date) : null; + }); const [isTimeOptionsOpen, setIsTimeOptionsOpen] = useState(false); const [timeFormat, setTimeFormat] = useState("h:mma"); const telemetry = useTelemetry(); @@ -37,6 +39,26 @@ export default function Type(props): Type { setSelectedDate(date); }; + useEffect(() => { + if (!selectedDate) { + return; + } + + const formattedDate = selectedDate.utc().format("YYYY-MM-DD"); + + router.replace( + { + query: { + date: formattedDate, + }, + }, + undefined, + { + shallow: true, + } + ); + }, [selectedDate]); + const handleSelectTimeZone = (selectedTimeZone: string): void => { if (selectedDate) { setSelectedDate(selectedDate.tz(selectedTimeZone)); @@ -133,6 +155,7 @@ export default function Type(props): Type {

{props.eventType.description}

{ +export const getServerSideProps: GetServerSideProps = async (context: GetServerSidePropsContext) => { + const dateQuery = context.query?.date ?? null; + const date = Array.isArray(dateQuery) && dateQuery.length > 0 ? dateQuery.pop() : dateQuery; + const user = await whereAndSelect( prisma.user.findFirst, { @@ -226,6 +252,7 @@ export const getServerSideProps: GetServerSideProps = async (context) => { return { props: { user, + date, eventType, workingHours, },