"use client" import { useState, useEffect } from "react" import Link from "next/link" import { IconChevronRight } from "@tabler/icons-react" import { useFiles } from "@/hooks/use-files" import { getDriveFileInfo } from "@/app/actions/google-drive" import { Breadcrumb, BreadcrumbItem, BreadcrumbLink, BreadcrumbList, BreadcrumbPage, BreadcrumbSeparator, } from "@/components/ui/breadcrumb" type BreadcrumbSegment = { name: string folderId: string | null } export function FileBreadcrumb({ path, folderId, }: { path?: string[] folderId?: string }) { const { state } = useFiles() const [segments, setSegments] = useState< BreadcrumbSegment[] >([]) // for google drive mode: resolve folder ancestry useEffect(() => { if (state.isConnected !== true || !folderId) { setSegments([]) return } let cancelled = false async function resolve() { const trail: BreadcrumbSegment[] = [] let currentId: string | null = folderId ?? null // walk up the parents chain (max 10 deep to prevent infinite loops) for (let depth = 0; depth < 10 && currentId; depth++) { try { const result = await getDriveFileInfo(currentId) if (!result.success || cancelled) break trail.unshift({ name: result.file.name, folderId: currentId, }) currentId = result.file.parentId } catch { break } } if (!cancelled) { setSegments(trail) } } resolve() return () => { cancelled = true } }, [folderId, state.isConnected]) // mock data mode: use path array if (state.isConnected !== true) { const effectivePath = path ?? [] return ( {effectivePath.length === 0 ? ( My Files ) : ( My Files )} {effectivePath.map((segment, i) => { const isLast = i === effectivePath.length - 1 const href = `/dashboard/files/${effectivePath.slice(0, i + 1).join("/")}` return ( {isLast ? ( {segment} ) : ( {segment} )} ) })} ) } // google drive mode: use resolved segments return ( {segments.length === 0 && !folderId ? ( My Files ) : ( My Files )} {segments.map((seg, i) => { const isLast = i === segments.length - 1 return ( {isLast ? ( {seg.name} ) : ( {seg.name} )} ) })} ) }