---
import { toHTML } from '@portabletext/to-html';
import type { AstroComponentFactory } from 'astro/dist/runtime/server';
import AccordionSerializer from '../../serializers/Accordion.serializer.astro';
import BodyBlockSerializer from '../../serializers/BodyBlock.serializer.astro';
import SectionSerializer from '../../serializers/Section.serializer.astro';
const { blocks, serializers } = Astro.props;
const allSerializers: {
types: Record<string, AstroComponentFactory | string>;
} = {
types: {
section: SectionSerializer,
accordion: AccordionSerializer,
bodyBlock: BodyBlockSerializer,
...(serializers?.types || {}),
},
};
const stringSerializers = {
types: {
...Object.entries(allSerializers.types).reduce((acc, [key, value]) => {
if (typeof value === 'string') {
return { ...acc, [key]: value };
}
return acc;
}, {}),
},
};
---
{
blocks.map((block: { _type: string }) => {
const Serializer = allSerializers.types[block._type];
if (typeof Serializer === 'function') {
return <Serializer {...block} />;
}
return (
<Fragment
set:html={toHTML(block, {
components: stringSerializers,
})}
/>
);
})
}