126 lines
3.7 KiB
TypeScript
126 lines
3.7 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 static params for all job positions 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 {
|
|
// 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/career/jobs`,
|
|
{
|
|
method: 'GET',
|
|
headers: getApiHeaders(),
|
|
next: { revalidate: 60 }, // Revalidate every minute
|
|
}
|
|
);
|
|
|
|
if (!response.ok) {
|
|
console.error('Error fetching jobs for static params:', response.status);
|
|
return [];
|
|
}
|
|
|
|
const data = await response.json();
|
|
const jobs = data.results || data;
|
|
|
|
return jobs.map((job: JobPosition) => ({
|
|
slug: job.slug,
|
|
}));
|
|
} catch (error) {
|
|
console.error('Error generating static params for jobs:', error);
|
|
return [];
|
|
}
|
|
}
|
|
|
|
// Generate metadata for each job page
|
|
export async function generateMetadata({ params }: JobPageProps): Promise<Metadata> {
|
|
const { slug } = await params;
|
|
|
|
try {
|
|
// 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/career/jobs/${slug}`,
|
|
{
|
|
method: 'GET',
|
|
headers: getApiHeaders(),
|
|
next: { revalidate: 60 }, // Revalidate every minute
|
|
}
|
|
);
|
|
|
|
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 {
|
|
// 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/career/jobs/${slug}`,
|
|
{
|
|
method: 'GET',
|
|
headers: getApiHeaders(),
|
|
next: { revalidate: 60 }, // Revalidate every minute
|
|
}
|
|
);
|
|
|
|
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;
|