import { createContext, useContext, useEffect, useMemo, useState } from "react" import { FileTree, useFileTree, useFileTreeSelection, } from "@pierre/trees/react" import type { GitStatusEntry } from "@pierre/trees" import type { ReviewDiffFile } from "@/lib/api" import { Skeleton } from "@/components/ui/skeleton" import { treeThemeStyle } from "@/components/agents/AgentGitPanel" export interface ReviewSidebarData { title: string files: Array | null selected: string | null viewed: Set onSelect: (path: string) => void } const ReviewSidebarContext = createContext<{ data: ReviewSidebarData | null setData: (data: ReviewSidebarData | null) => void } | null>(null) export function ReviewSidebarProvider({ children, }: { children: React.ReactNode }) { const [data, setData] = useState(null) const value = useMemo(() => ({ data, setData }), [data]) return ( {children} ) } export function useReviewSidebarData(): ReviewSidebarData | null { return useContext(ReviewSidebarContext)?.data ?? null } export function useRegisterReviewSidebar(data: ReviewSidebarData) { const setData = useContext(ReviewSidebarContext)?.setData useEffect(() => { if (!setData) return setData(data) return () => setData(null) }, [setData, data]) } export function ReviewFileTree({ data }: { data: ReviewSidebarData }) { return (
{data.title}
{!data.files ? (
) : ( )}
) } function ReviewFileTreeExplorer({ files, selected, onSelect, }: { files: Array selected: string | null onSelect: (path: string) => void }) { const paths = useMemo(() => files.map((file) => file.path), [files]) const gitStatus = useMemo>( () => files.map((file) => ({ path: file.path, status: file.status })), [files] ) const { model } = useFileTree({ paths, gitStatus, initialExpansion: "open", flattenEmptyDirectories: true, icons: "standard", }) useEffect(() => { model.resetPaths(paths) }, [model, paths]) useEffect(() => { model.setGitStatus(gitStatus) }, [model, gitStatus]) const selection = useFileTreeSelection(model) useEffect(() => { const path = selection[0] if (path) onSelect(path) }, [selection, onSelect]) useEffect(() => { if (selected) { model.scrollToPath(selected, { focus: false }) } }, [model, selected]) return (
) }