"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}
)}
)
})}
)
}