import type { NavigationSubItem } from "@/libs/navigation"; import type { JSX } from "solid-js"; import { usePageContext } from "vike-solid/usePageContext"; import { cleanProps } from "@/utils/cleanProps"; import { navigation } from "@/libs/navigation"; import { Link } from "@/components/Link"; import clsx from "clsx"; function ArrowIcon(props: JSX.IntrinsicElements["svg"]) { return ( ); } type PageLinkProps = Omit & { title: string; href: string; dir?: "previous" | "next"; }; function PageLink(props: PageLinkProps) { const getPageCategory = () => navigation.find((section) => { return section.links.some( (link) => link.href === props.href || link.subitems.some((subitem) => subitem.href === props.href), ); }); return ( {props.dir === "next" ? "Suivant" : "Précédent"} {getPageCategory() && ( {getPageCategory()?.title} )} {props.title} ); } export function PrevNextLinks() { const pageContext = usePageContext(); const allLinks = navigation .sort((a, b) => { // positions order (for sorting): // 1. start // 2. auto | undefined // 3. end if (a.position === "start" && b.position !== "start") return -1; if (a.position !== "start" && b.position === "start") return 1; if (a.position === "end" && b.position !== "end") return 1; if (a.position !== "end" && b.position === "end") return -1; if (a.position === "auto" && b.position !== "auto") return -1; if (a.position !== "auto" && b.position === "auto") return 1; if (a.position === undefined && b.position !== undefined) return -1; if (a.position !== undefined && b.position === undefined) return 1; return 0; }) .flatMap((section) => section.links) .flatMap((link) => { return link.subitems ? [link, ...link.subitems] : link; }); const getNeighboringLinks = () => { const linkIndex = allLinks.findIndex( (link) => link.href === pageContext.urlPathname, ); if (linkIndex === -1) return [null, null]; const previousPage = allLinks[linkIndex - 1] || null; let nextPage = allLinks[linkIndex + 1] || null; if (nextPage?.href === pageContext.urlPathname) { nextPage = allLinks[linkIndex + 2] || null; } return [previousPage, nextPage]; }; if (getNeighboringLinks().length === 0) return null; return ( {getNeighboringLinks()[0] && ( )} {getNeighboringLinks()[1] && ( )} ); }
{getPageCategory() && ( {getPageCategory()?.title} )} {props.title}