From 953f860e5daf9922ae3e5b24718e39a6787072af Mon Sep 17 00:00:00 2001 From: Erik Tiekstra Date: Thu, 7 Nov 2024 12:49:13 +0100 Subject: [PATCH] fix(SW-663): Fixed leaking of live preview hash and removing preview pages --- .../[contentType]/[uid]/@preview/page.tsx | 19 ++++++ .../(public)/[contentType]/[uid]/layout.tsx | 5 ++ app/[lang]/(preview)/error.tsx | 9 --- app/[lang]/(preview)/layout.tsx | 30 --------- app/[lang]/(preview)/not-found.tsx | 8 --- .../preview/[contentType]/[uid]/page.tsx | 51 --------------- app/[lang]/(preview-current)/error.tsx | 9 --- app/[lang]/(preview-current)/layout.tsx | 41 ------------ app/[lang]/(preview-current)/not-found.tsx | 8 --- .../preview-current/page.tsx | 46 -------------- components/LivePreview/index.tsx | 4 +- lib/graphql/_request.ts | 62 +++++++++---------- lib/graphql/previewRequest.ts | 42 ------------- lib/graphql/request.ts | 26 ++++++-- lib/previewContext.ts | 42 +++++++++++++ middlewares/cmsContent.ts | 16 +---- 16 files changed, 117 insertions(+), 301 deletions(-) create mode 100644 app/[lang]/(live)/(public)/[contentType]/[uid]/@preview/page.tsx delete mode 100644 app/[lang]/(preview)/error.tsx delete mode 100644 app/[lang]/(preview)/layout.tsx delete mode 100644 app/[lang]/(preview)/not-found.tsx delete mode 100644 app/[lang]/(preview)/preview/[contentType]/[uid]/page.tsx delete mode 100644 app/[lang]/(preview-current)/error.tsx delete mode 100644 app/[lang]/(preview-current)/layout.tsx delete mode 100644 app/[lang]/(preview-current)/not-found.tsx delete mode 100644 app/[lang]/(preview-current)/preview-current/page.tsx delete mode 100644 lib/graphql/previewRequest.ts create mode 100644 lib/previewContext.ts diff --git a/app/[lang]/(live)/(public)/[contentType]/[uid]/@preview/page.tsx b/app/[lang]/(live)/(public)/[contentType]/[uid]/@preview/page.tsx new file mode 100644 index 000000000..cdb9199fb --- /dev/null +++ b/app/[lang]/(live)/(public)/[contentType]/[uid]/@preview/page.tsx @@ -0,0 +1,19 @@ +import { isPreview, setPreviewData } from "@/lib/previewContext" + +import InitLivePreview from "@/components/LivePreview" + +import { PageArgs, UIDParams } from "@/types/params" + +export default function PreviewPage({ + searchParams, + params, +}: PageArgs) { + const shouldInitializePreview = searchParams.isPreview === "true" + const isInitialized = isPreview() + + if (searchParams.live_preview) { + setPreviewData({ hash: searchParams.live_preview, uid: params.uid }) + } + + return shouldInitializePreview && !isInitialized ? : null +} diff --git a/app/[lang]/(live)/(public)/[contentType]/[uid]/layout.tsx b/app/[lang]/(live)/(public)/[contentType]/[uid]/layout.tsx index 76f26fe9f..e8ef9833b 100644 --- a/app/[lang]/(live)/(public)/[contentType]/[uid]/layout.tsx +++ b/app/[lang]/(live)/(public)/[contentType]/[uid]/layout.tsx @@ -1,3 +1,5 @@ +import React from "react" + import styles from "./layout.module.css" import { @@ -9,15 +11,18 @@ import { export default function ContentTypeLayout({ breadcrumbs, + preview, children, }: React.PropsWithChildren< LayoutArgs & { breadcrumbs: React.ReactNode + preview: React.ReactNode } >) { return (
+ {preview} {breadcrumbs} {children}
diff --git a/app/[lang]/(preview)/error.tsx b/app/[lang]/(preview)/error.tsx deleted file mode 100644 index 4b2d7bb55..000000000 --- a/app/[lang]/(preview)/error.tsx +++ /dev/null @@ -1,9 +0,0 @@ -"use client" - -export default function Error({ error }: { error: Error }) { - return ( -
-

Something went wrong!

-
- ) -} diff --git a/app/[lang]/(preview)/layout.tsx b/app/[lang]/(preview)/layout.tsx deleted file mode 100644 index 948bcceba..000000000 --- a/app/[lang]/(preview)/layout.tsx +++ /dev/null @@ -1,30 +0,0 @@ -import "@/app/globals.css" -import "@scandic-hotels/design-system/style.css" - -import TrpcProvider from "@/lib/trpc/Provider" - -import InitLivePreview from "@/components/LivePreview" -import { getIntl } from "@/i18n" -import ServerIntlProvider from "@/i18n/Provider" -import { setLang } from "@/i18n/serverContext" - -import type { LangParams, LayoutArgs } from "@/types/params" - -export default async function RootLayout({ - children, - params, -}: React.PropsWithChildren>) { - setLang(params.lang) - const { defaultLocale, locale, messages } = await getIntl() - - return ( - - - - - {children} - - - - ) -} diff --git a/app/[lang]/(preview)/not-found.tsx b/app/[lang]/(preview)/not-found.tsx deleted file mode 100644 index 7fbf34706..000000000 --- a/app/[lang]/(preview)/not-found.tsx +++ /dev/null @@ -1,8 +0,0 @@ -export default function NotFound() { - return ( -
-

Not found

-

Could not find requested resource

-
- ) -} diff --git a/app/[lang]/(preview)/preview/[contentType]/[uid]/page.tsx b/app/[lang]/(preview)/preview/[contentType]/[uid]/page.tsx deleted file mode 100644 index 4fb08de78..000000000 --- a/app/[lang]/(preview)/preview/[contentType]/[uid]/page.tsx +++ /dev/null @@ -1,51 +0,0 @@ -import { ContentstackLivePreview } from "@contentstack/live-preview-utils" -import { notFound } from "next/navigation" - -import HotelPage from "@/components/ContentType/HotelPage" -import LoyaltyPage from "@/components/ContentType/LoyaltyPage" -import CollectionPage from "@/components/ContentType/StaticPages/CollectionPage" -import ContentPage from "@/components/ContentType/StaticPages/ContentPage" -import { setLang } from "@/i18n/serverContext" - -import type { - ContentTypeParams, - LangParams, - PageArgs, - UIDParams, -} from "@/types/params" - -export default async function PreviewPage({ - params, - searchParams, -}: PageArgs) { - setLang(params.lang) - - try { - ContentstackLivePreview.setConfigFromParams(searchParams) - - if (!searchParams.live_preview) { - return notFound() - } - - switch (params.contentType) { - case "content-page": - return - case "loyalty-page": - return - case "collection-page": - return - case "hotel-page": - return - default: - console.log({ PREVIEW: params }) - const type = params.contentType - console.error(`Unsupported content type given: ${type}`) - notFound() - } - } catch (error) { - // TODO: throw 500 - console.error("Error in preview page") - console.error(error) - throw new Error("Something went wrong") - } -} diff --git a/app/[lang]/(preview-current)/error.tsx b/app/[lang]/(preview-current)/error.tsx deleted file mode 100644 index 4b2d7bb55..000000000 --- a/app/[lang]/(preview-current)/error.tsx +++ /dev/null @@ -1,9 +0,0 @@ -"use client" - -export default function Error({ error }: { error: Error }) { - return ( -
-

Something went wrong!

-
- ) -} diff --git a/app/[lang]/(preview-current)/layout.tsx b/app/[lang]/(preview-current)/layout.tsx deleted file mode 100644 index e5ff698bb..000000000 --- a/app/[lang]/(preview-current)/layout.tsx +++ /dev/null @@ -1,41 +0,0 @@ -import Footer from "@/components/Current/Footer" -import LangPopup from "@/components/Current/LangPopup" -import InitLivePreview from "@/components/LivePreview" -import SkipToMainContent from "@/components/SkipToMainContent" -import { setLang } from "@/i18n/serverContext" - -import type { Metadata } from "next" - -import type { LangParams, LayoutArgs } from "@/types/params" - -export const fetchCache = "default-no-store" - -export const metadata: Metadata = { - description: "New web", - title: "Scandic Hotels", -} - -export default function RootLayout({ - children, - params, -}: React.PropsWithChildren>) { - setLang(params.lang) - - return ( - - - {/* eslint-disable-next-line @next/next/no-css-tags */} - - {/* eslint-disable-next-line @next/next/no-css-tags */} - - - - - - - {children} -