magicui
66 строк · 1.8 Кб
1import { Doc } from "@/.contentlayer/generated";
2import { buttonVariants } from "@/components/ui/button";
3import { docsConfig } from "@/config/docs";
4import { cn } from "@/lib/utils";
5import { NavItem, NavItemWithChildren } from "@/types";
6import { ChevronLeftIcon, ChevronRightIcon } from "@radix-ui/react-icons";
7import Link from "next/link";
8
9interface DocsPagerProps {
10doc: Doc;
11}
12
13export function DocPager({ doc }: DocsPagerProps) {
14const pager = getPagerForDoc(doc);
15
16if (!pager) {
17return null;
18}
19
20return (
21<div className="flex flex-row items-center justify-between">
22{pager?.prev?.href && (
23<Link
24href={pager.prev.href}
25className={buttonVariants({ variant: "outline" })}
26>
27<ChevronLeftIcon className="mr-2 h-4 w-4" />
28{pager.prev.title}
29</Link>
30)}
31{pager?.next?.href && (
32<Link
33href={pager.next.href}
34className={cn(buttonVariants({ variant: "outline" }), "ml-auto")}
35>
36{pager.next.title}
37<ChevronRightIcon className="ml-2 h-4 w-4" />
38</Link>
39)}
40</div>
41);
42}
43
44export function getPagerForDoc(doc: Doc) {
45const flattenedLinks = [null, ...flatten(docsConfig.sidebarNav), null];
46const activeIndex = flattenedLinks.findIndex(
47(link) => doc.slug === link?.href,
48);
49const prev = activeIndex !== 0 ? flattenedLinks[activeIndex - 1] : null;
50const next =
51activeIndex !== flattenedLinks.length - 1
52? flattenedLinks[activeIndex + 1]
53: null;
54return {
55prev,
56next,
57};
58}
59
60export function flatten(links: NavItemWithChildren[]): NavItem[] {
61return links
62.reduce<NavItem[]>((flat, link) => {
63return flat.concat(link.items?.length ? flatten(link.items) : link);
64}, [])
65.filter((link) => !link?.disabled);
66}
67