import type { GetServerSidePropsContext } from "next"; import { getCsrfToken } from "next-auth/react"; import { serverSideTranslations } from "next-i18next/serverSideTranslations"; import Link from "next/link"; import type { CSSProperties } from "react"; import { useForm } from "react-hook-form"; import { useLocale } from "@calcom/lib/hooks/useLocale"; import prisma from "@calcom/prisma"; import { Button, PasswordField, Form } from "@calcom/ui"; import PageWrapper from "@components/PageWrapper"; import AuthContainer from "@components/ui/AuthContainer"; type Props = { requestId: string; isRequestExpired: boolean; csrfToken: string; }; export default function Page({ requestId, isRequestExpired, csrfToken }: Props) { const { t } = useLocale(); const formMethods = useForm<{ new_password: string }>(); const success = formMethods.formState.isSubmitSuccessful; const loading = formMethods.formState.isSubmitting; const passwordValue = formMethods.watch("new_password"); const isEmpty = passwordValue?.length === 0; const submitChangePassword = async ({ password, requestId }: { password: string; requestId: string }) => { const res = await fetch("/api/auth/reset-password", { method: "POST", body: JSON.stringify({ requestId, password }), headers: { "Content-Type": "application/json", }, }); const json = await res.json(); if (!res.ok) return formMethods.setError("new_password", { type: "server", message: json.message }); }; const Success = () => { return ( <>

{t("password_updated")}

); }; const Expired = () => { return ( <>

{t("whoops")}

{t("request_is_expired")}

{t("request_is_expired_instructions")}

); }; return ( {isRequestExpired && } {!isRequestExpired && !success && ( <>
{ await submitChangePassword({ password: values.new_password, requestId, }); }}>
)} {!isRequestExpired && success && ( <> )}
); } Page.isThemeSupported = false; Page.PageWrapper = PageWrapper; export async function getServerSideProps(context: GetServerSidePropsContext) { const id = context.params?.id as string; let resetPasswordRequest = await prisma.resetPasswordRequest.findFirst({ where: { id, expires: { gt: new Date(), }, }, select: { email: true, }, }); try { resetPasswordRequest && (await prisma.user.findUniqueOrThrow({ where: { email: resetPasswordRequest.email } })); } catch (e) { resetPasswordRequest = null; } return { props: { isRequestExpired: !resetPasswordRequest, requestId: id, csrfToken: await getCsrfToken({ req: context.req }), ...(await serverSideTranslations(context.locale || "en", ["common"])), }, }; }