Files
GNX-WEB/frontEnd/app/career/[slug]/page.tsx
Iliyan Angelov 4c8b71fe0d updates
2025-11-25 09:21:00 +02:00

90 lines
2.4 KiB
TypeScript

import { Metadata } from 'next';
import { notFound } from 'next/navigation';
import Header from "@/components/shared/layout/header/Header";
import JobSingle from "@/components/pages/career/JobSingle";
import Footer from "@/components/shared/layout/footer/Footer";
import CareerScrollProgressButton from "@/components/pages/career/CareerScrollProgressButton";
import CareerInitAnimations from "@/components/pages/career/CareerInitAnimations";
import { JobPosition } from "@/lib/api/careerService";
import { generateCareerMetadata } from "@/lib/seo/metadata";
import { API_CONFIG, getApiHeaders } from "@/lib/config/api";
interface JobPageProps {
params: Promise<{
slug: string;
}>;
}
// Generate metadata for each job page
export async function generateMetadata({ params }: JobPageProps): Promise<Metadata> {
const { slug } = await params;
try {
const response = await fetch(
`${API_CONFIG.BASE_URL}/api/career/jobs/${slug}/`,
{
method: 'GET',
headers: getApiHeaders(),
next: { revalidate: 3600 }, // Revalidate every hour
}
);
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
const job = await response.json();
return generateCareerMetadata({
title: job.title,
description: job.short_description || job.about_role,
slug: job.slug,
location: job.location,
department: job.department,
employment_type: job.employment_type,
});
} catch (error) {
return {
title: 'Job Not Found | GNX Soft',
description: 'The requested job position could not be found.',
};
}
}
const JobPage = async ({ params }: JobPageProps) => {
const { slug } = await params;
try {
const response = await fetch(
`${API_CONFIG.BASE_URL}/api/career/jobs/${slug}/`,
{
method: 'GET',
headers: getApiHeaders(),
next: { revalidate: 3600 }, // Revalidate every hour
}
);
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
const job: JobPosition = await response.json();
return (
<div className="tp-app">
<Header />
<main>
<JobSingle job={job} />
</main>
<Footer />
<CareerScrollProgressButton />
<CareerInitAnimations />
</div>
);
} catch (error) {
notFound();
}
};
export default JobPage;