Skip to content

Commit a3790bf

Browse files
authored
Merge pull request #152 from episerver/bugfix/CMS-45880-richtext-custom-component-key
CMS-45880 Refactor RichText component to simplify element and leaf handling
2 parents 8b61440 + cf3b05f commit a3790bf

File tree

3 files changed

+30
-22
lines changed

3 files changed

+30
-22
lines changed

packages/optimizely-cms-sdk/src/react/richText/component.tsx

Lines changed: 2 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -24,26 +24,14 @@ import { createReactRenderer } from './renderer.js';
2424
*/
2525
export const RichText: React.FC<RichTextProps> = ({
2626
content,
27-
elements: customElements = {},
28-
leafs: customLeafs = {},
27+
elements = {},
28+
leafs = {},
2929
elementFallback,
3030
leafFallback,
3131
decodeHtmlEntities = true,
3232
}) => {
3333
const nodes = Array.isArray(content?.children) ? content.children : [];
3434

35-
// Merge default components with user overrides
36-
const elements = {
37-
...generateDefaultElements(),
38-
...customElements,
39-
};
40-
41-
// Merge default leafs with user overrides
42-
const leafs = {
43-
...generateDefaultLeafs(),
44-
...customLeafs,
45-
};
46-
4735
const renderConfig = {
4836
decodeHtmlEntities,
4937
elementFallback,

packages/optimizely-cms-sdk/src/react/richText/renderer.ts

Lines changed: 28 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -40,14 +40,34 @@ export class ReactRichTextRenderer extends BaseRichTextRenderer<
4040
constructor(config: Partial<ReactRendererConfig> = {}) {
4141
super(config);
4242

43+
// Convert custom element keys to lowercase for consistent lookup
44+
const lowercaseElements = config.elements
45+
? Object.fromEntries(
46+
Object.entries(config.elements).map(([key, value]) => [
47+
key.toLowerCase(),
48+
value,
49+
])
50+
)
51+
: {};
52+
4353
this.elements = {
4454
...generateDefaultElements(),
45-
...config.elements,
55+
...lowercaseElements,
4656
};
4757

58+
// Convert custom leaf keys to lowercase for consistent lookup
59+
const lowercaseLeafs = config.leafs
60+
? Object.fromEntries(
61+
Object.entries(config.leafs).map(([key, value]) => [
62+
key.toLowerCase(),
63+
value,
64+
])
65+
)
66+
: {};
67+
4868
this.leafs = {
4969
...generateDefaultLeafs(),
50-
...config.leafs,
70+
...lowercaseLeafs,
5171
};
5272
}
5373

@@ -114,12 +134,15 @@ export class ReactRichTextRenderer extends BaseRichTextRenderer<
114134
// Apply marks by wrapping with leaf components
115135
for (let markIndex = 0; markIndex < node.marks.length; markIndex++) {
116136
const mark = node.marks[markIndex];
117-
const LeafComponent = this.leafs[mark] || this.getDefaultLeaf(mark);
137+
// Normalize mark to lowercase for consistent lookup
138+
const normalizedMark = mark.toLowerCase();
139+
const LeafComponent =
140+
this.leafs[normalizedMark] || this.getDefaultLeaf(normalizedMark);
118141

119142
// Create leaf data
120143
const leafData = {
121144
text: decodedText,
122-
[mark]: true,
145+
[mark]: true, // Keep original mark name in the data
123146
};
124147

125148
element = React.createElement(
@@ -128,7 +151,7 @@ export class ReactRichTextRenderer extends BaseRichTextRenderer<
128151
leaf: leafData,
129152
attributes: {},
130153
text: decodedText,
131-
key: `leaf-${mark}-${index}-${markIndex}`, // Unique key for each leaf
154+
key: `leaf-${normalizedMark}-${index}-${markIndex}`, // Use normalized mark for key
132155
},
133156
element
134157
);

samples/nextjs-template/src/components/AboutUs.tsx

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
import { contentType, Infer } from '@optimizely/cms-sdk';
2-
import { getPreviewUtils } from '@optimizely/cms-sdk/react/server';
32
import { RichText, ElementProps } from '@optimizely/cms-sdk/react/richText';
43

54
export const AboutUsContentType = contentType({
@@ -31,7 +30,6 @@ const customHeadingTwo = (props: ElementProps) => {
3130
};
3231

3332
export default function AboutUs({ opti }: AboutUsProps) {
34-
const { pa } = getPreviewUtils(opti);
3533
return (
3634
<section className="about-us">
3735
{opti.image && (
@@ -43,7 +41,6 @@ export default function AboutUs({ opti }: AboutUsProps) {
4341
<div className="about-us-content">
4442
<div className="about-us-text">
4543
<RichText
46-
{...pa('body')}
4744
content={opti.body?.json}
4845
elements={{
4946
'heading-two': customHeadingTwo,

0 commit comments

Comments
 (0)