Skip to content

Commit c723a55

Browse files
committed
feat: SEO component prop name resolving
1 parent 42fc7c5 commit c723a55

File tree

6 files changed

+33
-21
lines changed

6 files changed

+33
-21
lines changed

Diff for: admin/src/components/CMEditView/RightLinksCompo/SeoChecks/index.jsx

+5-2
Original file line numberDiff line numberDiff line change
@@ -20,16 +20,19 @@ import { getRichTextData } from '../../utils/getRichTextData';
2020
import { useIntl } from 'react-intl';
2121
import { getTrad } from '../../../../utils/getTrad';
2222

23-
export const SeoChecks = ({ updatedAt, modifiedData, components, contentType, checks }) => {
23+
export const SeoChecks = ({ updatedAt, layout, modifiedData, components, contentType, checks }) => {
2424
const { formatMessage } = useIntl();
2525

26+
const seoPropName = Object.entries(layout.attributes).find(([, attr]) => attr.type === "component" && attr.component === 'shared.seo')[0];
27+
const seo = _.get(modifiedData, seoPropName, null);
28+
2629
const { wordCount, keywordsDensity, emptyAltCount } = getRichTextData(
30+
seo,
2731
modifiedData,
2832
components,
2933
contentType
3034
);
3135

32-
const seo = modifiedData?.seo ?? null;
3336
const hasSeo = seo && Object.keys(seo).length > 0;
3437

3538
return (

Diff for: admin/src/components/CMEditView/RightLinksCompo/Summary/BrowserPreview/index.jsx

+3-2
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,11 @@ import { Illo } from '../../../../HomePage/Main/EmptyComponentLayout/illo';
1313

1414
import { getTrad } from '../../../../../utils/getTrad';
1515

16-
export const BrowserPreview = ({ modifiedData }) => {
16+
export const BrowserPreview = ({ layout, modifiedData }) => {
1717
const { formatMessage } = useIntl();
1818

19-
const seo = get(modifiedData, 'seo', null);
19+
const seoPropName = Object.entries(layout.attributes).find(([, attr]) => attr.type === "component" && attr.component === 'shared.seo')[0];
20+
const seo = _.get(modifiedData, seoPropName, null);
2021
const metaTitle = get(seo, 'metaTitle', null);
2122
const metaDescription = get(seo, 'metaDescription', null);
2223
const keywords = get(seo, 'keywords', null);

Diff for: admin/src/components/CMEditView/RightLinksCompo/Summary/OpenGraphPreview/index.jsx

+4-2
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,12 @@ import { FacebookOGPreview } from './Facebook/index';
1010
import { TwitterOGPreview } from './X/index';
1111
import { LinkedInOGPreview } from './LinkedIn/index';
1212

13-
export const OpenGraphPreview = ({ modifiedData }) => {
13+
export const OpenGraphPreview = ({ layout, modifiedData }) => {
1414
const { formatMessage } = useIntl();
1515

16-
const { openGraph } = modifiedData?.seo;
16+
const seoPropName = Object.entries(layout.attributes).find(([, attr]) => attr.type === "component" && attr.component === 'shared.seo')[0];
17+
const seo = _.get(modifiedData, seoPropName, null);
18+
const { openGraph } = seo;
1719

1820
return (
1921
<Modal.Content labelledBy="title">

Diff for: admin/src/components/CMEditView/RightLinksCompo/Summary/index.jsx

+16-11
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ export const Summary = () => {
4545
const [localChecks, setLocalChecks] = React.useState({});
4646
const [checks, dispatch] = React.useReducer(reducer, initialState);
4747

48-
const { model, collectionType, id, form, contentType, components } = useContentManagerContext();
48+
const { layout, model, collectionType, id, form, contentType, components } = useContentManagerContext();
4949
const { values: modifiedData } = form;
5050

5151
const { metaTitle, metaDescription, openGraph } = modifiedData.seo;
@@ -56,39 +56,43 @@ export const Summary = () => {
5656
documentId: id,
5757
});
5858

59-
const getAllChecks = async (modifiedData, components, contentType) => {
59+
const getAllChecks = async (layout, modifiedData, components, contentType) => {
6060
const { data: defaultSettings } = await getSettings();
6161

62+
const seoPropName = Object.entries(layout.attributes).find(([, attr]) => attr.type === 'component' && attr.component === 'shared.seo')[0];
63+
const seo = _.get(modifiedData, seoPropName, null);
64+
6265
const { wordCount, keywordsDensity, emptyAltCount } = getRichTextData(
66+
seo,
6367
modifiedData,
6468
components,
6569
contentType
6670
);
6771

6872
let result = {
6973
...(defaultSettings[contentType?.uid]?.seoChecks?.metaTitle && {
70-
metaTitle: getMetaTitleCheckPreview(modifiedData),
74+
metaTitle: getMetaTitleCheckPreview(seo),
7175
}),
7276
...(defaultSettings[contentType?.uid]?.seoChecks?.wordCount && {
7377
wordCount: getWordCountPreview(wordCount),
7478
}),
7579
...(defaultSettings[contentType?.uid]?.seoChecks?.metaRobots && {
76-
metaRobots: metaRobotPreview(modifiedData),
80+
metaRobots: metaRobotPreview(seo),
7781
}),
7882
...(defaultSettings[contentType?.uid]?.seoChecks?.openGraph && {
79-
openGraph: openGraphPreview(modifiedData),
83+
openGraph: openGraphPreview(seo),
8084
}),
8185
...(defaultSettings[contentType?.uid]?.seoChecks?.canonicalUrl && {
82-
canonicalUrl: canonicalUrlPreview(modifiedData),
86+
canonicalUrl: canonicalUrlPreview(seo),
8387
}),
8488
...(defaultSettings[contentType?.uid]?.seoChecks?.lastUpdatedAt && {
8589
lastUpdatedAt: lastUpdatedAtPreview(modifiedData),
8690
}),
8791
...(defaultSettings[contentType?.uid]?.seoChecks?.structuredData && {
88-
structuredData: structuredDataPreview(modifiedData),
92+
structuredData: structuredDataPreview(seo),
8993
}),
9094
...(defaultSettings[contentType?.uid]?.seoChecks?.metaDescription && {
91-
metaDescription: getMetaDescriptionPreview(modifiedData),
95+
metaDescription: getMetaDescriptionPreview(seo),
9296
}),
9397
...(defaultSettings[contentType?.uid]?.seoChecks?.alternativeText && {
9498
alternativeText: getAlternativeTextPreview(emptyAltCount),
@@ -105,7 +109,7 @@ export const Summary = () => {
105109
const fetchChecks = async () => {
106110
if (!(JSON.stringify(localChecks) === JSON.stringify(checks))) {
107111
if (checks?.preview) {
108-
const status = await getAllChecks(modifiedData, components, contentType);
112+
const status = await getAllChecks(layout, modifiedData, components, contentType);
109113

110114
dispatch({
111115
type: 'UPDATE_FOR_PREVIEW',
@@ -147,7 +151,7 @@ export const Summary = () => {
147151
</Button>
148152
</Box>
149153
</Modal.Trigger>
150-
<BrowserPreview modifiedData={modifiedData} />
154+
<BrowserPreview layout={layout} modifiedData={modifiedData} />
151155
</Modal.Root>
152156
)}
153157

@@ -163,7 +167,7 @@ export const Summary = () => {
163167
</Button>
164168
</Box>
165169
</Modal.Trigger>
166-
<OpenGraphPreview modifiedData={modifiedData} />
170+
<OpenGraphPreview layout={layout} modifiedData={modifiedData} />
167171
</Modal.Root>
168172
)}
169173

@@ -181,6 +185,7 @@ export const Summary = () => {
181185
</Box>
182186
</Modal.Trigger>
183187
<SeoChecks
188+
layout={layout}
184189
updatedAt={document?.updatedAt ?? null}
185190
modifiedData={modifiedData}
186191
components={components}

Diff for: admin/src/components/CMEditView/RightLinksCompo/index.jsx

+2-2
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,10 @@ import { Summary } from './Summary';
77

88
export const SeoChecker = () => {
99
const {
10-
form: { values },
10+
layout,
1111
} = useContentManagerContext();
1212

13-
if (values?.seo) {
13+
if (Object.values(layout.attributes).some((attr) => attr.type === 'component' && attr.component === 'shared.seo')) {
1414
return <Summary />;
1515
}
1616

Diff for: admin/src/components/CMEditView/utils/getRichTextData.js

+3-2
Original file line numberDiff line numberDiff line change
@@ -170,12 +170,13 @@ const adjustIntersections = (data) => {
170170

171171
/**
172172
* Main function to retrieve richtext and block field data and calculate word count and keyword density.
173+
* @param {Object} seo - The SEO component.
173174
* @param {Object} modifiedData - The modified content data.
174175
* @param {Object} components - The components used in the content type.
175176
* @param {Object} contentType - The content type definition.
176177
* @returns {Object} - Contains word count and keyword density.
177178
*/
178-
const getRichTextData = (modifiedData, components, contentType) => {
179+
const getRichTextData = (seo, modifiedData, components, contentType) => {
179180
// Retrieve richtext and block fields
180181
const { richTextFields, blockFields } = getRichTextAndBlocksFields(
181182
contentType,
@@ -193,7 +194,7 @@ const getRichTextData = (modifiedData, components, contentType) => {
193194
let keywordsDensity = {};
194195

195196
// Extract keywords from SEO metadata
196-
const seoKeywords = modifiedData?.seo?.keywords ?? '';
197+
const seoKeywords = seo?.keywords ?? '';
197198
if (seoKeywords) {
198199
keywords = seoKeywords.toLowerCase().split(','); // Split keywords by commas
199200
}

0 commit comments

Comments
 (0)