From 52f95eb1c31e62454dab36f8f2a94f4aee682793 Mon Sep 17 00:00:00 2001 From: Alex Johansson Date: Thu, 2 Sep 2021 18:10:44 +0200 Subject: [PATCH] add `inferSSRProps` utility (#551) --- lib/types/inferSSRProps.ts | 11 +++++++++++ pages/[user]/[type].tsx | 27 ++++++++++++++------------- pages/event-types/[type].tsx | 7 ++++--- 3 files changed, 29 insertions(+), 16 deletions(-) create mode 100644 lib/types/inferSSRProps.ts diff --git a/lib/types/inferSSRProps.ts b/lib/types/inferSSRProps.ts new file mode 100644 index 00000000..ea6d84cf --- /dev/null +++ b/lib/types/inferSSRProps.ts @@ -0,0 +1,11 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ + +type GetSSRResult = + // + { props: TProps } | { redirect: any } | { notFound: true }; + +type GetSSRFn = (...args: any[]) => Promise>; + +export type inferSSRProps> = TFn extends GetSSRFn + ? NonNullable + : never; diff --git a/pages/[user]/[type].tsx b/pages/[user]/[type].tsx index b5b3df7a..f86c8389 100644 --- a/pages/[user]/[type].tsx +++ b/pages/[user]/[type].tsx @@ -1,24 +1,25 @@ /* eslint-disable @typescript-eslint/explicit-module-boundary-types */ -import { Availability } from "@prisma/client"; -import Theme from "@components/Theme"; -import { ChevronDownIcon, ChevronUpIcon, ClockIcon, GlobeIcon } from "@heroicons/react/solid"; -import prisma from "@lib/prisma"; -import * as Collapsible from "@radix-ui/react-collapsible"; -import dayjs, { Dayjs } from "dayjs"; -import { GetServerSidePropsContext, InferGetServerSidePropsType } from "next"; -import { HeadSeo } from "@components/seo/head-seo"; -import { useRouter } from "next/router"; -import { useEffect, useState } from "react"; import Avatar from "@components/Avatar"; 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 Theme from "@components/Theme"; import PoweredByCalendso from "@components/ui/PoweredByCalendso"; -import { timeZone } from "@lib/clock"; -import { collectPageParameters, telemetryEventTypes, useTelemetry } from "@lib/telemetry"; +import { ChevronDownIcon, ChevronUpIcon, ClockIcon, GlobeIcon } from "@heroicons/react/solid"; import { asStringOrNull } from "@lib/asStringOrNull"; +import { timeZone } from "@lib/clock"; +import prisma from "@lib/prisma"; +import { collectPageParameters, telemetryEventTypes, useTelemetry } from "@lib/telemetry"; +import { inferSSRProps } from "@lib/types/inferSSRProps"; +import { Availability } from "@prisma/client"; +import * as Collapsible from "@radix-ui/react-collapsible"; +import dayjs, { Dayjs } from "dayjs"; +import { GetServerSidePropsContext } from "next"; +import { useRouter } from "next/router"; +import { useEffect, useState } from "react"; -export default function Type(props: InferGetServerSidePropsType) { +export default function Type(props: inferSSRProps) { // Get router variables const router = useRouter(); const { rescheduleUid } = router.query; diff --git a/pages/event-types/[type].tsx b/pages/event-types/[type].tsx index 21620c50..be55cac2 100644 --- a/pages/event-types/[type].tsx +++ b/pages/event-types/[type].tsx @@ -35,12 +35,13 @@ import { DateRangePicker, OrientationShape, toMomentObject } from "react-dates"; import Switch from "@components/ui/Switch"; import { Dialog, DialogTrigger } from "@components/Dialog"; import ConfirmationDialogContent from "@components/dialog/ConfirmationDialogContent"; -import { GetServerSidePropsContext, InferGetServerSidePropsType } from "next"; +import { GetServerSidePropsContext } from "next"; import { useMutation } from "react-query"; import { EventTypeInput } from "@lib/types/event-type"; import updateEventType from "@lib/mutations/event-types/update-event-type"; import deleteEventType from "@lib/mutations/event-types/delete-event-type"; import showToast from "@lib/notification"; +import { inferSSRProps } from "@lib/types/inferSSRProps"; dayjs.extend(utc); dayjs.extend(timezone); @@ -60,7 +61,7 @@ const PERIOD_TYPES = [ }, ]; -const EventTypePage = (props: InferGetServerSidePropsType) => { +const EventTypePage = (props: inferSSRProps) => { const { user, eventType, locationOptions, availability } = props; const router = useRouter(); const [successModalOpen, setSuccessModalOpen] = useState(false); @@ -1082,7 +1083,7 @@ export const getServerSideProps = async (context: GetServerSidePropsContext) => if (!eventType) { return { notFound: true, - }; + } as const; } const credentials = await prisma.credential.findMany({