From f5108d1a8e67761490570096ebf02544ef49a968 Mon Sep 17 00:00:00 2001 From: Michael Zetterberg Date: Tue, 14 May 2024 15:55:46 +0200 Subject: [PATCH] feat: improve structure and error handling --- .../bypass/@breadcrumbs/benefits/default.tsx | 3 - .../bypass/@breadcrumbs/benefits/page.tsx | 17 - .../bypass/@breadcrumbs/default.tsx | 3 - .../bypass/@breadcrumbs/overview/default.tsx | 3 - .../bypass/@breadcrumbs/overview/page.tsx | 17 - .../profile/[...catchAll]/page.tsx | 17 - .../bypass/@breadcrumbs/profile/page.tsx | 17 - .../bypass/@breadcrumbs/stays/default.tsx | 3 - .../bypass/@breadcrumbs/stays/page.tsx | 17 - .../(live)/(protected)/bypass/layout.tsx | 26 -- app/[lang]/(live)/(protected)/bypass/page.tsx | 7 - app/[lang]/(live)/(protected)/layout.tsx | 2 +- app/[lang]/(live)/(protected)/logout/route.ts | 1 - .../(protected)/my-pages/[...path]/page.tsx | 17 +- .../my-pages/[[...uri]]/layout.module.css | 18 + .../my-pages/[[...uri]]/layout.tsx | 21 + .../(live)/(protected)/my-pages/_constants.ts | 16 - .../(live)/(protected)/my-pages/layout.tsx | 7 +- .../[uid]}/layout.module.css | 0 .../[uid]}/layout.tsx | 14 +- .../(public)/[contentType]/[uid]/page.tsx | 26 ++ app/[lang]/(live)/(public)/login/route.ts | 18 +- .../(live)/(public)/loyalty-page/page.tsx | 39 -- .../layout.module.css => error.module.css} | 1 - app/[lang]/(live)/error.tsx | 32 ++ app/[lang]/(live)/layout.tsx | 7 +- .../middleware-error/[status]/page.module.css | 3 + .../(live)/middleware-error/[status]/page.tsx | 17 + app/[lang]/(live)/not-found.tsx | 2 +- app/[lang]/(live-current)/not-found.tsx | 2 +- app/[lang]/(preview)/not-found.tsx | 2 +- .../preview/[contentType]/[uid]/page.tsx | 20 + app/[lang]/(preview)/preview/page.tsx | 3 - app/[lang]/(preview-current)/not-found.tsx | 2 +- app/api/web/auth/[...nextauth]/route.ts | 12 +- app/api/web/revalidate/route.ts | 5 +- app/global-error.module.css | 3 + app/global-error.tsx | 25 ++ app/not-found.module.css | 3 + auth.ts | 69 ++- .../ContentType/ContentPage.tsx | 0 components/ContentType/LoyaltyPage.tsx | 21 + .../ContentType/loyaltyPage.module.css | 0 .../Header/Hamburger/hamburger.module.css | 0 .../{MyPages => }/Header/Hamburger/index.tsx | 0 .../Header/LanguageSwitcher/index.tsx | 0 .../LanguageSwitcher/language.module.css | 0 components/Header/Logo/index.tsx | 15 + .../{MyPages => }/Header/Logo/logo.module.css | 0 .../{MyPages => }/Header/header.module.css | 0 components/Header/index.tsx | 35 ++ .../JoinLoyalty/Contact/ContactRow/index.tsx | 4 +- components/MaxWidth/index.tsx | 7 - components/MyPages/Breadcrumbs/index.tsx | 5 +- components/MyPages/Header/Logo/index.tsx | 34 -- components/MyPages/Header/index.tsx | 19 - components/MyPages/Sidebar/index.tsx | 6 +- lib/graphql/Query/AccountPage.graphql | 77 ++-- lib/graphql/Query/ContentTypeUid.graphql | 11 - lib/graphql/Query/Logo.graphql | 16 - lib/graphql/Query/LoyaltyPage.graphql | 416 +++++++++--------- lib/graphql/Query/ResolveEntry.graphql | 28 ++ lib/graphql/request.ts | 84 ++-- lib/trpc/client.ts | 2 +- lib/trpc/server.ts | 26 +- middleware.ts | 63 ++- middlewares/authRequired.ts | 7 +- middlewares/cmsContent.ts | 77 +++- middlewares/ensureLang.ts | 15 - next.config.js | 2 +- package-lock.json | 88 ++-- package.json | 2 +- server/context.ts | 18 + server/errors/next.ts | 15 + server/errors/trpc.ts | 42 +- server/index.ts | 5 +- .../routers/contentstack/accountPage/index.ts | 2 + .../routers/contentstack/accountPage/input.ts | 8 - .../contentstack/accountPage/output.ts | 34 +- .../routers/contentstack/accountPage/query.ts | 215 +++++---- .../routers/contentstack/accountPage/utils.ts | 38 +- .../routers/contentstack/breadcrumbs/input.ts | 8 - .../routers/contentstack/breadcrumbs/query.ts | 166 ++++--- .../contentstack/contactConfig/input.ts | 5 - .../contentstack/contactConfig/query.ts | 42 +- .../routers/contentstack/loyaltyPage/input.ts | 10 - .../contentstack/loyaltyPage/output.ts | 36 +- .../routers/contentstack/loyaltyPage/query.ts | 299 ++++++------- .../routers/contentstack/loyaltyPage/utils.ts | 78 ++-- .../contentstack/myPages/navigation/input.ts | 5 - .../contentstack/myPages/navigation/output.ts | 4 +- .../contentstack/myPages/navigation/query.ts | 139 +++--- server/routers/user/query.ts | 138 +++--- server/trpc.ts | 13 +- types/components/header/logo.ts | 6 + types/components/myPages/layout.ts | 5 - types/params.ts | 14 +- types/requests/contentTypeUid.ts | 13 - types/requests/entry.ts | 19 + types/requests/myPages/logo.ts | 10 - types/requests/myPages/navigation.ts | 4 - utils/contentType.ts | 55 --- utils/entry.ts | 50 +++ utils/generateTag.ts | 2 +- 104 files changed, 1505 insertions(+), 1570 deletions(-) delete mode 100644 app/[lang]/(live)/(protected)/bypass/@breadcrumbs/benefits/default.tsx delete mode 100644 app/[lang]/(live)/(protected)/bypass/@breadcrumbs/benefits/page.tsx delete mode 100644 app/[lang]/(live)/(protected)/bypass/@breadcrumbs/default.tsx delete mode 100644 app/[lang]/(live)/(protected)/bypass/@breadcrumbs/overview/default.tsx delete mode 100644 app/[lang]/(live)/(protected)/bypass/@breadcrumbs/overview/page.tsx delete mode 100644 app/[lang]/(live)/(protected)/bypass/@breadcrumbs/profile/[...catchAll]/page.tsx delete mode 100644 app/[lang]/(live)/(protected)/bypass/@breadcrumbs/profile/page.tsx delete mode 100644 app/[lang]/(live)/(protected)/bypass/@breadcrumbs/stays/default.tsx delete mode 100644 app/[lang]/(live)/(protected)/bypass/@breadcrumbs/stays/page.tsx delete mode 100644 app/[lang]/(live)/(protected)/bypass/layout.tsx delete mode 100644 app/[lang]/(live)/(protected)/bypass/page.tsx create mode 100644 app/[lang]/(live)/(protected)/my-pages/[[...uri]]/layout.module.css create mode 100644 app/[lang]/(live)/(protected)/my-pages/[[...uri]]/layout.tsx delete mode 100644 app/[lang]/(live)/(protected)/my-pages/_constants.ts rename app/[lang]/(live)/(public)/{loyalty-page => [contentType]/[uid]}/layout.module.css (100%) rename app/[lang]/(live)/(public)/{loyalty-page => [contentType]/[uid]}/layout.tsx (51%) create mode 100644 app/[lang]/(live)/(public)/[contentType]/[uid]/page.tsx delete mode 100644 app/[lang]/(live)/(public)/loyalty-page/page.tsx rename app/[lang]/(live)/{(protected)/bypass/layout.module.css => error.module.css} (91%) create mode 100644 app/[lang]/(live)/error.tsx create mode 100644 app/[lang]/(live)/middleware-error/[status]/page.module.css create mode 100644 app/[lang]/(live)/middleware-error/[status]/page.tsx create mode 100644 app/[lang]/(preview)/preview/[contentType]/[uid]/page.tsx delete mode 100644 app/[lang]/(preview)/preview/page.tsx create mode 100644 app/global-error.module.css create mode 100644 app/global-error.tsx create mode 100644 app/not-found.module.css rename app/[lang]/(live)/(public)/content-page/page.tsx => components/ContentType/ContentPage.tsx (100%) create mode 100644 components/ContentType/LoyaltyPage.tsx rename app/[lang]/(live)/(public)/loyalty-page/page.module.css => components/ContentType/loyaltyPage.module.css (100%) rename components/{MyPages => }/Header/Hamburger/hamburger.module.css (100%) rename components/{MyPages => }/Header/Hamburger/index.tsx (100%) rename components/{MyPages => }/Header/LanguageSwitcher/index.tsx (100%) rename components/{MyPages => }/Header/LanguageSwitcher/language.module.css (100%) create mode 100644 components/Header/Logo/index.tsx rename components/{MyPages => }/Header/Logo/logo.module.css (100%) rename components/{MyPages => }/Header/header.module.css (100%) create mode 100644 components/Header/index.tsx delete mode 100644 components/MyPages/Header/Logo/index.tsx delete mode 100644 components/MyPages/Header/index.tsx delete mode 100644 lib/graphql/Query/ContentTypeUid.graphql delete mode 100644 lib/graphql/Query/Logo.graphql create mode 100644 lib/graphql/Query/ResolveEntry.graphql delete mode 100644 middlewares/ensureLang.ts delete mode 100644 server/routers/contentstack/accountPage/input.ts delete mode 100644 server/routers/contentstack/breadcrumbs/input.ts delete mode 100644 server/routers/contentstack/contactConfig/input.ts delete mode 100644 server/routers/contentstack/loyaltyPage/input.ts delete mode 100644 server/routers/contentstack/myPages/navigation/input.ts create mode 100644 types/components/header/logo.ts delete mode 100644 types/components/myPages/layout.ts delete mode 100644 types/requests/contentTypeUid.ts create mode 100644 types/requests/entry.ts delete mode 100644 types/requests/myPages/logo.ts delete mode 100644 utils/contentType.ts create mode 100644 utils/entry.ts diff --git a/app/[lang]/(live)/(protected)/bypass/@breadcrumbs/benefits/default.tsx b/app/[lang]/(live)/(protected)/bypass/@breadcrumbs/benefits/default.tsx deleted file mode 100644 index 86b9e9a38..000000000 --- a/app/[lang]/(live)/(protected)/bypass/@breadcrumbs/benefits/default.tsx +++ /dev/null @@ -1,3 +0,0 @@ -export default function Default() { - return null -} diff --git a/app/[lang]/(live)/(protected)/bypass/@breadcrumbs/benefits/page.tsx b/app/[lang]/(live)/(protected)/bypass/@breadcrumbs/benefits/page.tsx deleted file mode 100644 index 25acf3e0a..000000000 --- a/app/[lang]/(live)/(protected)/bypass/@breadcrumbs/benefits/page.tsx +++ /dev/null @@ -1,17 +0,0 @@ -import { benefits } from "@/constants/routes/myPages" -import { serverClient } from "@/lib/trpc/server" - -import Breadcrumbs from "@/components/MyPages/Breadcrumbs" - -import type { LangParams, PageArgs } from "@/types/params" - -export default async function BenefitsBreadcrumbs({ - params, -}: PageArgs) { - const href = benefits[params.lang].replace(`/${params.lang}`, "") - const breadcrumbs = await serverClient().contentstack.breadcrumbs.get({ - href, - locale: params.lang, - }) - return -} diff --git a/app/[lang]/(live)/(protected)/bypass/@breadcrumbs/default.tsx b/app/[lang]/(live)/(protected)/bypass/@breadcrumbs/default.tsx deleted file mode 100644 index 86b9e9a38..000000000 --- a/app/[lang]/(live)/(protected)/bypass/@breadcrumbs/default.tsx +++ /dev/null @@ -1,3 +0,0 @@ -export default function Default() { - return null -} diff --git a/app/[lang]/(live)/(protected)/bypass/@breadcrumbs/overview/default.tsx b/app/[lang]/(live)/(protected)/bypass/@breadcrumbs/overview/default.tsx deleted file mode 100644 index 86b9e9a38..000000000 --- a/app/[lang]/(live)/(protected)/bypass/@breadcrumbs/overview/default.tsx +++ /dev/null @@ -1,3 +0,0 @@ -export default function Default() { - return null -} diff --git a/app/[lang]/(live)/(protected)/bypass/@breadcrumbs/overview/page.tsx b/app/[lang]/(live)/(protected)/bypass/@breadcrumbs/overview/page.tsx deleted file mode 100644 index 203ace024..000000000 --- a/app/[lang]/(live)/(protected)/bypass/@breadcrumbs/overview/page.tsx +++ /dev/null @@ -1,17 +0,0 @@ -import { overview } from "@/constants/routes/myPages" -import { serverClient } from "@/lib/trpc/server" - -import Breadcrumbs from "@/components/MyPages/Breadcrumbs" - -import type { LangParams, PageArgs } from "@/types/params" - -export default async function OverviewBreadcrumbs({ - params, -}: PageArgs) { - const href = overview[params.lang].replace(`/${params.lang}`, "") - const breadcrumbs = await serverClient().contentstack.breadcrumbs.get({ - href, - locale: params.lang, - }) - return -} diff --git a/app/[lang]/(live)/(protected)/bypass/@breadcrumbs/profile/[...catchAll]/page.tsx b/app/[lang]/(live)/(protected)/bypass/@breadcrumbs/profile/[...catchAll]/page.tsx deleted file mode 100644 index 243892846..000000000 --- a/app/[lang]/(live)/(protected)/bypass/@breadcrumbs/profile/[...catchAll]/page.tsx +++ /dev/null @@ -1,17 +0,0 @@ -import { profile } from "@/constants/routes/myPages" -import { serverClient } from "@/lib/trpc/server" - -import Breadcrumbs from "@/components/MyPages/Breadcrumbs" - -import type { LangParams, PageArgs } from "@/types/params" - -export default async function ProfileBreadcrumbs({ - params, -}: PageArgs) { - const href = profile[params.lang].replace(`/${params.lang}`, "") - const breadcrumbs = await serverClient().contentstack.breadcrumbs.get({ - href, - locale: params.lang, - }) - return -} diff --git a/app/[lang]/(live)/(protected)/bypass/@breadcrumbs/profile/page.tsx b/app/[lang]/(live)/(protected)/bypass/@breadcrumbs/profile/page.tsx deleted file mode 100644 index 243892846..000000000 --- a/app/[lang]/(live)/(protected)/bypass/@breadcrumbs/profile/page.tsx +++ /dev/null @@ -1,17 +0,0 @@ -import { profile } from "@/constants/routes/myPages" -import { serverClient } from "@/lib/trpc/server" - -import Breadcrumbs from "@/components/MyPages/Breadcrumbs" - -import type { LangParams, PageArgs } from "@/types/params" - -export default async function ProfileBreadcrumbs({ - params, -}: PageArgs) { - const href = profile[params.lang].replace(`/${params.lang}`, "") - const breadcrumbs = await serverClient().contentstack.breadcrumbs.get({ - href, - locale: params.lang, - }) - return -} diff --git a/app/[lang]/(live)/(protected)/bypass/@breadcrumbs/stays/default.tsx b/app/[lang]/(live)/(protected)/bypass/@breadcrumbs/stays/default.tsx deleted file mode 100644 index 86b9e9a38..000000000 --- a/app/[lang]/(live)/(protected)/bypass/@breadcrumbs/stays/default.tsx +++ /dev/null @@ -1,3 +0,0 @@ -export default function Default() { - return null -} diff --git a/app/[lang]/(live)/(protected)/bypass/@breadcrumbs/stays/page.tsx b/app/[lang]/(live)/(protected)/bypass/@breadcrumbs/stays/page.tsx deleted file mode 100644 index 69a7ccdab..000000000 --- a/app/[lang]/(live)/(protected)/bypass/@breadcrumbs/stays/page.tsx +++ /dev/null @@ -1,17 +0,0 @@ -import { stays } from "@/constants/routes/myPages" -import { serverClient } from "@/lib/trpc/server" - -import Breadcrumbs from "@/components/MyPages/Breadcrumbs" - -import type { LangParams, PageArgs } from "@/types/params" - -export default async function StaysBreadcrumbs({ - params, -}: PageArgs) { - const href = stays[params.lang].replace(`/${params.lang}`, "") - const breadcrumbs = await serverClient().contentstack.breadcrumbs.get({ - href, - locale: params.lang, - }) - return -} diff --git a/app/[lang]/(live)/(protected)/bypass/layout.tsx b/app/[lang]/(live)/(protected)/bypass/layout.tsx deleted file mode 100644 index b5e51dd1d..000000000 --- a/app/[lang]/(live)/(protected)/bypass/layout.tsx +++ /dev/null @@ -1,26 +0,0 @@ -import { firaMono, firaSans } from "@/app/[lang]/(live)/fonts" -import Header from "@/components/MyPages/Header" -import Sidebar from "@/components/MyPages/Sidebar" - -import styles from "./layout.module.css" - -import type { MyPagesLayoutProps } from "@/types/components/myPages/layout" - -export default async function MyPagesLayout({ - breadcrumbs, - children, - params, -}: React.PropsWithChildren) { - return ( -
-
- {breadcrumbs} -
- - {children} -
-
- ) -} diff --git a/app/[lang]/(live)/(protected)/bypass/page.tsx b/app/[lang]/(live)/(protected)/bypass/page.tsx deleted file mode 100644 index 9f37aa2a7..000000000 --- a/app/[lang]/(live)/(protected)/bypass/page.tsx +++ /dev/null @@ -1,7 +0,0 @@ -import { auth } from "@/auth" - -export default async function ByPass() { - const session = await auth() - - return
{JSON.stringify(session, null, 2)}
-} diff --git a/app/[lang]/(live)/(protected)/layout.tsx b/app/[lang]/(live)/(protected)/layout.tsx index 9f10ffc48..182d77b5a 100644 --- a/app/[lang]/(live)/(protected)/layout.tsx +++ b/app/[lang]/(live)/(protected)/layout.tsx @@ -17,5 +17,5 @@ export default async function ProtectedLayout({ redirect(`/${params.lang}/login`) } - return <>{children} + return children } diff --git a/app/[lang]/(live)/(protected)/logout/route.ts b/app/[lang]/(live)/(protected)/logout/route.ts index c645f57cb..336613db0 100644 --- a/app/[lang]/(live)/(protected)/logout/route.ts +++ b/app/[lang]/(live)/(protected)/logout/route.ts @@ -11,7 +11,6 @@ export async function GET(request: NextRequest) { // If all else fails, always redirect to startpage const redirectTo = returnUrl || - request.headers.get("x-redirect-to") || request.nextUrl.searchParams.get("redirectTo") || "/" diff --git a/app/[lang]/(live)/(protected)/my-pages/[...path]/page.tsx b/app/[lang]/(live)/(protected)/my-pages/[...path]/page.tsx index 73beee00f..3c1ce9f98 100644 --- a/app/[lang]/(live)/(protected)/my-pages/[...path]/page.tsx +++ b/app/[lang]/(live)/(protected)/my-pages/[...path]/page.tsx @@ -13,25 +13,14 @@ import type { LangParams, PageArgs } from "@/types/params" export default async function MyPages({ params, }: PageArgs) { - const baseUrl = myPages[params.lang].replace(`/${params.lang}`, "") - const pathUrl = params.path.join("/") - - const accountPage = await serverClient().contentstack.accountPage.get({ - url: `${baseUrl}/${pathUrl}`, - lang: params.lang, - }) - - const breadcrumbs = await serverClient().contentstack.breadcrumbs.get({ - href: `${baseUrl}/${pathUrl}`, - locale: params.lang, - }) + const accountPage = await serverClient().contentstack.accountPage.get() return ( <> - +
- + {accountPage.content.length ? ( diff --git a/app/[lang]/(live)/(protected)/my-pages/[[...uri]]/layout.module.css b/app/[lang]/(live)/(protected)/my-pages/[[...uri]]/layout.module.css new file mode 100644 index 000000000..ebc27135f --- /dev/null +++ b/app/[lang]/(live)/(protected)/my-pages/[[...uri]]/layout.module.css @@ -0,0 +1,18 @@ +.content { + display: grid; + padding-bottom: 7.7rem; + padding-left: 0; + padding-right: 0; + position: relative; +} + +@media screen and (min-width: 950px) { + .content { + gap: 10rem; + grid-template-columns: 25rem 1fr; + padding-bottom: 17.5rem; + padding-left: 2.4rem; + padding-right: 2.4rem; + padding-top: 5.8rem; + } +} diff --git a/app/[lang]/(live)/(protected)/my-pages/[[...uri]]/layout.tsx b/app/[lang]/(live)/(protected)/my-pages/[[...uri]]/layout.tsx new file mode 100644 index 000000000..400f273d7 --- /dev/null +++ b/app/[lang]/(live)/(protected)/my-pages/[[...uri]]/layout.tsx @@ -0,0 +1,21 @@ +import Breadcrumbs from "@/components/MyPages/Breadcrumbs" +import Sidebar from "@/components/MyPages/Sidebar" + +import styles from "./layout.module.css" + +import { LangParams, LayoutArgs, UriParams } from "@/types/params" + +export default async function MyPagesURILayout({ + children, +}: React.PropsWithChildren>) { + return ( + <> + + +
+ + {children} +
+ + ) +} diff --git a/app/[lang]/(live)/(protected)/my-pages/_constants.ts b/app/[lang]/(live)/(protected)/my-pages/_constants.ts deleted file mode 100644 index 1ee770976..000000000 --- a/app/[lang]/(live)/(protected)/my-pages/_constants.ts +++ /dev/null @@ -1,16 +0,0 @@ -export const breadcrumbs = { - "/my-pages": [ - { - title: "My Pages", - }, - ], - "/my-pages/profile": [ - { - href: "/my-pages", - title: "My Pages", - }, - { - title: "My Profile", - }, - ], -} diff --git a/app/[lang]/(live)/(protected)/my-pages/layout.tsx b/app/[lang]/(live)/(protected)/my-pages/layout.tsx index 3fae5e673..d9d38fe0e 100644 --- a/app/[lang]/(live)/(protected)/my-pages/layout.tsx +++ b/app/[lang]/(live)/(protected)/my-pages/layout.tsx @@ -1,19 +1,16 @@ import { firaMono, firaSans } from "@/app/[lang]/(live)/fonts" -import Header from "@/components/MyPages/Header" import styles from "./layout.module.css" -import type { MyPagesLayoutProps } from "@/types/components/myPages/layout" +import { LangParams, LayoutArgs } from "@/types/params" export default async function MyPagesLayout({ children, - params, -}: React.PropsWithChildren) { +}: React.PropsWithChildren>) { return (
-
{children}
) diff --git a/app/[lang]/(live)/(public)/loyalty-page/layout.module.css b/app/[lang]/(live)/(public)/[contentType]/[uid]/layout.module.css similarity index 100% rename from app/[lang]/(live)/(public)/loyalty-page/layout.module.css rename to app/[lang]/(live)/(public)/[contentType]/[uid]/layout.module.css diff --git a/app/[lang]/(live)/(public)/loyalty-page/layout.tsx b/app/[lang]/(live)/(public)/[contentType]/[uid]/layout.tsx similarity index 51% rename from app/[lang]/(live)/(public)/loyalty-page/layout.tsx rename to app/[lang]/(live)/(public)/[contentType]/[uid]/layout.tsx index aa011671a..44f4e3d2d 100644 --- a/app/[lang]/(live)/(public)/loyalty-page/layout.tsx +++ b/app/[lang]/(live)/(public)/[contentType]/[uid]/layout.tsx @@ -2,9 +2,19 @@ import { firaMono, firaSans } from "@/app/[lang]/(live)/fonts" import styles from "./layout.module.css" -export default function LoyaltyPagesLayout({ +import { + ContentTypeParams, + LangParams, + LayoutArgs, + UIDParams, +} from "@/types/params" + +export default function ContentTypeLayout({ children, -}: React.PropsWithChildren) { + params, +}: React.PropsWithChildren< + LayoutArgs +>) { return (
) { + switch (params.contentType) { + case "loyalty-page": + return + case "content-page": + return + default: + const type: never = params.contentType + console.error(`Unsupported content type given: ${type}`) + notFound() + } +} diff --git a/app/[lang]/(live)/(public)/login/route.ts b/app/[lang]/(live)/(public)/login/route.ts index 88e0b471b..080a298d8 100644 --- a/app/[lang]/(live)/(public)/login/route.ts +++ b/app/[lang]/(live)/(public)/login/route.ts @@ -3,7 +3,7 @@ import { AuthError } from "next-auth" import { Lang } from "@/constants/languages" import { env } from "@/env/server" -import { badRequest, internalServerError } from "@/server/errors/next" +import { internalServerError } from "@/server/errors/next" import { signIn } from "@/auth" @@ -22,17 +22,15 @@ export async function GET( // Normal login request from New web redirectTo = request.cookies.get("redirectTo")?.value || // Cookie gets set by authRequired middleware - request.headers.get("x-redirect-to") || request.nextUrl.searchParams.get("redirectTo") || - "" + "/" - // If above fails, always redirect to startpage - if (!redirectTo) { + // Make relative URL to absolute URL + if (redirectTo.startsWith("/")) { if (!env.PUBLIC_URL) { throw internalServerError("No value for env.PUBLIC_URL") } - redirectTo = env.PUBLIC_URL - console.log({ login_fallback: redirectTo }) + redirectTo = new URL(redirectTo, env.PUBLIC_URL).href } // Clean up cookie from authRequired middleware @@ -104,11 +102,11 @@ export async function GET( } } catch (error) { if (error instanceof AuthError) { - console.log({ signInAuthError: error }) + console.error({ signInAuthError: error }) } else { - console.log({ signInError: error }) + console.error({ signInError: error }) } } - return badRequest() + return internalServerError() } diff --git a/app/[lang]/(live)/(public)/loyalty-page/page.tsx b/app/[lang]/(live)/(public)/loyalty-page/page.tsx deleted file mode 100644 index 881276af5..000000000 --- a/app/[lang]/(live)/(public)/loyalty-page/page.tsx +++ /dev/null @@ -1,39 +0,0 @@ -import { notFound } from "next/navigation" - -import { serverClient } from "@/lib/trpc/server" - -import { Blocks } from "@/components/Loyalty/Blocks" -import Sidebar from "@/components/Loyalty/Sidebar" -import MaxWidth from "@/components/MaxWidth" - -import styles from "./page.module.css" - -import type { LangParams, PageArgs, UriParams } from "@/types/params" - -export default async function LoyaltyPage({ - params, - searchParams, -}: PageArgs) { - try { - if (!searchParams.uri) { - throw new Error("Bad URI") - } - - const loyaltyPage = await serverClient().contentstack.loyaltyPage.get({ - href: searchParams.uri, - locale: params.lang, - }) - - return ( -
- {loyaltyPage.sidebar ? : null} - - - {loyaltyPage.blocks ? : null} - -
- ) - } catch (err) { - return notFound() - } -} diff --git a/app/[lang]/(live)/(protected)/bypass/layout.module.css b/app/[lang]/(live)/error.module.css similarity index 91% rename from app/[lang]/(live)/(protected)/bypass/layout.module.css rename to app/[lang]/(live)/error.module.css index 0f59f89b1..4782b4cb4 100644 --- a/app/[lang]/(live)/(protected)/bypass/layout.module.css +++ b/app/[lang]/(live)/error.module.css @@ -1,7 +1,6 @@ .layout { --header-height: 4.5rem; - background-color: var(--Brand-Coffee-Subtle); display: grid; font-family: var(--ff-fira-sans); grid-template-rows: var(--header-height) auto 1fr; diff --git a/app/[lang]/(live)/error.tsx b/app/[lang]/(live)/error.tsx new file mode 100644 index 000000000..738e4ff6f --- /dev/null +++ b/app/[lang]/(live)/error.tsx @@ -0,0 +1,32 @@ +"use client" // Error components must be Client Components + +import { usePathname } from "next/navigation" +import { useEffect } from "react" + +import { findLang } from "@/constants/languages" + +import { firaMono, firaSans } from "@/app/[lang]/(live)/fonts" + +import styles from "./error.module.css" + +export default function Error({ + error, +}: { + error: Error & { digest?: string } +}) { + useEffect(() => { + // Log the error to an error reporting service + console.error(error) + }, [error]) + + const pathname = usePathname() + const lang = findLang(pathname) + + return ( +
+
{lang}: Something went wrong!
+
+ ) +} diff --git a/app/[lang]/(live)/layout.tsx b/app/[lang]/(live)/layout.tsx index fa6213f9f..921f5a8a0 100644 --- a/app/[lang]/(live)/layout.tsx +++ b/app/[lang]/(live)/layout.tsx @@ -2,11 +2,9 @@ import "@/app/globals.css" import "@scandic-hotels/design-system/style.css" import Script from "next/script" -import { SessionProvider } from "next-auth/react" import TrpcProvider from "@/lib/trpc/Provider" -import { auth } from "@/auth" import AdobeScript from "@/components/Current/AdobeScript" import VwoScript from "@/components/Current/VwoScript" @@ -23,7 +21,6 @@ export default async function RootLayout({ children, params, }: React.PropsWithChildren>) { - const session = await auth() return ( @@ -46,9 +43,7 @@ export default async function RootLayout({ - - {children} - + {children} diff --git a/app/[lang]/(live)/middleware-error/[status]/page.module.css b/app/[lang]/(live)/middleware-error/[status]/page.module.css new file mode 100644 index 000000000..bc92b147e --- /dev/null +++ b/app/[lang]/(live)/middleware-error/[status]/page.module.css @@ -0,0 +1,3 @@ +.layout { + font-family: var(--ff-fira-sans); +} diff --git a/app/[lang]/(live)/middleware-error/[status]/page.tsx b/app/[lang]/(live)/middleware-error/[status]/page.tsx new file mode 100644 index 000000000..d05de5699 --- /dev/null +++ b/app/[lang]/(live)/middleware-error/[status]/page.tsx @@ -0,0 +1,17 @@ +import { firaMono, firaSans } from "@/app/[lang]/(live)/fonts" + +import styles from "./page.module.css" + +import { LangParams, LayoutArgs, StatusParams } from "@/types/params" + +export default function MiddlewareError({ + params, +}: LayoutArgs) { + return ( +
+ Middleware Error {params.lang}: {params.status} +
+ ) +} diff --git a/app/[lang]/(live)/not-found.tsx b/app/[lang]/(live)/not-found.tsx index 1a6cc1ce6..7fbf34706 100644 --- a/app/[lang]/(live)/not-found.tsx +++ b/app/[lang]/(live)/not-found.tsx @@ -1,7 +1,7 @@ export default function NotFound() { return (
-

Not Found

+

Not found

Could not find requested resource

) diff --git a/app/[lang]/(live-current)/not-found.tsx b/app/[lang]/(live-current)/not-found.tsx index 1a6cc1ce6..7fbf34706 100644 --- a/app/[lang]/(live-current)/not-found.tsx +++ b/app/[lang]/(live-current)/not-found.tsx @@ -1,7 +1,7 @@ export default function NotFound() { return (
-

Not Found

+

Not found

Could not find requested resource

) diff --git a/app/[lang]/(preview)/not-found.tsx b/app/[lang]/(preview)/not-found.tsx index 1a6cc1ce6..7fbf34706 100644 --- a/app/[lang]/(preview)/not-found.tsx +++ b/app/[lang]/(preview)/not-found.tsx @@ -1,7 +1,7 @@ export default function NotFound() { return (
-

Not Found

+

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 new file mode 100644 index 000000000..ba28fbe62 --- /dev/null +++ b/app/[lang]/(preview)/preview/[contentType]/[uid]/page.tsx @@ -0,0 +1,20 @@ +import { + ContentTypeParams, + LangParams, + PageArgs, + UIDParams, +} from "@/types/params" + +export default async function PreviewPage({ + params, + searchParams, +}: PageArgs) { + return ( +
+

+ Preview for {params.contentType}:{params.uid} in {params.lang} with + params

{JSON.stringify(searchParams, null, 2)}
goes here +

+
+ ) +} diff --git a/app/[lang]/(preview)/preview/page.tsx b/app/[lang]/(preview)/preview/page.tsx deleted file mode 100644 index 8380c4437..000000000 --- a/app/[lang]/(preview)/preview/page.tsx +++ /dev/null @@ -1,3 +0,0 @@ -export default async function PreviewPage() { - return null -} diff --git a/app/[lang]/(preview-current)/not-found.tsx b/app/[lang]/(preview-current)/not-found.tsx index 1a6cc1ce6..7fbf34706 100644 --- a/app/[lang]/(preview-current)/not-found.tsx +++ b/app/[lang]/(preview-current)/not-found.tsx @@ -1,7 +1,7 @@ export default function NotFound() { return (
-

Not Found

+

Not found

Could not find requested resource

) diff --git a/app/api/web/auth/[...nextauth]/route.ts b/app/api/web/auth/[...nextauth]/route.ts index 2a4c5a442..aff3fdd0a 100644 --- a/app/api/web/auth/[...nextauth]/route.ts +++ b/app/api/web/auth/[...nextauth]/route.ts @@ -5,15 +5,15 @@ import type { NextRequest } from "next/server" export const runtime = "edge" export async function GET(req: NextRequest) { - console.log({ GET_REQ: req }) - console.log({ GET_AUTH_URL: process.env.AUTH_URL }) - console.log({ GET_NEXTAUTH_URL: process.env.NEXTAUTH_URL }) + // console.log({ GET_REQ: req }) + // console.log({ GET_AUTH_URL: process.env.AUTH_URL }) + // console.log({ GET_NEXTAUTH_URL: process.env.NEXTAUTH_URL }) return _GET(req) } export async function POST(req: NextRequest) { - console.log({ POST_REQ: req }) - console.log({ POST_AUTH_URL: process.env.AUTH_URL }) - console.log({ POST_NEXTAUTH_URL: process.env.NEXTAUTH_URL }) + // console.log({ POST_REQ: req }) + // console.log({ POST_AUTH_URL: process.env.AUTH_URL }) + // console.log({ POST_NEXTAUTH_URL: process.env.NEXTAUTH_URL }) return _POST(req) } diff --git a/app/api/web/revalidate/route.ts b/app/api/web/revalidate/route.ts index d85edb1ac..e6e34cf72 100644 --- a/app/api/web/revalidate/route.ts +++ b/app/api/web/revalidate/route.ts @@ -64,8 +64,7 @@ export async function POST(request: NextRequest) { data: { content_type, entry }, }, } = validatedData - const identifier = entry.url ?? content_type.uid - const refsTag = generateRefsResponseTag(entry.locale, identifier) + const refsTag = generateRefsResponseTag(entry.locale, entry.uid) const refTag = generateRefTag(entry.locale, content_type.uid, entry.uid) const tag = generateTag(entry.locale, entry.uid) @@ -81,7 +80,7 @@ export async function POST(request: NextRequest) { if (entry.breadcrumbs) { const breadcrumbsRefsTag = generateRefsResponseTag( entry.locale, - identifier, + entry.uid, breadcrumbsAffix ) const breadcrumbsTag = generateTag( diff --git a/app/global-error.module.css b/app/global-error.module.css new file mode 100644 index 000000000..bc92b147e --- /dev/null +++ b/app/global-error.module.css @@ -0,0 +1,3 @@ +.layout { + font-family: var(--ff-fira-sans); +} diff --git a/app/global-error.tsx b/app/global-error.tsx new file mode 100644 index 000000000..306af9bfe --- /dev/null +++ b/app/global-error.tsx @@ -0,0 +1,25 @@ +"use client" + +import { firaMono, firaSans } from "@/app/[lang]/(live)/fonts" + +import styles from "./global-error.module.css" + +export default function GlobalError({ + error, +}: { + error: Error & { digest?: string } +}) { + console.log({ global_error: error }) + + return ( + + +
+

Something went really wrong!

+
+ + + ) +} diff --git a/app/not-found.module.css b/app/not-found.module.css new file mode 100644 index 000000000..bc92b147e --- /dev/null +++ b/app/not-found.module.css @@ -0,0 +1,3 @@ +.layout { + font-family: var(--ff-fira-sans); +} diff --git a/auth.ts b/auth.ts index c5ff4e2f2..3436d544b 100644 --- a/auth.ts +++ b/auth.ts @@ -35,7 +35,6 @@ const customProvider = { }, profile(profile) { - console.log({ profile }) return { id: profile.id, sub: profile.sub, @@ -54,17 +53,9 @@ export const config = { }, callbacks: { async signIn() { - console.log("****** SIGN IN *******") - console.log(arguments) - console.log("****** END - SIGN IN *******") return true }, async session({ session, token, user }) { - console.log("****** SESSION *******") - console.log({ session }) - console.log({ token }) - console.log({ user }) - console.log("****** END - SESSION *******") if (session.user) { return { ...session, @@ -79,7 +70,6 @@ export const config = { return session }, async redirect({ baseUrl, url }) { - console.log({ redirect_baseUrl: baseUrl, redirect_url: url }) if (url.startsWith("/")) { // Allows relative callback URLs return `${baseUrl}${url}` @@ -103,16 +93,9 @@ export const config = { return baseUrl }, async authorized({ auth, request }) { - console.log("****** AUTHORIZED *******") - console.log({ auth }) - console.log({ request }) - console.log("****** END - AUTHORIZED *******") return true }, async jwt({ session, token, trigger, account }) { - console.log("****** JWT *******") - console.log({ session, token, trigger, account }) - console.log("****** END - JWT *******") if (account) { return { access_token: account.access_token, @@ -121,32 +104,32 @@ export const config = { return token }, }, - events: { - async signIn() { - console.log("#### SIGNIN EVENT ARGS ######") - console.log(arguments) - console.log("#### END - SIGNIN EVENT ARGS ######") - }, - async session() { - console.log("#### SESSION EVENT ARGS ######") - console.log(arguments) - console.log("#### END - SESSION EVENT ARGS ######") - }, - }, - logger: { - error(code, ...message) { - console.info("ERROR LOGGER") - console.error(code, message) - }, - warn(code, ...message) { - console.info("WARN LOGGER") - console.warn(code, message) - }, - debug(code, ...message) { - console.info("DEBUG LOGGER") - console.debug(code, message) - }, - }, + // events: { + // async signIn() { + // console.log("#### SIGNIN EVENT ARGS ######") + // console.log(arguments) + // console.log("#### END - SIGNIN EVENT ARGS ######") + // }, + // async session() { + // console.log("#### SESSION EVENT ARGS ######") + // console.log(arguments) + // console.log("#### END - SESSION EVENT ARGS ######") + // }, + // }, + // logger: { + // error(code, ...message) { + // console.info("ERROR LOGGER") + // console.error(code, message) + // }, + // warn(code, ...message) { + // console.info("WARN LOGGER") + // console.warn(code, message) + // }, + // debug(code, ...message) { + // console.info("DEBUG LOGGER") + // console.debug(code, message) + // }, + // }, } satisfies NextAuthConfig export const { diff --git a/app/[lang]/(live)/(public)/content-page/page.tsx b/components/ContentType/ContentPage.tsx similarity index 100% rename from app/[lang]/(live)/(public)/content-page/page.tsx rename to components/ContentType/ContentPage.tsx diff --git a/components/ContentType/LoyaltyPage.tsx b/components/ContentType/LoyaltyPage.tsx new file mode 100644 index 000000000..a7e3d07ad --- /dev/null +++ b/components/ContentType/LoyaltyPage.tsx @@ -0,0 +1,21 @@ +import { serverClient } from "@/lib/trpc/server" + +import { Blocks } from "@/components/Loyalty/Blocks" +import Sidebar from "@/components/Loyalty/Sidebar" +import MaxWidth from "@/components/MaxWidth" + +import styles from "./loyaltyPage.module.css" + +export default async function LoyaltyPage() { + const loyaltyPage = await serverClient().contentstack.loyaltyPage.get() + + return ( +
+ {loyaltyPage.sidebar ? : null} + + + {loyaltyPage.blocks ? : null} + +
+ ) +} diff --git a/app/[lang]/(live)/(public)/loyalty-page/page.module.css b/components/ContentType/loyaltyPage.module.css similarity index 100% rename from app/[lang]/(live)/(public)/loyalty-page/page.module.css rename to components/ContentType/loyaltyPage.module.css diff --git a/components/MyPages/Header/Hamburger/hamburger.module.css b/components/Header/Hamburger/hamburger.module.css similarity index 100% rename from components/MyPages/Header/Hamburger/hamburger.module.css rename to components/Header/Hamburger/hamburger.module.css diff --git a/components/MyPages/Header/Hamburger/index.tsx b/components/Header/Hamburger/index.tsx similarity index 100% rename from components/MyPages/Header/Hamburger/index.tsx rename to components/Header/Hamburger/index.tsx diff --git a/components/MyPages/Header/LanguageSwitcher/index.tsx b/components/Header/LanguageSwitcher/index.tsx similarity index 100% rename from components/MyPages/Header/LanguageSwitcher/index.tsx rename to components/Header/LanguageSwitcher/index.tsx diff --git a/components/MyPages/Header/LanguageSwitcher/language.module.css b/components/Header/LanguageSwitcher/language.module.css similarity index 100% rename from components/MyPages/Header/LanguageSwitcher/language.module.css rename to components/Header/LanguageSwitcher/language.module.css diff --git a/components/Header/Logo/index.tsx b/components/Header/Logo/index.tsx new file mode 100644 index 000000000..a1d6dd285 --- /dev/null +++ b/components/Header/Logo/index.tsx @@ -0,0 +1,15 @@ +import Link from "next/link" + +import Image from "@/components/Image" + +import styles from "./logo.module.css" + +import { LogoProps } from "@/types/components/header/logo" + +export default async function Logo({ title, height, width, src }: LogoProps) { + return ( + + {title} + + ) +} diff --git a/components/MyPages/Header/Logo/logo.module.css b/components/Header/Logo/logo.module.css similarity index 100% rename from components/MyPages/Header/Logo/logo.module.css rename to components/Header/Logo/logo.module.css diff --git a/components/MyPages/Header/header.module.css b/components/Header/header.module.css similarity index 100% rename from components/MyPages/Header/header.module.css rename to components/Header/header.module.css diff --git a/components/Header/index.tsx b/components/Header/index.tsx new file mode 100644 index 000000000..37f25583a --- /dev/null +++ b/components/Header/index.tsx @@ -0,0 +1,35 @@ +import { GetHeader } from "@/lib/graphql/Query/Header.graphql" +import { request } from "@/lib/graphql/request" + +import Logo from "./Logo" + +import styles from "./header.module.css" + +import type { LangParams } from "@/types/params" +import { HeaderQueryData } from "@/types/requests/header" + +export default async function Header({ lang }: LangParams) { + const { data } = await request(GetHeader, { + locale: lang, + }) + + if ( + !data.all_header.items.length || + !data.all_header.items?.[0].logoConnection.totalCount + ) { + return null + } + + const logo = data.all_header.items[0].logoConnection.edges[0] + + return ( +
+ +
+ ) +} diff --git a/components/Loyalty/Sidebar/JoinLoyalty/Contact/ContactRow/index.tsx b/components/Loyalty/Sidebar/JoinLoyalty/Contact/ContactRow/index.tsx index 1e395f5a8..87b5a42c6 100644 --- a/components/Loyalty/Sidebar/JoinLoyalty/Contact/ContactRow/index.tsx +++ b/components/Loyalty/Sidebar/JoinLoyalty/Contact/ContactRow/index.tsx @@ -8,9 +8,7 @@ import styles from "./contactRow.module.css" import type { ContactRowProps } from "@/types/components/loyalty/sidebar" export default async function ContactRow({ contact }: ContactRowProps) { - const data = await serverClient().contentstack.contactConfig.get({ - lang: Lang.en, - }) + const data = await serverClient().contentstack.contactConfig.get() const val = getValueFromContactConfig(contact.contact_field, data) diff --git a/components/MaxWidth/index.tsx b/components/MaxWidth/index.tsx index a947ae92b..495447a76 100644 --- a/components/MaxWidth/index.tsx +++ b/components/MaxWidth/index.tsx @@ -1,9 +1,6 @@ "use client" import { cva } from "class-variance-authority" -import { Lang } from "@/constants/languages" -import { trpc } from "@/lib/trpc/client" - import styles from "./maxWidth.module.css" import type { MaxWidthProps } from "@/types/components/max-width" @@ -15,10 +12,6 @@ export default function MaxWidth({ tag = "section", ...props }: MaxWidthProps) { - const d = trpc.contentstack.breadcrumbs.get.useQuery({ - locale: Lang.en, - href: "/my-pages/overview", - }) const Cmp = tag return } diff --git a/components/MyPages/Breadcrumbs/index.tsx b/components/MyPages/Breadcrumbs/index.tsx index 2bf69f4cf..f0fa8d566 100644 --- a/components/MyPages/Breadcrumbs/index.tsx +++ b/components/MyPages/Breadcrumbs/index.tsx @@ -1,13 +1,14 @@ import { _ } from "@/lib/translation" +import { serverClient } from "@/lib/trpc/server" import Breadcrumb from "./Breadcrumb" import BreadcrumbsWithLink from "./BreadcrumbWithLink" import styles from "./breadcrumbs.module.css" -import type { BreadcrumbsProps } from "@/types/components/myPages/breadcrumbs" +export default async function Breadcrumbs() { + const breadcrumbs = await serverClient().contentstack.breadcrumbs.get() -export default function Breadcrumbs({ breadcrumbs }: BreadcrumbsProps) { return (