66 lines
1.4 KiB
TypeScript
66 lines
1.4 KiB
TypeScript
import { type Locale } from '@/i18n/config';
|
|
|
|
interface SoftwareAppJsonLdProps {
|
|
name: string;
|
|
description: string;
|
|
applicationCategory: string;
|
|
operatingSystem?: string;
|
|
offers?: {
|
|
price: string;
|
|
priceCurrency: string;
|
|
};
|
|
aggregateRating?: {
|
|
ratingValue: string;
|
|
ratingCount: string;
|
|
};
|
|
locale: Locale;
|
|
}
|
|
|
|
export function SoftwareAppJsonLd({
|
|
name,
|
|
description,
|
|
applicationCategory,
|
|
operatingSystem = 'Web',
|
|
offers,
|
|
aggregateRating,
|
|
locale,
|
|
}: SoftwareAppJsonLdProps) {
|
|
const baseUrl = process.env.NEXT_PUBLIC_SITE_URL || 'https://damjan-savic.com';
|
|
|
|
const schema: Record<string, unknown> = {
|
|
'@context': 'https://schema.org',
|
|
'@type': 'SoftwareApplication',
|
|
name: name,
|
|
description: description,
|
|
applicationCategory: applicationCategory,
|
|
operatingSystem: operatingSystem,
|
|
author: {
|
|
'@id': `${baseUrl}/#person`,
|
|
},
|
|
inLanguage: locale === 'de' ? 'de-DE' : locale === 'sr' ? 'sr-RS' : 'en-US',
|
|
};
|
|
|
|
if (offers) {
|
|
schema.offers = {
|
|
'@type': 'Offer',
|
|
price: offers.price,
|
|
priceCurrency: offers.priceCurrency,
|
|
};
|
|
}
|
|
|
|
if (aggregateRating) {
|
|
schema.aggregateRating = {
|
|
'@type': 'AggregateRating',
|
|
ratingValue: aggregateRating.ratingValue,
|
|
ratingCount: aggregateRating.ratingCount,
|
|
};
|
|
}
|
|
|
|
return (
|
|
<script
|
|
type="application/ld+json"
|
|
dangerouslySetInnerHTML={{ __html: JSON.stringify(schema) }}
|
|
/>
|
|
);
|
|
}
|