| 
									
										
										
										
											2023-12-25 17:21:39 +08:00
										 |  |  | import { Sheet, SheetContent, SheetHeader, SheetTitle, SheetTrigger } from "@/components/ui/sheet"; | 
					
						
							| 
									
										
										
										
											2024-01-15 11:44:48 +08:00
										 |  |  | import { useActiveHeading } from "@/hooks/useActiveHeading"; | 
					
						
							| 
									
										
										
										
											2024-01-04 12:30:29 +08:00
										 |  |  | import useDrawerTOCState from "@/stores/useDrawerTOCState"; | 
					
						
							| 
									
										
										
										
											2024-08-14 12:57:22 +08:00
										 |  |  | import type { TTOCItem } from "@/types/toc.type"; | 
					
						
							| 
									
										
										
										
											2023-12-25 17:21:39 +08:00
										 |  |  | import Link from "next/link"; | 
					
						
							| 
									
										
										
										
											2024-01-15 11:44:48 +08:00
										 |  |  | import { MdMenuBook } from "react-icons/md"; | 
					
						
							|  |  |  | import { twMerge } from "tailwind-merge"; | 
					
						
							| 
									
										
										
										
											2023-12-25 17:21:39 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-04 11:34:27 +08:00
										 |  |  | export const DrawerTOC = (props: { data: TTOCItem[] }) => { | 
					
						
							| 
									
										
										
										
											2024-01-04 12:30:29 +08:00
										 |  |  |   const isTOCOpen = useDrawerTOCState((state) => state.isOpen); | 
					
						
							|  |  |  |   const setIsTOCOpen = useDrawerTOCState((state) => state.changeDrawerTOCOpen); | 
					
						
							| 
									
										
										
										
											2024-01-15 11:44:48 +08:00
										 |  |  |   const activeId = useActiveHeading(props.data.map((item) => `#${item.anchorId}`)); | 
					
						
							| 
									
										
										
										
											2023-12-25 17:21:39 +08:00
										 |  |  |   return ( | 
					
						
							| 
									
										
										
										
											2024-04-03 22:08:27 +08:00
										 |  |  |     <Sheet onOpenChange={setIsTOCOpen} open={isTOCOpen}> | 
					
						
							| 
									
										
										
										
											2023-12-25 17:21:39 +08:00
										 |  |  |       <SheetTrigger | 
					
						
							| 
									
										
										
										
											2024-08-14 12:57:22 +08:00
										 |  |  |         className="fixed right-5 bottom-16 border border-gray-700 bg-white shadow-xl dark:border-gray-500 dark:bg-black" | 
					
						
							| 
									
										
										
										
											2024-04-03 22:08:27 +08:00
										 |  |  |         title="Open the table of contents" | 
					
						
							| 
									
										
										
										
											2023-12-25 17:21:39 +08:00
										 |  |  |       > | 
					
						
							| 
									
										
										
										
											2024-04-03 22:08:27 +08:00
										 |  |  |         <div className="p-1 font-bold" onClick={() => setIsTOCOpen(!isTOCOpen)} title="Open the table of contents"> | 
					
						
							| 
									
										
										
										
											2024-01-15 11:44:48 +08:00
										 |  |  |           <MdMenuBook className="text-3xl" /> | 
					
						
							| 
									
										
										
										
											2024-01-04 15:53:16 +08:00
										 |  |  |         </div> | 
					
						
							| 
									
										
										
										
											2023-12-25 17:21:39 +08:00
										 |  |  |       </SheetTrigger> | 
					
						
							|  |  |  |       <SheetContent side={"left"}> | 
					
						
							|  |  |  |         <SheetHeader> | 
					
						
							|  |  |  |           <SheetTitle className="mt-8 font-bold">{"TABLE OF CONTENTS"}</SheetTitle> | 
					
						
							|  |  |  |         </SheetHeader> | 
					
						
							| 
									
										
										
										
											2024-08-14 12:57:22 +08:00
										 |  |  |         <ul className="flat-scrollbar flat-scrollbar-normal my-3 flex h-[70vh] flex-col overflow-y-auto"> | 
					
						
							| 
									
										
										
										
											2023-12-25 17:21:39 +08:00
										 |  |  |           {props.data?.map((item) => ( | 
					
						
							|  |  |  |             <Link | 
					
						
							| 
									
										
										
										
											2024-01-15 11:44:48 +08:00
										 |  |  |               className={twMerge( | 
					
						
							| 
									
										
										
										
											2024-08-14 12:57:22 +08:00
										 |  |  |                 "border-t border-b border-dashed px-2 py-1 hover:bg-gray-100 hover:dark:bg-gray-900", | 
					
						
							|  |  |  |                 activeId === `#${item.anchorId}` ? "bg-gray-100 text-sky-700 dark:bg-gray-900 dark:text-sky-500" : "", | 
					
						
							| 
									
										
										
										
											2024-01-15 11:44:48 +08:00
										 |  |  |               )} | 
					
						
							| 
									
										
										
										
											2024-04-03 22:08:27 +08:00
										 |  |  |               href={`#${item.anchorId}`} | 
					
						
							|  |  |  |               key={`drawer-toc-${item.anchorId}`} | 
					
						
							| 
									
										
										
										
											2023-12-25 17:21:39 +08:00
										 |  |  |               onClick={() => { | 
					
						
							|  |  |  |                 setIsTOCOpen(false); | 
					
						
							|  |  |  |               }} | 
					
						
							|  |  |  |             > | 
					
						
							| 
									
										
										
										
											2024-01-15 11:44:48 +08:00
										 |  |  |               <li className={"p-2"} style={{ paddingLeft: `${item.level - 2}em` }}>{`${item.title}`}</li> | 
					
						
							| 
									
										
										
										
											2023-12-25 17:21:39 +08:00
										 |  |  |             </Link> | 
					
						
							|  |  |  |           ))} | 
					
						
							|  |  |  |         </ul> | 
					
						
							|  |  |  |       </SheetContent> | 
					
						
							|  |  |  |     </Sheet> | 
					
						
							|  |  |  |   ); | 
					
						
							|  |  |  | }; |