diff --git a/src/components/seo/schemas/ArticleJsonLd.tsx b/src/components/seo/schemas/ArticleJsonLd.tsx new file mode 100644 index 0000000..c3ea997 --- /dev/null +++ b/src/components/seo/schemas/ArticleJsonLd.tsx @@ -0,0 +1,67 @@ +import { type Locale } from '@/i18n/config'; + +interface ArticleJsonLdProps { + title: string; + description: string; + url: string; + imageUrl: string; + datePublished: string; + dateModified?: string; + authorName?: string; + tags?: string[]; + locale: Locale; +} + +export function ArticleJsonLd({ + title, + description, + url, + imageUrl, + datePublished, + dateModified, + authorName = 'Damjan Savić', + tags = [], + locale, +}: ArticleJsonLdProps) { + const baseUrl = process.env.NEXT_PUBLIC_SITE_URL || 'https://damjan-savic.com'; + + const schema = { + '@context': 'https://schema.org', + '@type': 'Article', + headline: title, + description: description, + image: imageUrl.startsWith('http') ? imageUrl : `${baseUrl}${imageUrl}`, + url: url.startsWith('http') ? url : `${baseUrl}${url}`, + datePublished: datePublished, + dateModified: dateModified || datePublished, + author: { + '@type': 'Person', + '@id': `${baseUrl}/#person`, + name: authorName, + url: baseUrl, + }, + publisher: { + '@type': 'Organization', + '@id': `${baseUrl}/#organization`, + name: 'Damjan Savić', + logo: { + '@type': 'ImageObject', + url: `${baseUrl}/images/og-image.jpg`, + }, + }, + mainEntityOfPage: { + '@type': 'WebPage', + '@id': url.startsWith('http') ? url : `${baseUrl}${url}`, + }, + inLanguage: locale === 'de' ? 'de-DE' : locale === 'sr' ? 'sr-RS' : 'en-US', + keywords: tags.join(', '), + articleSection: 'Technology', + }; + + return ( +