'use client'; import { useEffect, useRef } from "react"; import clsx from "clsx"; import scrollIntoView from 'scroll-into-view-if-needed'; import { ChevronDownIcon, ChevronRightIcon } from "@radix-ui/react-icons"; import { FileTreeItemIcon } from "./fileTreeItemIcon"; import Link from "next/link"; import { FileTreeItem } from "../types"; export const FileTreeItemComponent = ({ node, isActive, depth, isCollapsed = false, isCollapseChevronVisible = true, href, onClick, onNavigate, parentRef, }: { node: FileTreeItem, isActive: boolean, depth: number, isCollapsed?: boolean, isCollapseChevronVisible?: boolean, href: string, onClick?: (e: React.MouseEvent) => void, onNavigate?: (e: { preventDefault: () => void }) => void, parentRef: React.RefObject, }) => { const ref = useRef(null); useEffect(() => { if (isActive && ref.current) { scrollIntoView(ref.current, { scrollMode: 'if-needed', block: 'center', behavior: 'instant', // We only want to scroll if the element is hidden vertically // in the parent element. boundary: () => { if (!parentRef.current || !ref.current) { return false; } const rect = ref.current.getBoundingClientRect(); const parentRect = parentRef.current.getBoundingClientRect(); const completelyAbove = rect.bottom <= parentRect.top; const completelyBelow = rect.top >= parentRect.bottom; return completelyAbove || completelyBelow; } }); } }, [isActive, parentRef]); return (
{isCollapseChevronVisible && ( isCollapsed ? ( ) : ( ) )}
{node.name} ) }