From 189b00b0176883f65547fe0891236ee0aea47cd3 Mon Sep 17 00:00:00 2001 From: bandhan-majumder Date: Sun, 3 Aug 2025 21:48:48 +0530 Subject: [PATCH 1/6] add: structured data for profile pages to improve visibility --- .../src/app/members/[memberKey]/layout.tsx | 42 +++++++++- .../src/components/StructuredDataScript.tsx | 19 +++++ .../src/types/profilePageStructuredData.ts | 35 +++++++++ frontend/src/utils/structuredData.ts | 78 +++++++++++++++++++ 4 files changed, 171 insertions(+), 3 deletions(-) create mode 100644 frontend/src/components/StructuredDataScript.tsx create mode 100644 frontend/src/types/profilePageStructuredData.ts create mode 100644 frontend/src/utils/structuredData.ts diff --git a/frontend/src/app/members/[memberKey]/layout.tsx b/frontend/src/app/members/[memberKey]/layout.tsx index 8b79b5c936..5064142e22 100644 --- a/frontend/src/app/members/[memberKey]/layout.tsx +++ b/frontend/src/app/members/[memberKey]/layout.tsx @@ -1,8 +1,10 @@ import { Metadata } from 'next' import React from 'react' import { apolloClient } from 'server/apolloClient' -import { GET_USER_METADATA } from 'server/queries/userQueries' +import { GET_USER_METADATA, GET_USER_DATA } from 'server/queries/userQueries' import { generateSeoMetadata } from 'utils/metaconfig' +import { generateProfilePageStructuredData } from 'utils/structuredData' +import StructuredDataScript from 'components/StructuredDataScript' export async function generateMetadata({ params, @@ -29,6 +31,40 @@ export async function generateMetadata({ : null } -export default function UserDetailsLayout({ children }: { children: React.ReactNode }) { - return children +export default async function UserDetailsLayout({ + children, + params, +}: { + children: React.ReactNode + params: Promise<{ memberKey: string }> +}) { + const { memberKey } = await params + + try { + const { data } = await apolloClient.query({ + query: GET_USER_DATA, + variables: { + key: memberKey, + }, + }) + + const user = data?.user + + if (!user) { + return children + } + + if (user && user.login) { + const structuredData = generateProfilePageStructuredData(user) + + return ( + <> + + {children} + + ) + } + } catch { + return children + } } diff --git a/frontend/src/components/StructuredDataScript.tsx b/frontend/src/components/StructuredDataScript.tsx new file mode 100644 index 0000000000..08a74146f2 --- /dev/null +++ b/frontend/src/components/StructuredDataScript.tsx @@ -0,0 +1,19 @@ +import React from 'react' + +interface StructuredDataScriptProps { + data: Record +} + +// dangerouslySetInnerHTML injects the JSON data as a script tag. +const StructuredDataScript: React.FC = ({ data }) => { + return ( +