websites/app/annuaire/[regionSlug]/[departementSlug]/[communeSlug]/page.tsx
2024-05-06 22:35:25 +02:00

180 lines
5.6 KiB
TypeScript

import { Metadata } from "next";
import { notFound } from "next/navigation";
import {
Header,
CommunesList,
DepartementsList,
RegionList,
} from "@/components/index";
import communes, {
Commune,
getCommuneFromSlug,
getSlugFromCommune,
getCodesPostaux,
getChefLieu,
CommuneDeleguee,
} from "@/lib/communes";
import {
Content,
ContentHeader,
ContentBody,
ContentFull,
ContentHalf,
} from "@/components/Content/Content";
import departements, {
getSlugFromDepartement,
getDepartementFromSlug,
} from "@/lib/departements";
import { getRegionFromCode, getSlugFromRegion } from "@/lib/regions";
import Link from "next/link";
import { getMSPFromCodesPostaux } from "@/lib/api-annuaire-sante";
export const metadata: Metadata = {
title: "Annuaire",
description: "L'annuaire collaboratif des professionnels de la santé",
};
export async function generateStaticParams() {
return communes.map((commune) => ({
commune: getSlugFromCommune(commune),
}));
}
async function getData(codesPostaux: Array<string>) {
const res = await fetch(
`http://localhost:8000/fhir/v1/Organization?address-postalcode%3Aexact=${codesPostaux.join(
"%2C",
)}&_count=5000&type=https://mos.esante.gouv.fr/NOS/TRE_R66-CategorieEtablissement/FHIR/TRE-R66-CategorieEtablissement%7C603`,
{ cache: "force-cache" },
);
// The return value is *not* serialized
// You can return Date, Map, Set, etc.
if (!res.ok) {
// This will activate the closest `error.js` Error Boundary
throw new Error("Failed to fetch data");
}
return res.json();
}
export default async function CommunePage({
params,
}: {
params: { regionSlug: string; departementSlug: string; communeSlug: string };
}) {
const commune = getCommuneFromSlug(params.communeSlug);
if (!commune) return notFound();
const departement = getDepartementFromSlug(params.departementSlug);
if (!departement) return notFound();
const region = getRegionFromCode(departement.region);
if (!region) return notFound();
let chefLieu: Commune | Boolean = commune.chefLieu
? getChefLieu(commune)
: false;
const codesPostaux = commune.chefLieu
? [commune.chefLieu]
: commune.codesPostaux;
const msps = await getMSPFromCodesPostaux(codesPostaux);
return (
<>
<Header searchField={true} />
<Content>
<div className="bg-primary pb-24">
<div className="max-w-7xl mx-auto pt-16 px-10">
<div className="rounded-md bg-base-100 p-8 w-full flex items-center">
<div className="prose w-96 text-center">
<h1 className="pb-0 mb-0">{commune.nom}</h1>
<p className="mt-0 pt-0">{getCodesPostaux(commune)}</p>
</div>
<div className="overflow-x-auto">
<table className="table">
<tbody>
<tr>
<th>Région</th>
<td>
<Link href={`/annuaire/${getSlugFromRegion(region)}`}>
{region.nom}
</Link>
</td>
</tr>
<tr>
<th>Département</th>
<td>
<Link
href={`/annuaire/${getSlugFromRegion(
region,
)}/${getSlugFromDepartement(departement)}`}
>
{departement.nom} ({departement.code})
</Link>
</td>
</tr>
{commune.population && (
<tr>
<th>Population</th>
<td>
{commune.population.toLocaleString("fr-FR")} habiants
</td>
</tr>
)}
{chefLieu && (
<tr>
<th>Cheflieu</th>
<td>
<Link
href={`/annuaire/${getSlugFromRegion(
region,
)}/${getSlugFromDepartement(
departement,
)}/${getSlugFromCommune(chefLieu)}`}
>
{chefLieu.nom}
</Link>
</td>
</tr>
)}
</tbody>
</table>
</div>
</div>
</div>
</div>
<ContentBody>
<div className="max-w-7xl mx-auto pt-8 px-10 flex flex-wrap">
{msps.entry && (
<div className="w-6/12 pr-8">
<div className="rounded-md bg-base-100 p-8 prose">
<h2>Informations sur les {msps.total} structures</h2>
<ul>
{msps.entry.map((msp) => (
<li key={msp.resource.name}>{msp.resource.name}</li>
))}
</ul>
</div>
</div>
)}
<div className="w-6/12">
<div className="rounded-md bg-base-100 p-8">
<h2>Dirigeants et représentants de P4PILLON</h2>
</div>
</div>
</div>
<ContentFull>test</ContentFull>
</ContentBody>
</Content>
<RegionList selected={region} />
<hr></hr>
<DepartementsList selected={departement} region={region} />
<hr></hr>
<CommunesList selected={commune} departement={departement} />
</>
);
}