2021-07-30 23:05:38 +00:00
|
|
|
import Head from "next/head";
|
|
|
|
import { useRef, useState } from "react";
|
|
|
|
import prisma from "../../lib/prisma";
|
|
|
|
import Modal from "../../components/Modal";
|
|
|
|
import Shell from "../../components/Shell";
|
|
|
|
import SettingsShell from "../../components/Settings";
|
2021-08-02 20:51:57 +00:00
|
|
|
import { getSession, useSession } from "next-auth/client";
|
2021-08-03 09:09:15 +00:00
|
|
|
import Loader from "@components/Loader";
|
2021-04-07 15:03:02 +00:00
|
|
|
|
2021-08-02 20:51:57 +00:00
|
|
|
export default function Settings() {
|
2021-08-03 10:29:51 +00:00
|
|
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
2021-07-30 23:05:38 +00:00
|
|
|
const [session, loading] = useSession();
|
2021-08-03 09:09:15 +00:00
|
|
|
|
2021-07-30 23:05:38 +00:00
|
|
|
const [successModalOpen, setSuccessModalOpen] = useState(false);
|
|
|
|
const oldPasswordRef = useRef<HTMLInputElement>();
|
|
|
|
const newPasswordRef = useRef<HTMLInputElement>();
|
2021-04-07 15:03:02 +00:00
|
|
|
|
2021-07-30 23:05:38 +00:00
|
|
|
if (loading) {
|
2021-08-03 09:09:21 +00:00
|
|
|
return <Loader />;
|
2021-07-30 23:05:38 +00:00
|
|
|
}
|
2021-04-20 12:56:50 +00:00
|
|
|
|
2021-07-30 23:05:38 +00:00
|
|
|
const closeSuccessModal = () => {
|
|
|
|
setSuccessModalOpen(false);
|
|
|
|
};
|
2021-04-07 15:03:02 +00:00
|
|
|
|
2021-07-30 23:05:38 +00:00
|
|
|
async function changePasswordHandler(event) {
|
|
|
|
event.preventDefault();
|
2021-04-07 15:03:02 +00:00
|
|
|
|
2021-07-30 23:05:38 +00:00
|
|
|
const enteredOldPassword = oldPasswordRef.current.value;
|
|
|
|
const enteredNewPassword = newPasswordRef.current.value;
|
2021-04-07 15:03:02 +00:00
|
|
|
|
2021-07-30 23:05:38 +00:00
|
|
|
// TODO: Add validation
|
2021-04-07 15:03:02 +00:00
|
|
|
|
2021-08-03 10:29:51 +00:00
|
|
|
/*eslint-disable */
|
2021-07-30 23:05:38 +00:00
|
|
|
const response = await fetch("/api/auth/changepw", {
|
|
|
|
method: "PATCH",
|
|
|
|
body: JSON.stringify({ oldPassword: enteredOldPassword, newPassword: enteredNewPassword }),
|
|
|
|
headers: {
|
|
|
|
"Content-Type": "application/json",
|
|
|
|
},
|
|
|
|
});
|
2021-08-03 10:29:51 +00:00
|
|
|
/*eslint-enable */
|
2021-04-07 15:03:02 +00:00
|
|
|
|
2021-07-30 23:05:38 +00:00
|
|
|
setSuccessModalOpen(true);
|
|
|
|
}
|
2021-04-07 15:03:02 +00:00
|
|
|
|
2021-07-30 23:05:38 +00:00
|
|
|
return (
|
2021-08-03 09:09:15 +00:00
|
|
|
<Shell heading="Password" subtitle="Change the password that you use to sign in to your account.">
|
2021-07-30 23:05:38 +00:00
|
|
|
<Head>
|
|
|
|
<title>Change Password | Calendso</title>
|
|
|
|
<link rel="icon" href="/favicon.ico" />
|
|
|
|
</Head>
|
|
|
|
<SettingsShell>
|
|
|
|
<form className="divide-y divide-gray-200 lg:col-span-9" onSubmit={changePasswordHandler}>
|
|
|
|
<div className="py-6 lg:pb-8">
|
|
|
|
<div className="flex">
|
|
|
|
<div className="w-1/2 mr-2">
|
|
|
|
<label htmlFor="current_password" className="block text-sm font-medium text-gray-700">
|
|
|
|
Current Password
|
|
|
|
</label>
|
|
|
|
<div className="mt-1">
|
|
|
|
<input
|
|
|
|
ref={oldPasswordRef}
|
|
|
|
type="password"
|
|
|
|
name="current_password"
|
|
|
|
id="current_password"
|
|
|
|
required
|
2021-08-02 15:24:01 +00:00
|
|
|
className="shadow-sm focus:ring-black focus:border-black block w-full sm:text-sm border-gray-300 rounded-sm"
|
2021-07-30 23:05:38 +00:00
|
|
|
placeholder="Your old password"
|
|
|
|
/>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
<div className="w-1/2 ml-2">
|
|
|
|
<label htmlFor="new_password" className="block text-sm font-medium text-gray-700">
|
|
|
|
New Password
|
|
|
|
</label>
|
|
|
|
<div className="mt-1">
|
|
|
|
<input
|
|
|
|
ref={newPasswordRef}
|
|
|
|
type="password"
|
|
|
|
name="new_password"
|
|
|
|
id="new_password"
|
|
|
|
required
|
2021-08-02 15:24:01 +00:00
|
|
|
className="shadow-sm focus:ring-black focus:border-black block w-full sm:text-sm border-gray-300 rounded-sm"
|
2021-07-30 23:05:38 +00:00
|
|
|
placeholder="Your super secure new password"
|
|
|
|
/>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
<hr className="mt-8" />
|
|
|
|
<div className="py-4 flex justify-end">
|
|
|
|
<button
|
|
|
|
type="submit"
|
2021-08-02 15:24:01 +00:00
|
|
|
className="ml-2 bg-neutral-900 border border-transparent rounded-sm shadow-sm py-2 px-4 inline-flex justify-center text-sm font-medium text-white hover:bg-blue-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-black">
|
2021-07-30 23:05:38 +00:00
|
|
|
Save
|
|
|
|
</button>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</form>
|
|
|
|
<Modal
|
|
|
|
heading="Password updated successfully"
|
|
|
|
description="Your password has been successfully changed."
|
|
|
|
open={successModalOpen}
|
|
|
|
handleClose={closeSuccessModal}
|
|
|
|
/>
|
|
|
|
</SettingsShell>
|
|
|
|
</Shell>
|
|
|
|
);
|
2021-04-07 15:03:02 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
export async function getServerSideProps(context) {
|
2021-07-30 23:05:38 +00:00
|
|
|
const session = await getSession(context);
|
|
|
|
if (!session) {
|
|
|
|
return { redirect: { permanent: false, destination: "/auth/login" } };
|
|
|
|
}
|
2021-04-07 15:03:02 +00:00
|
|
|
|
2021-07-30 23:05:38 +00:00
|
|
|
const user = await prisma.user.findFirst({
|
|
|
|
where: {
|
|
|
|
email: session.user.email,
|
|
|
|
},
|
|
|
|
select: {
|
|
|
|
id: true,
|
|
|
|
username: true,
|
|
|
|
name: true,
|
|
|
|
},
|
|
|
|
});
|
2021-04-07 15:03:02 +00:00
|
|
|
|
2021-07-30 23:05:38 +00:00
|
|
|
return {
|
|
|
|
props: { user }, // will be passed to the page component as props
|
|
|
|
};
|
|
|
|
}
|