mirror of
https://github.com/hanzo-apps/hanzo.ai.git
synced 2026-10-30 14:58:08 +00:00
Every public page shipped is offered, and every page offered is linked: - The nine /careers/<slug> pages (04845090) came from a dynamic segment the sitemap's list of generated pages never named. They are offered now from the one list of slugs their route builds from, each with its own canonical, where the /careers layout's had named /careers. - public/email/pool-party-launch.html shipped as a page. The bodies of the emails the site sends are MAIL in lib/publish: fetched, never indexed. - /bot/details draws what /bot draws sincee229ebc4, which also dropped the one link to it. hanzo.bot is rooted at it, so it stays, as an ALTERNATE whose canonical is /bot.
42 lines
1.1 KiB
TypeScript
42 lines
1.1 KiB
TypeScript
import { notFound } from 'next/navigation'
|
|
import type { Metadata } from 'next'
|
|
import { careerSlugs, getJobOpening } from '@/lib/careers'
|
|
import { JobView } from './JobView'
|
|
|
|
export function generateStaticParams() {
|
|
return careerSlugs.map((slug) => ({ slug }))
|
|
}
|
|
|
|
export async function generateMetadata({
|
|
params,
|
|
}: {
|
|
params: Promise<{ slug: string }>
|
|
}): Promise<Metadata> {
|
|
const { slug } = await params
|
|
const job = getJobOpening(slug)
|
|
if (!job) return { title: 'Position Not Found — Hanzo Careers' }
|
|
const title = `${job.title} (${job.department}) — Hanzo Careers`
|
|
return {
|
|
title,
|
|
description: `${job.description} Join the Hanzo team building the open AI cloud.`,
|
|
// Its own address: the /careers layout's canonical would otherwise name /careers.
|
|
alternates: { canonical: `/careers/${job.id}` },
|
|
openGraph: {
|
|
title,
|
|
description: job.description,
|
|
type: 'article',
|
|
},
|
|
}
|
|
}
|
|
|
|
export default async function Page({
|
|
params,
|
|
}: {
|
|
params: Promise<{ slug: string }>
|
|
}) {
|
|
const { slug } = await params
|
|
const job = getJobOpening(slug)
|
|
if (!job) notFound()
|
|
return <JobView job={job} />
|
|
}
|