From a37411b8af14488f3713bba9deab0d12c5144fe6 Mon Sep 17 00:00:00 2001
From: Mihai C <34626017+mihaic195@users.noreply.github.com>
Date: Fri, 27 Aug 2021 15:35:20 +0300
Subject: [PATCH] refactor: add next-seo (#531)
* refactor: add next-seo
* refactor: change naming of seo component
---
components/Shell.tsx | 13 +++-
components/seo/head-seo.tsx | 101 +++++++++++++++++++++++++++
lib/config/next-seo.config.ts | 27 +++++++
lib/core/browser/browser.utils.ts | 22 ++++++
package.json | 1 +
pages/404.tsx | 13 ++--
pages/[user].tsx | 61 ++--------------
pages/[user]/[type].tsx | 69 ++++--------------
pages/[user]/book.tsx | 23 +++---
pages/_app.tsx | 7 +-
pages/auth/error.tsx | 7 +-
pages/auth/forgot-password/[id].tsx | 10 +--
pages/auth/forgot-password/index.tsx | 8 +--
pages/auth/login.tsx | 7 +-
pages/auth/logout.tsx | 7 +-
pages/auth/signup.tsx | 13 ++--
pages/availability/index.tsx | 17 ++---
pages/availability/troubleshoot.tsx | 7 +-
pages/bookings/index.tsx | 9 +--
pages/cancel/[uid].tsx | 19 +++--
pages/cancel/success.tsx | 12 ++--
pages/event-types/[type].tsx | 8 +--
pages/event-types/index.tsx | 5 --
pages/integrations/[integration].tsx | 16 ++---
pages/integrations/index.tsx | 10 +--
pages/settings/billing.tsx | 10 +--
pages/settings/embed.tsx | 11 +--
pages/settings/password.tsx | 15 ++--
pages/settings/profile.tsx | 17 ++---
pages/settings/teams.tsx | 13 ++--
pages/success.tsx | 17 ++---
pages/team/[idOrSlug].tsx | 9 +--
yarn.lock | 4 ++
33 files changed, 290 insertions(+), 298 deletions(-)
create mode 100644 components/seo/head-seo.tsx
create mode 100644 lib/config/next-seo.config.ts
create mode 100644 lib/core/browser/browser.utils.ts
diff --git a/components/Shell.tsx b/components/Shell.tsx
index 312219c3..26b88ccc 100644
--- a/components/Shell.tsx
+++ b/components/Shell.tsx
@@ -3,7 +3,7 @@ import React, { Fragment, useEffect, useState } from "react";
import { useRouter } from "next/router";
import { signOut, useSession } from "next-auth/client";
import { Menu, Transition } from "@headlessui/react";
-import { collectPageParameters, telemetryEventTypes, useTelemetry } from "../lib/telemetry";
+import { collectPageParameters, telemetryEventTypes, useTelemetry } from "@lib/telemetry";
import { SelectorIcon } from "@heroicons/react/outline";
import {
CalendarIcon,
@@ -20,6 +20,7 @@ import classNames from "@lib/classNames";
import { Toaster } from "react-hot-toast";
import Avatar from "@components/Avatar";
import { User } from "@prisma/client";
+import { HeadSeo } from "@components/seo/head-seo";
export default function Shell(props) {
const router = useRouter();
@@ -70,8 +71,18 @@ export default function Shell(props) {
router.replace("/auth/login");
}
+ const pageTitle = typeof props.heading === "string" ? props.heading : props.title;
+
return session ? (
<>
+
diff --git a/components/seo/head-seo.tsx b/components/seo/head-seo.tsx
new file mode 100644
index 00000000..5155e704
--- /dev/null
+++ b/components/seo/head-seo.tsx
@@ -0,0 +1,101 @@
+import { NextSeo, NextSeoProps } from "next-seo";
+import React from "react";
+import { getBrowserInfo } from "@lib/core/browser/browser.utils";
+import { getSeoImage, seoConfig } from "@lib/config/next-seo.config";
+import merge from "lodash.merge";
+
+export type HeadSeoProps = {
+ title: string;
+ description: string;
+ siteName?: string;
+ name?: string;
+ avatar?: string;
+ url?: string;
+ canonical?: string;
+ nextSeoProps?: NextSeoProps;
+};
+
+/**
+ * Build full seo tags from title, desc, canonical and url
+ */
+const buildSeoMeta = (pageProps: {
+ title: string;
+ description: string;
+ image: string;
+ siteName?: string;
+ url?: string;
+ canonical?: string;
+}): NextSeoProps => {
+ const { title, description, image, canonical, siteName = seoConfig.headSeo.siteName } = pageProps;
+ return {
+ title: title,
+ canonical: canonical,
+ openGraph: {
+ site_name: siteName,
+ type: "website",
+ title: title,
+ description: description,
+ images: [
+ {
+ url: image,
+ //width: 1077,
+ //height: 565,
+ //alt: "Alt image"
+ },
+ ],
+ },
+ additionalMetaTags: [
+ {
+ property: "name",
+ content: title,
+ },
+ {
+ property: "description",
+ content: description,
+ },
+ {
+ name: "description",
+ content: description,
+ },
+ {
+ property: "image",
+ content: image,
+ },
+ ],
+ };
+};
+
+const constructImage = (name: string, avatar: string, description: string): string => {
+ return (
+ encodeURIComponent("Meet **" + name + "**
" + description).replace(/'/g, "%27") +
+ ".png?md=1&images=https%3A%2F%2Fcalendso.com%2Fcalendso-logo-white.svg&images=" +
+ encodeURIComponent(avatar)
+ );
+};
+
+export const HeadSeo: React.FC = (props) => {
+ const defaultUrl = getBrowserInfo()?.url;
+ const image = getSeoImage("default");
+
+ const {
+ title,
+ description,
+ name = null,
+ avatar = null,
+ siteName,
+ canonical = defaultUrl,
+ nextSeoProps = {},
+ } = props;
+
+ const pageTitle = title + " | Calendso";
+ let seoObject = buildSeoMeta({ title: pageTitle, image, description, canonical, siteName });
+
+ if (name && avatar) {
+ const pageImage = getSeoImage("ogImage") + constructImage(name, avatar, description);
+ seoObject = buildSeoMeta({ title: pageTitle, description, image: pageImage, canonical, siteName });
+ }
+
+ const seoProps: NextSeoProps = merge(nextSeoProps, seoObject);
+
+ return ;
+};
diff --git a/lib/config/next-seo.config.ts b/lib/config/next-seo.config.ts
new file mode 100644
index 00000000..5689521a
--- /dev/null
+++ b/lib/config/next-seo.config.ts
@@ -0,0 +1,27 @@
+import { DefaultSeoProps } from "next-seo";
+import { HeadSeoProps } from "@components/seo/head-seo";
+
+const seoImages = {
+ default: "https://calendso.com/og-image.png",
+ ogImage: "https://og-image-one-pi.vercel.app/",
+};
+
+export const getSeoImage = (key: keyof typeof seoImages): string => {
+ return seoImages[key];
+};
+
+export const seoConfig: {
+ headSeo: Required>;
+ defaultNextSeo: DefaultSeoProps;
+} = {
+ headSeo: {
+ siteName: "Calendso",
+ },
+ defaultNextSeo: {
+ twitter: {
+ handle: "@calendso",
+ site: "@Calendso",
+ cardType: "summary_large_image",
+ },
+ },
+} as const;
diff --git a/lib/core/browser/browser.utils.ts b/lib/core/browser/browser.utils.ts
new file mode 100644
index 00000000..828c6ca1
--- /dev/null
+++ b/lib/core/browser/browser.utils.ts
@@ -0,0 +1,22 @@
+export const isBrowser = () => typeof window !== "undefined";
+
+type BrowserInfo = {
+ url: string;
+ path: string;
+ referrer: string;
+ title: string;
+ query: string;
+};
+
+export const getBrowserInfo = (): Partial => {
+ if (!isBrowser()) {
+ return {};
+ }
+ return {
+ url: window.document.location?.href ?? undefined,
+ path: window.document.location?.pathname ?? undefined,
+ referrer: window.document?.referrer ?? undefined,
+ title: window.document.title ?? undefined,
+ query: window.document.location?.search,
+ };
+};
diff --git a/package.json b/package.json
index f6124e05..91a33e25 100644
--- a/package.json
+++ b/package.json
@@ -42,6 +42,7 @@
"lodash.throttle": "^4.1.1",
"next": "^10.2.3",
"next-auth": "^3.28.0",
+ "next-seo": "^4.26.0",
"next-transpile-modules": "^8.0.0",
"nodemailer": "^6.6.3",
"react": "17.0.2",
diff --git a/pages/404.tsx b/pages/404.tsx
index 2e339168..7de90082 100644
--- a/pages/404.tsx
+++ b/pages/404.tsx
@@ -3,7 +3,7 @@ import { BookOpenIcon, CheckIcon, CodeIcon, DocumentTextIcon } from "@heroicons/
import { useRouter } from "next/router";
import React from "react";
import Link from "next/link";
-import Head from "next/head";
+import { HeadSeo } from "@components/seo/head-seo";
const links = [
{
@@ -32,9 +32,14 @@ export default function Custom404() {
return (
<>
-
- 404: This page could not be found.
-
+
diff --git a/pages/[user].tsx b/pages/[user].tsx
index f7a418d7..6773abba 100644
--- a/pages/[user].tsx
+++ b/pages/[user].tsx
@@ -1,5 +1,5 @@
import { GetServerSideProps } from "next";
-import Head from "next/head";
+import { HeadSeo } from "@components/seo/head-seo";
import Link from "next/link";
import prisma, { whereAndSelect } from "@lib/prisma";
import Avatar from "@components/Avatar";
@@ -48,59 +48,12 @@ export default function User(props): User {
));
return (
<>
-
-
{props.user.name || props.user.username} | Calendso
-
-
-
-
-
-
-
-
-
-
").replace(
- /'/g,
- "%27"
- ) +
- ".png?md=1&images=https%3A%2F%2Fcalendso.com%2Fcalendso-logo-white.svg&images=" +
- encodeURIComponent(props.user.avatar)
- }
- />
-
-
-
-
-
-
").replace(
- /'/g,
- "%27"
- ) +
- ".png?md=1&images=https%3A%2F%2Fcalendso.com%2Fcalendso-logo-white.svg&images=" +
- encodeURIComponent(props.user.avatar)
- }
- />
-
+
{isReady && (
diff --git a/pages/[user]/[type].tsx b/pages/[user]/[type].tsx
index e4988b18..b5b3df7a 100644
--- a/pages/[user]/[type].tsx
+++ b/pages/[user]/[type].tsx
@@ -6,16 +6,16 @@ import prisma from "@lib/prisma";
import * as Collapsible from "@radix-ui/react-collapsible";
import dayjs, { Dayjs } from "dayjs";
import { GetServerSidePropsContext, InferGetServerSidePropsType } from "next";
-import Head from "next/head";
+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 PoweredByCalendso from "../../components/ui/PoweredByCalendso";
-import { timeZone } from "../../lib/clock";
-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 PoweredByCalendso from "@components/ui/PoweredByCalendso";
+import { timeZone } from "@lib/clock";
+import { collectPageParameters, telemetryEventTypes, useTelemetry } from "@lib/telemetry";
import { asStringOrNull } from "@lib/asStringOrNull";
export default function Type(props: InferGetServerSidePropsType) {
@@ -82,53 +82,14 @@ export default function Type(props: InferGetServerSidePropsType
-
-
- {rescheduleUid && "Reschedule"} {props.eventType.title} | {props.user.name || props.user.username} |
- Calendso
-
-
-
-
-
-
-
-
- " + props.eventType.description
- ).replace(/'/g, "%27") +
- ".png?md=1&images=https%3A%2F%2Fcalendso.com%2Fcalendso-logo-white.svg&images=" +
- encodeURIComponent(props.user.avatar)
- }
- />
-
-
-
-
-
- " + props.eventType.description
- ).replace(/'/g, "%27") +
- ".png?md=1&images=https%3A%2F%2Fcalendso.com%2Fcalendso-logo-white.svg&images=" +
- encodeURIComponent(props.user.avatar)
- }
- />
-
-
+
{isReady && (
-
-
- {rescheduleUid ? "Reschedule" : "Confirm"} your {props.eventType.title} with{" "}
- {props.user.name || props.user.username} | Calendso
-
-
-
+
diff --git a/pages/_app.tsx b/pages/_app.tsx
index a78372e6..beb8fda8 100644
--- a/pages/_app.tsx
+++ b/pages/_app.tsx
@@ -1,7 +1,8 @@
import "../styles/globals.css";
import AppProviders from "@lib/app-providers";
import type { AppProps as NextAppProps } from "next/app";
-import Head from "next/head";
+import { DefaultSeo } from "next-seo";
+import { seoConfig } from "@lib/config/next-seo.config";
// Workaround for https://github.com/zeit/next.js/issues/8592
export type AppProps = NextAppProps & {
@@ -12,9 +13,7 @@ export type AppProps = NextAppProps & {
function MyApp({ Component, pageProps, err }: AppProps) {
return (
-
-
-
+
);
diff --git a/pages/auth/error.tsx b/pages/auth/error.tsx
index cbd57cfe..2dc8028c 100644
--- a/pages/auth/error.tsx
+++ b/pages/auth/error.tsx
@@ -1,6 +1,6 @@
import { useRouter } from "next/router";
import { XIcon } from "@heroicons/react/outline";
-import Head from "next/head";
+import { HeadSeo } from "@components/seo/head-seo";
import Link from "next/link";
export default function Error() {
@@ -13,10 +13,7 @@ export default function Error() {
aria-labelledby="modal-title"
role="dialog"
aria-modal="true">
-
-
{error} - Calendso
-
-
+
diff --git a/pages/auth/forgot-password/[id].tsx b/pages/auth/forgot-password/[id].tsx
index 48fb72ff..413e082c 100644
--- a/pages/auth/forgot-password/[id].tsx
+++ b/pages/auth/forgot-password/[id].tsx
@@ -1,7 +1,6 @@
import { getCsrfToken } from "next-auth/client";
-import prisma from "../../../lib/prisma";
-
-import Head from "next/head";
+import prisma from "@lib/prisma";
+import { HeadSeo } from "@components/seo/head-seo";
import React, { useMemo } from "react";
import debounce from "lodash.debounce";
import dayjs from "dayjs";
@@ -122,10 +121,7 @@ export default function Page({ resetPasswordRequest, csrfToken }: Props) {
return (
-
-
Reset Password
-
-
+
{isRequestExpired &&
}
diff --git a/pages/auth/forgot-password/index.tsx b/pages/auth/forgot-password/index.tsx
index ea7fc71b..fd2a90aa 100644
--- a/pages/auth/forgot-password/index.tsx
+++ b/pages/auth/forgot-password/index.tsx
@@ -1,4 +1,4 @@
-import Head from "next/head";
+import { HeadSeo } from "@components/seo/head-seo";
import Link from "next/link";
import React from "react";
import { getCsrfToken, getSession } from "next-auth/client";
@@ -71,11 +71,7 @@ export default function ForgotPassword({ csrfToken }) {
return (
-
-
Forgot Password
-
-
-
+
{success &&
}
diff --git a/pages/auth/login.tsx b/pages/auth/login.tsx
index 5308c3d9..13152ea9 100644
--- a/pages/auth/login.tsx
+++ b/pages/auth/login.tsx
@@ -1,14 +1,11 @@
-import Head from "next/head";
+import { HeadSeo } from "@components/seo/head-seo";
import Link from "next/link";
import { getCsrfToken, getSession } from "next-auth/client";
export default function Login({ csrfToken }) {
return (
-
-
Login
-
-
+
Sign in to your account
diff --git a/pages/auth/logout.tsx b/pages/auth/logout.tsx
index a066723c..0b125e6f 100644
--- a/pages/auth/logout.tsx
+++ b/pages/auth/logout.tsx
@@ -1,4 +1,4 @@
-import Head from "next/head";
+import { HeadSeo } from "@components/seo/head-seo";
import Link from "next/link";
import { CheckIcon } from "@heroicons/react/outline";
@@ -9,10 +9,7 @@ export default function Logout() {
aria-labelledby="modal-title"
role="dialog"
aria-modal="true">
-
-
Logged out - Calendso
-
-
+
diff --git a/pages/auth/signup.tsx b/pages/auth/signup.tsx
index c446fc85..d7cbc943 100644
--- a/pages/auth/signup.tsx
+++ b/pages/auth/signup.tsx
@@ -1,10 +1,10 @@
-import Head from "next/head";
+import { HeadSeo } from "@components/seo/head-seo";
import { useRouter } from "next/router";
import { signIn } from "next-auth/client";
-import ErrorAlert from "../../components/ui/alerts/Error";
+import ErrorAlert from "@components/ui/alerts/Error";
import { useState } from "react";
-import { UsernameInput } from "../../components/ui/UsernameInput";
-import prisma from "../../lib/prisma";
+import { UsernameInput } from "@components/ui/UsernameInput";
+import prisma from "@lib/prisma";
export default function Signup(props) {
const router = useRouter();
@@ -54,10 +54,7 @@ export default function Signup(props) {
aria-labelledby="modal-title"
role="dialog"
aria-modal="true">
-
- Sign up
-
-
+
Create your account
diff --git a/pages/availability/index.tsx b/pages/availability/index.tsx
index 701dd74f..bf6a8a36 100644
--- a/pages/availability/index.tsx
+++ b/pages/availability/index.tsx
@@ -1,8 +1,7 @@
-import Head from "next/head";
import Link from "next/link";
-import prisma from "../../lib/prisma";
-import Modal from "../../components/Modal";
-import Shell from "../../components/Shell";
+import prisma from "@lib/prisma";
+import Modal from "@components/Modal";
+import Shell from "@components/Shell";
import { useRouter } from "next/router";
import { useRef, useState } from "react";
import { getSession, useSession } from "next-auth/client";
@@ -115,15 +114,7 @@ export default function Availability(props) {
return (
-
-
Availability | Calendso
-
-
-
+
diff --git a/pages/availability/troubleshoot.tsx b/pages/availability/troubleshoot.tsx
index 2b82ab21..37f4ad37 100644
--- a/pages/availability/troubleshoot.tsx
+++ b/pages/availability/troubleshoot.tsx
@@ -4,9 +4,8 @@ import dayjs from "dayjs";
import utc from "dayjs/plugin/utc";
import { GetServerSideProps } from "next";
import { getSession } from "next-auth/client";
-import Head from "next/head";
import { useEffect, useState } from "react";
-import Shell from "../../components/Shell";
+import Shell from "@components/Shell";
dayjs.extend(utc);
@@ -52,10 +51,6 @@ export default function Troubleshoot({ user }) {
return (
-
-
Troubleshoot | Calendso
-
-
diff --git a/pages/bookings/index.tsx b/pages/bookings/index.tsx
index b835dfb5..3155b5c3 100644
--- a/pages/bookings/index.tsx
+++ b/pages/bookings/index.tsx
@@ -1,7 +1,6 @@
-import Head from "next/head";
-import prisma from "../../lib/prisma";
+import prisma from "@lib/prisma";
import { getSession, useSession } from "next-auth/client";
-import Shell from "../../components/Shell";
+import Shell from "@components/Shell";
import { useRouter } from "next/router";
import dayjs from "dayjs";
import { Fragment } from "react";
@@ -36,10 +35,6 @@ export default function Bookings({ bookings }) {
return (
-
-
Bookings | Calendso
-
-
diff --git a/pages/cancel/[uid].tsx b/pages/cancel/[uid].tsx
index 2d661e4f..bd177818 100644
--- a/pages/cancel/[uid].tsx
+++ b/pages/cancel/[uid].tsx
@@ -4,11 +4,11 @@ import isBetween from "dayjs/plugin/isBetween";
import isSameOrBefore from "dayjs/plugin/isSameOrBefore";
import timezone from "dayjs/plugin/timezone";
import utc from "dayjs/plugin/utc";
-import Head from "next/head";
+import { HeadSeo } from "@components/seo/head-seo";
import { useRouter } from "next/router";
import { useState } from "react";
-import prisma from "../../lib/prisma";
-import { collectPageParameters, telemetryEventTypes, useTelemetry } from "../../lib/telemetry";
+import prisma from "@lib/prisma";
+import { collectPageParameters, telemetryEventTypes, useTelemetry } from "@lib/telemetry";
dayjs.extend(isSameOrBefore);
dayjs.extend(isBetween);
@@ -55,13 +55,12 @@ export default function Type(props) {
return (
-
-
- Cancel {props.booking && `${props.booking.title} | ${props.user.name || props.user.username} `}|
- Calendso
-
-
-
+
diff --git a/pages/cancel/success.tsx b/pages/cancel/success.tsx
index cbb4f1f4..cb117b49 100644
--- a/pages/cancel/success.tsx
+++ b/pages/cancel/success.tsx
@@ -1,4 +1,4 @@
-import Head from "next/head";
+import { HeadSeo } from "@components/seo/head-seo";
import prisma from "../../lib/prisma";
import { useRouter } from "next/router";
import dayjs from "dayjs";
@@ -19,12 +19,10 @@ export default function Type(props) {
return (
-
-
- Cancelled {props.title} | {props.user.name || props.user.username} | Calendso
-
-
-
+
diff --git a/pages/event-types/[type].tsx b/pages/event-types/[type].tsx
index 47d80676..80e6cea8 100644
--- a/pages/event-types/[type].tsx
+++ b/pages/event-types/[type].tsx
@@ -1,7 +1,6 @@
-import Head from "next/head";
import Link from "next/link";
import { useRouter } from "next/router";
-import Modal from "../../components/Modal";
+import Modal from "@components/Modal";
import React, { useEffect, useRef, useState } from "react";
import Select, { OptionBase } from "react-select";
import prisma from "@lib/prisma";
@@ -331,11 +330,8 @@ const EventTypePage = (props: InferGetServerSidePropsType
-
- {eventType.title} | Event Type | Calendso
-
-
-
- Event Types | Calendso
-
-
-
- {getIntegrationName(props.integration.type)} App | Calendso
-
-
-
-
+
diff --git a/pages/integrations/index.tsx b/pages/integrations/index.tsx
index 25428e32..1aa3211a 100644
--- a/pages/integrations/index.tsx
+++ b/pages/integrations/index.tsx
@@ -1,7 +1,6 @@
-import Head from "next/head";
import Link from "next/link";
-import prisma from "../../lib/prisma";
-import Shell from "../../components/Shell";
+import prisma from "@lib/prisma";
+import Shell from "@components/Shell";
import { useEffect, useState, useRef, useCallback } from "react";
import { getSession, useSession } from "next-auth/client";
import { CheckCircleIcon, ChevronRightIcon, PlusIcon, XCircleIcon } from "@heroicons/react/solid";
@@ -270,11 +269,6 @@ export default function Home({ integrations }: Props) {
return (
-
-
App Store | Calendso
-
-
-
}>
{integrations.filter((ig) => ig.credential).length !== 0 ? (
diff --git a/pages/settings/billing.tsx b/pages/settings/billing.tsx
index 1d28e233..63b574a4 100644
--- a/pages/settings/billing.tsx
+++ b/pages/settings/billing.tsx
@@ -1,15 +1,11 @@
-import Head from "next/head";
-import Shell from "../../components/Shell";
-import SettingsShell from "../../components/Settings";
-import prisma from "../../lib/prisma";
+import Shell from "@components/Shell";
+import SettingsShell from "@components/Settings";
+import prisma from "@lib/prisma";
import { getSession } from "next-auth/client";
export default function Billing() {
return (
-
- Billing | Calendso
-
diff --git a/pages/settings/embed.tsx b/pages/settings/embed.tsx
index 259a7a66..ae2b64b0 100644
--- a/pages/settings/embed.tsx
+++ b/pages/settings/embed.tsx
@@ -1,7 +1,6 @@
-import Head from "next/head";
-import prisma from "../../lib/prisma";
-import Shell from "../../components/Shell";
-import SettingsShell from "../../components/Settings";
+import prisma from "@lib/prisma";
+import Shell from "@components/Shell";
+import SettingsShell from "@components/Settings";
import { getSession, useSession } from "next-auth/client";
import Loader from "@components/Loader";
@@ -15,10 +14,6 @@ export default function Embed(props) {
return (
-
- Embed | Calendso
-
-
diff --git a/pages/settings/password.tsx b/pages/settings/password.tsx
index cd4fd241..23308bcf 100644
--- a/pages/settings/password.tsx
+++ b/pages/settings/password.tsx
@@ -1,9 +1,8 @@
-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";
+import prisma from "@lib/prisma";
+import Modal from "@components/Modal";
+import Shell from "@components/Shell";
+import SettingsShell from "@components/Settings";
import { getSession, useSession } from "next-auth/client";
import Loader from "@components/Loader";
@@ -45,11 +44,7 @@ export default function Settings() {
}
return (
-
-
- Change Password | Calendso
-
-
+