clean up block typing

This commit is contained in:
2026-07-10 03:23:09 +02:00
parent 09207e57e2
commit ca397070ea
2 changed files with 147 additions and 57 deletions
+137 -53
View File
@@ -1,84 +1,168 @@
import dynamic from "next/dynamic";
import { RichTextBlock } from "./RichTextBlock";
import { ImageWithTextBlock } from "./ImageWithTextBlock";
import { HorizontalRuleBlock } from "./HorizontalRuleBlock";
const ImageSliderBlock = dynamic(() =>
import("./ImageSliderBlock").then((m) => m.ImageSliderBlock)
);
import { FeaturedBlock } from "./FeaturedBlock";
import type {
AccordionBlockFragment,
ContactEntityBlockFragment,
ContactListBlockFragment,
ContactSectionBlockFragment,
ContactSubsectionBlockFragment,
EmbedBlockFragment,
FactBoxBlockFragment,
FeaturedBlockFragment,
HorizontalRuleBlockFragment,
ImageSliderBlockFragment,
ImageWithTextBlockFragment,
PageSectionBlockFragment,
RichTextBlockFragment,
ScheduleBlockFragment,
} from "@/gql/graphql";
import { AccordionBlock } from "./AccordionBlock";
import { ContactEntityBlock } from "./ContactEntityBlock";
import { ContactListBlock } from "./ContactListBlock";
import { ContactSectionBlock, ContactSubsectionBlock } from "./ContactSection";
import { EmbedBlock } from "./EmbedBlock";
import { FactBoxBlock } from "./FactBoxBlock";
import { ScheduleBlock } from "./ScheduleBlock";
import { PageSectionBlock, PageSectionNavigationBlock } from "./PageSection";
import { ContactSectionBlock, ContactSubsectionBlock } from "./ContactSection";
import { ContactListBlock } from "./ContactListBlock";
import { ContactEntityBlock } from "./ContactEntityBlock";
import { FeaturedBlock } from "./FeaturedBlock";
import { HorizontalRuleBlock } from "./HorizontalRuleBlock";
import { ImageWithTextBlock } from "./ImageWithTextBlock";
import { NeufAddressSectionBlock } from "./NeufAddressSectionBlock";
import { OpeningHoursSectionBlock } from "./OpeningHoursSectionBlock";
import { PageSectionBlock, PageSectionNavigationBlock } from "./PageSection";
import { RichTextBlock } from "./RichTextBlock";
import { ScheduleBlock } from "./ScheduleBlock";
export const Blocks = ({ blocks, pageContent }: { blocks: any, pageContent?: boolean }) => {
const sections = blocks.filter(
(block: any) => block?.__typename === "PageSectionBlock"
const ImageSliderBlock = dynamic(() =>
import("./ImageSliderBlock").then((m) => m.ImageSliderBlock),
);
return blocks.map((block: any) => {
switch (block?.blockType) {
export type StreamFieldBlock = {
id?: string | null;
blockType?: string;
__typename?: string;
[key: string]: unknown;
};
export const Blocks = ({
blocks,
pageContent,
}: {
blocks?: Array<StreamFieldBlock | null> | null;
pageContent?: boolean;
}) => {
const sections = (blocks ?? []).filter(
(block) => block?.__typename === "PageSectionBlock",
) as PageSectionBlockFragment[];
return (blocks ?? []).map((block) => {
if (!block) {
return null;
}
switch (block.blockType) {
case "RichTextBlock":
return <RichTextBlock key={block.id} block={block} />;
break;
return (
<RichTextBlock
key={block.id}
block={block as RichTextBlockFragment}
/>
);
case "ImageWithTextBlock":
return <ImageWithTextBlock key={block.id} block={block} />;
break;
return (
<ImageWithTextBlock
key={block.id}
block={block as ImageWithTextBlockFragment}
/>
);
case "EmbedBlock":
return <EmbedBlock key={block.id} block={block} />;
break;
return (
<EmbedBlock key={block.id} block={block as EmbedBlockFragment} />
);
case "ImageSliderBlock":
return <ImageSliderBlock key={block.id} block={block} pageContent />;
break;
return (
<ImageSliderBlock
key={block.id}
block={block as ImageSliderBlockFragment}
pageContent
/>
);
case "HorizontalRuleBlock":
return <HorizontalRuleBlock key={block.id} block={block} />;
break;
return (
<HorizontalRuleBlock
key={block.id}
block={block as HorizontalRuleBlockFragment}
/>
);
case "FeaturedBlock":
return <FeaturedBlock key={block.id} block={block} />;
break;
return (
<FeaturedBlock
key={block.id}
block={block as FeaturedBlockFragment}
/>
);
case "AccordionBlock":
return <AccordionBlock key={block.id} block={block} />;
break;
return (
<AccordionBlock
key={block.id}
block={block as AccordionBlockFragment}
/>
);
case "FactBoxBlock":
return <FactBoxBlock key={block.id} block={block} />;
break;
return (
<FactBoxBlock key={block.id} block={block as FactBoxBlockFragment} />
);
case "ScheduleBlock":
return <ScheduleBlock key={block.id} block={block} />;
break;
return (
<ScheduleBlock
key={block.id}
block={block as ScheduleBlockFragment}
/>
);
case "PageSectionBlock":
return <PageSectionBlock key={block.id} block={block} />;
break;
return (
<PageSectionBlock
key={block.id}
block={block as PageSectionBlockFragment}
/>
);
case "PageSectionNavigationBlock":
return <PageSectionNavigationBlock sections={sections} />;
break;
return (
<PageSectionNavigationBlock key={block.id} sections={sections} />
);
case "ContactSectionBlock":
return <ContactSectionBlock key={block.id} block={block} />;
break;
return (
<ContactSectionBlock
key={block.id}
block={block as ContactSectionBlockFragment}
/>
);
case "ContactSubsectionBlock":
return <ContactSubsectionBlock key={block.id} block={block} />;
break;
return (
<ContactSubsectionBlock
key={block.id}
block={block as ContactSubsectionBlockFragment}
/>
);
case "ContactListBlock":
return <ContactListBlock key={block.id} block={block} />;
break;
return (
<ContactListBlock
key={block.id}
block={block as ContactListBlockFragment}
/>
);
case "ContactEntityBlock":
return <ContactEntityBlock key={block.id} block={block} />;
break;
return (
<ContactEntityBlock
key={block.id}
block={block as ContactEntityBlockFragment}
/>
);
case "NeufAddressSectionBlock":
return <NeufAddressSectionBlock />;
break;
return <NeufAddressSectionBlock key={block.id} />;
case "OpeningHoursSectionBlock":
return <OpeningHoursSectionBlock />;
break;
return <OpeningHoursSectionBlock key={block.id} />;
default:
console.log("unsupported block", block);
return <div>Unsupported block type {block?.blockType}</div>;
return (
<div key={block.id}>Unsupported block type {block.blockType}</div>
);
}
});
};
+8 -2
View File
@@ -1,7 +1,13 @@
import { Blocks } from "@/components/blocks/Blocks";
import { Blocks, type StreamFieldBlock } from "@/components/blocks/Blocks";
import styles from './pageContent.module.scss';
export const PageContent = ({ blocks, className }: { blocks: any; className?: string }) => {
export const PageContent = ({
blocks,
className,
}: {
blocks?: Array<StreamFieldBlock | null> | null;
className?: string;
}) => {
return (
<div className={`${styles.pageContent}${className ? ` ${className}` : ''}`}>
<Blocks blocks={blocks} pageContent />