This commit is contained in:
Iliyan Angelov
2025-12-10 01:36:00 +02:00
parent 2f6dca736a
commit 6a9e823402
84 changed files with 5293 additions and 1836 deletions

View File

@@ -9,9 +9,10 @@ import Transform from "@/components/pages/services/Transform";
import Footer from "@/components/shared/layout/footer/Footer";
import ServicesScrollProgressButton from "@/components/pages/services/ServicesScrollProgressButton";
import ServicesInitAnimations from "@/components/pages/services/ServicesInitAnimations";
import { serviceService, Service } from "@/lib/api/serviceService";
import { Service } from "@/lib/api/serviceService";
import { generateServiceMetadata } from "@/lib/seo/metadata";
import { ServiceSchema, BreadcrumbSchema } from "@/components/shared/seo/StructuredData";
import { API_CONFIG, getApiHeaders } from "@/lib/config/api";
interface ServicePageProps {
params: Promise<{
@@ -19,23 +20,59 @@ interface ServicePageProps {
}>;
}
// Generate static params for all services (optional - for better performance)
// Generate static params for all services at build time (optional - for better performance)
// This pre-generates known pages, but new pages can still be generated on-demand
export async function generateStaticParams() {
try {
const services = await serviceService.getServices();
return services.results.map((service: Service) => ({
// Use internal API URL for server-side requests
const apiUrl = process.env.INTERNAL_API_URL || process.env.NEXT_PUBLIC_API_URL || 'http://127.0.0.1:1086';
const response = await fetch(
`${apiUrl}/api/services/`,
{
method: 'GET',
headers: getApiHeaders(),
next: { revalidate: 60 }, // Revalidate every minute for faster image updates
}
);
if (!response.ok) {
console.error('Error fetching services for static params:', response.status);
return [];
}
const data = await response.json();
const services = data.results || data;
return services.map((service: Service) => ({
slug: service.slug,
}));
} catch (error) {
console.error('Error generating static params for services:', error);
return [];
}
}
// Generate enhanced metadata for each service page
export async function generateMetadata({ params }: ServicePageProps) {
const { slug } = await params;
try {
const { slug } = await params;
const service = await serviceService.getServiceBySlug(slug);
// Use internal API URL for server-side requests
const apiUrl = process.env.INTERNAL_API_URL || process.env.NEXT_PUBLIC_API_URL || 'http://127.0.0.1:1086';
const response = await fetch(
`${apiUrl}/api/services/${slug}/`,
{
method: 'GET',
headers: getApiHeaders(),
next: { revalidate: 60 }, // Revalidate every minute for faster image updates
}
);
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
const service = await response.json();
return generateServiceMetadata(service);
} catch (error) {
@@ -47,23 +84,34 @@ export async function generateMetadata({ params }: ServicePageProps) {
}
const ServicePage = async ({ params }: ServicePageProps) => {
let service: Service;
const { slug } = await params;
try {
const { slug } = await params;
service = await serviceService.getServiceBySlug(slug);
} catch (error) {
notFound();
}
// Use internal API URL for server-side requests
const apiUrl = process.env.INTERNAL_API_URL || process.env.NEXT_PUBLIC_API_URL || 'http://127.0.0.1:1086';
const response = await fetch(
`${apiUrl}/api/services/${slug}/`,
{
method: 'GET',
headers: getApiHeaders(),
next: { revalidate: 60 }, // Revalidate every minute for faster image updates
}
);
// Breadcrumb data for structured data
const breadcrumbItems = [
{ name: 'Home', url: '/' },
{ name: 'Services', url: '/services' },
{ name: service.title, url: `/services/${service.slug}` },
];
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
return (
const service: Service = await response.json();
// Breadcrumb data for structured data
const breadcrumbItems = [
{ name: 'Home', url: '/' },
{ name: 'Services', url: '/services' },
{ name: service.title, url: `/services/${service.slug}` },
];
return (
<div className="enterprise-app">
{/* SEO Structured Data */}
<ServiceSchema service={service} />
@@ -82,7 +130,10 @@ const ServicePage = async ({ params }: ServicePageProps) => {
<ServicesScrollProgressButton />
<ServicesInitAnimations />
</div>
);
);
} catch (error) {
notFound();
}
};
export default ServicePage;