From 1a921940e835b748cb709c43032d77f9647475a5 Mon Sep 17 00:00:00 2001 From: Linus Flood Date: Fri, 25 Oct 2024 10:59:34 +0200 Subject: [PATCH 01/10] feat: #sw-694 using suspense when loading dynamic content and breadcrumbs --- .../my-pages/@breadcrumbs/[...path]/page.tsx | 8 +- .../[contentType]/[uid]/@breadcrumbs/page.tsx | 8 +- .../(public)/[contentType]/[uid]/page.tsx | 2 +- .../DynamicContent/OverviewTable/index.tsx | 7 +- components/Blocks/DynamicContent/index.tsx | 106 ++++++++++-------- 5 files changed, 79 insertions(+), 52 deletions(-) diff --git a/app/[lang]/(live)/(protected)/my-pages/@breadcrumbs/[...path]/page.tsx b/app/[lang]/(live)/(protected)/my-pages/@breadcrumbs/[...path]/page.tsx index a5b818f77..85f346971 100644 --- a/app/[lang]/(live)/(protected)/my-pages/@breadcrumbs/[...path]/page.tsx +++ b/app/[lang]/(live)/(protected)/my-pages/@breadcrumbs/[...path]/page.tsx @@ -1,3 +1,5 @@ +import { Suspense } from "react" + import Breadcrumbs from "@/components/Breadcrumbs" import { setLang } from "@/i18n/serverContext" @@ -6,5 +8,9 @@ import { LangParams, PageArgs } from "@/types/params" export default function AllBreadcrumbs({ params }: PageArgs) { setLang(params.lang) - return + return ( + + + + ) } diff --git a/app/[lang]/(live)/(public)/[contentType]/[uid]/@breadcrumbs/page.tsx b/app/[lang]/(live)/(public)/[contentType]/[uid]/@breadcrumbs/page.tsx index 4119f48e3..1e6dc2277 100644 --- a/app/[lang]/(live)/(public)/[contentType]/[uid]/@breadcrumbs/page.tsx +++ b/app/[lang]/(live)/(public)/[contentType]/[uid]/@breadcrumbs/page.tsx @@ -1,3 +1,5 @@ +import { Suspense } from "react" + import Breadcrumbs from "@/components/Breadcrumbs" import { setLang } from "@/i18n/serverContext" @@ -6,5 +8,9 @@ import { LangParams, PageArgs } from "@/types/params" export default function PageBreadcrumbs({ params }: PageArgs) { setLang(params.lang) - return + return ( + + + + ) } diff --git a/app/[lang]/(live)/(public)/[contentType]/[uid]/page.tsx b/app/[lang]/(live)/(public)/[contentType]/[uid]/page.tsx index cbb83a9dc..08fa09422 100644 --- a/app/[lang]/(live)/(public)/[contentType]/[uid]/page.tsx +++ b/app/[lang]/(live)/(public)/[contentType]/[uid]/page.tsx @@ -16,7 +16,7 @@ import { export { generateMetadata } from "@/utils/generateMetadata" -export default async function ContentTypePage({ +export default function ContentTypePage({ params, }: PageArgs) { setLang(params.lang) diff --git a/components/Blocks/DynamicContent/OverviewTable/index.tsx b/components/Blocks/DynamicContent/OverviewTable/index.tsx index 866a0c7d6..e5c23b370 100644 --- a/components/Blocks/DynamicContent/OverviewTable/index.tsx +++ b/components/Blocks/DynamicContent/OverviewTable/index.tsx @@ -9,8 +9,11 @@ export default async function OverviewTable({ dynamic_content, firstItem, }: OverviewTableProps) { - const levels = await serverClient().contentstack.rewards.all() - const membershipLevel = await serverClient().user.safeMembershipLevel() + const [levels, membershipLevel] = await Promise.all([ + serverClient().contentstack.rewards.all(), + serverClient().user.safeMembershipLevel(), + ]) + return ( - case DynamicContentEnum.Blocks.components.earn_and_burn: - return - case DynamicContentEnum.Blocks.components.expiring_points: - return env.HIDE_FOR_NEXT_RELEASE ? null : ( - - ) - case DynamicContentEnum.Blocks.components.how_it_works: - return ( - - ) - case DynamicContentEnum.Blocks.components.loyalty_levels: - return ( - - ) - case DynamicContentEnum.Blocks.components.membership_overview: - return - case DynamicContentEnum.Blocks.components.next_benefits: - return - case DynamicContentEnum.Blocks.components.overview_table: - return ( - - ) - case DynamicContentEnum.Blocks.components.points_overview: - return - case DynamicContentEnum.Blocks.components.previous_stays: - return - case DynamicContentEnum.Blocks.components.sign_up_form: - return - case DynamicContentEnum.Blocks.components.sign_up_verification: - return - case DynamicContentEnum.Blocks.components.soonest_stays: - return - case DynamicContentEnum.Blocks.components.upcoming_stays: - return - default: - return null - } + return ( + }> + {(() => { + switch (dynamic_content.component) { + case DynamicContentEnum.Blocks.components.current_benefits: + return + case DynamicContentEnum.Blocks.components.earn_and_burn: + return + case DynamicContentEnum.Blocks.components.expiring_points: + return env.HIDE_FOR_NEXT_RELEASE ? null : ( + + ) + case DynamicContentEnum.Blocks.components.how_it_works: + return ( + + ) + case DynamicContentEnum.Blocks.components.loyalty_levels: + return ( + + ) + case DynamicContentEnum.Blocks.components.membership_overview: + return + case DynamicContentEnum.Blocks.components.next_benefits: + return + case DynamicContentEnum.Blocks.components.overview_table: + return ( + + ) + case DynamicContentEnum.Blocks.components.points_overview: + return + case DynamicContentEnum.Blocks.components.previous_stays: + return + case DynamicContentEnum.Blocks.components.sign_up_form: + return + case DynamicContentEnum.Blocks.components.sign_up_verification: + return + case DynamicContentEnum.Blocks.components.soonest_stays: + return + case DynamicContentEnum.Blocks.components.upcoming_stays: + return + default: + return null + } + })()} + + ) } From 9f813bebfe5c6a2bf7f2d21340879b1dfaa18cb8 Mon Sep 17 00:00:00 2001 From: Linus Flood Date: Fri, 25 Oct 2024 11:48:20 +0200 Subject: [PATCH 02/10] Refactor and built a breadcrums skeleton --- .../my-pages/@breadcrumbs/[...path]/page.tsx | 3 +- .../[contentType]/[uid]/@breadcrumbs/page.tsx | 3 +- components/Blocks/DynamicContent/index.tsx | 104 +++++++++--------- .../Breadcrumbs/BreadcrumbsSkeleton.tsx | 31 ++++++ 4 files changed, 88 insertions(+), 53 deletions(-) create mode 100644 components/Breadcrumbs/BreadcrumbsSkeleton.tsx diff --git a/app/[lang]/(live)/(protected)/my-pages/@breadcrumbs/[...path]/page.tsx b/app/[lang]/(live)/(protected)/my-pages/@breadcrumbs/[...path]/page.tsx index 85f346971..6775fd188 100644 --- a/app/[lang]/(live)/(protected)/my-pages/@breadcrumbs/[...path]/page.tsx +++ b/app/[lang]/(live)/(protected)/my-pages/@breadcrumbs/[...path]/page.tsx @@ -1,6 +1,7 @@ import { Suspense } from "react" import Breadcrumbs from "@/components/Breadcrumbs" +import BreadcrumbsSkeleton from "@/components/Breadcrumbs/BreadcrumbsSkeleton" import { setLang } from "@/i18n/serverContext" import { LangParams, PageArgs } from "@/types/params" @@ -9,7 +10,7 @@ export default function AllBreadcrumbs({ params }: PageArgs) { setLang(params.lang) return ( - + }> ) diff --git a/app/[lang]/(live)/(public)/[contentType]/[uid]/@breadcrumbs/page.tsx b/app/[lang]/(live)/(public)/[contentType]/[uid]/@breadcrumbs/page.tsx index 1e6dc2277..ec8f14553 100644 --- a/app/[lang]/(live)/(public)/[contentType]/[uid]/@breadcrumbs/page.tsx +++ b/app/[lang]/(live)/(public)/[contentType]/[uid]/@breadcrumbs/page.tsx @@ -1,6 +1,7 @@ import { Suspense } from "react" import Breadcrumbs from "@/components/Breadcrumbs" +import BreadcrumbsSkeleton from "@/components/Breadcrumbs/BreadcrumbsSkeleton" import { setLang } from "@/i18n/serverContext" import { LangParams, PageArgs } from "@/types/params" @@ -9,7 +10,7 @@ export default function PageBreadcrumbs({ params }: PageArgs) { setLang(params.lang) return ( - + }> ) diff --git a/components/Blocks/DynamicContent/index.tsx b/components/Blocks/DynamicContent/index.tsx index c0777de16..bf816e3a8 100644 --- a/components/Blocks/DynamicContent/index.tsx +++ b/components/Blocks/DynamicContent/index.tsx @@ -27,57 +27,59 @@ export default function DynamicContent({ }: DynamicContentProps) { return ( }> - {(() => { - switch (dynamic_content.component) { - case DynamicContentEnum.Blocks.components.current_benefits: - return - case DynamicContentEnum.Blocks.components.earn_and_burn: - return - case DynamicContentEnum.Blocks.components.expiring_points: - return env.HIDE_FOR_NEXT_RELEASE ? null : ( - - ) - case DynamicContentEnum.Blocks.components.how_it_works: - return ( - - ) - case DynamicContentEnum.Blocks.components.loyalty_levels: - return ( - - ) - case DynamicContentEnum.Blocks.components.membership_overview: - return - case DynamicContentEnum.Blocks.components.next_benefits: - return - case DynamicContentEnum.Blocks.components.overview_table: - return ( - - ) - case DynamicContentEnum.Blocks.components.points_overview: - return - case DynamicContentEnum.Blocks.components.previous_stays: - return - case DynamicContentEnum.Blocks.components.sign_up_form: - return - case DynamicContentEnum.Blocks.components.sign_up_verification: - return - case DynamicContentEnum.Blocks.components.soonest_stays: - return - case DynamicContentEnum.Blocks.components.upcoming_stays: - return - default: - return null - } - })()} + {renderDynamicComponent(dynamic_content, firstItem)} ) } + +function renderDynamicComponent( + dynamic_content: DynamicContentProps["dynamic_content"], + firstItem: DynamicContentProps["firstItem"] +) { + switch (dynamic_content.component) { + case DynamicContentEnum.Blocks.components.current_benefits: + return + case DynamicContentEnum.Blocks.components.earn_and_burn: + return + case DynamicContentEnum.Blocks.components.expiring_points: + return env.HIDE_FOR_NEXT_RELEASE ? null : ( + + ) + case DynamicContentEnum.Blocks.components.how_it_works: + return ( + + ) + case DynamicContentEnum.Blocks.components.loyalty_levels: + return ( + + ) + case DynamicContentEnum.Blocks.components.membership_overview: + return + case DynamicContentEnum.Blocks.components.next_benefits: + return + case DynamicContentEnum.Blocks.components.overview_table: + return ( + + ) + case DynamicContentEnum.Blocks.components.points_overview: + return + case DynamicContentEnum.Blocks.components.previous_stays: + return + case DynamicContentEnum.Blocks.components.sign_up_form: + return + case DynamicContentEnum.Blocks.components.sign_up_verification: + return + case DynamicContentEnum.Blocks.components.soonest_stays: + return + case DynamicContentEnum.Blocks.components.upcoming_stays: + return + default: + return null + } +} diff --git a/components/Breadcrumbs/BreadcrumbsSkeleton.tsx b/components/Breadcrumbs/BreadcrumbsSkeleton.tsx new file mode 100644 index 000000000..31b3b8ec6 --- /dev/null +++ b/components/Breadcrumbs/BreadcrumbsSkeleton.tsx @@ -0,0 +1,31 @@ +import { ChevronRightIcon, HouseIcon } from "@/components/Icons" +import Link from "@/components/TempDesignSystem/Link" +import Footnote from "@/components/TempDesignSystem/Text/Footnote" + +import styles from "./breadcrumbs.module.css" + +export default function BreadcrumbsSkeleton() { + return ( + + ) +} From 83a88f33a72576193632f5500992413af7940535 Mon Sep 17 00:00:00 2001 From: Linus Flood Date: Fri, 25 Oct 2024 13:10:08 +0200 Subject: [PATCH 03/10] Suspense on Sidebar --- app/[lang]/(live)/(protected)/my-pages/layout.tsx | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/app/[lang]/(live)/(protected)/my-pages/layout.tsx b/app/[lang]/(live)/(protected)/my-pages/layout.tsx index f5b84dbd7..4f6054b45 100644 --- a/app/[lang]/(live)/(protected)/my-pages/layout.tsx +++ b/app/[lang]/(live)/(protected)/my-pages/layout.tsx @@ -1,3 +1,6 @@ +import { Suspense } from "react" + +import LoadingSpinner from "@/components/LoadingSpinner" import Sidebar from "@/components/MyPages/Sidebar" import styles from "./layout.module.css" @@ -13,7 +16,9 @@ export default async function MyPagesLayout({
{breadcrumbs}
- + }> + + {children}
From 69566c5cdf0386efb3b25e8aa998c00d04876cd6 Mon Sep 17 00:00:00 2001 From: Linus Flood Date: Fri, 25 Oct 2024 13:39:10 +0200 Subject: [PATCH 04/10] Using span instead of Link --- components/Breadcrumbs/BreadcrumbsSkeleton.tsx | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/components/Breadcrumbs/BreadcrumbsSkeleton.tsx b/components/Breadcrumbs/BreadcrumbsSkeleton.tsx index 31b3b8ec6..6841c2dba 100644 --- a/components/Breadcrumbs/BreadcrumbsSkeleton.tsx +++ b/components/Breadcrumbs/BreadcrumbsSkeleton.tsx @@ -1,5 +1,4 @@ import { ChevronRightIcon, HouseIcon } from "@/components/Icons" -import Link from "@/components/TempDesignSystem/Link" import Footnote from "@/components/TempDesignSystem/Text/Footnote" import styles from "./breadcrumbs.module.css" @@ -9,14 +8,9 @@ export default function BreadcrumbsSkeleton() {