"use client"; import { useCallback, type ReactNode } from "react"; import { cn } from "@kandev/ui/lib/utils"; import { Button } from "@kandev/ui/button"; import { Tooltip, TooltipTrigger, TooltipContent } from "@kandev/ui/tooltip"; import { IconCopy, IconTextWrap, IconLayoutRows, IconLayoutColumns, IconPencil, IconArrowBackUp, IconFoldDown, IconFold, IconEye, } from "@tabler/icons-react"; import type { RenderHeaderMetadataProps } from "@pierre/diffs"; import type { ViewMode } from "@/hooks/use-global-view-mode"; const iconBtn = "h-6 w-6 p-0 cursor-pointer opacity-60 hover:opacity-100"; function ToolbarBtn({ onClick, tooltip, className, children, }: { onClick: () => void; tooltip: string; className?: string; children: ReactNode; }) { return ( {tooltip} ); } interface DiffHeaderToolbarOptions { filePath: string; diff?: string; wordWrap: boolean; onToggleWordWrap: () => void; viewMode: ViewMode; onToggleViewMode: () => void; onOpenFile?: (filePath: string) => void; onPreviewMarkdown?: (filePath: string) => void; onRevert?: (filePath: string) => void; expandUnchanged?: boolean; onToggleExpandUnchanged?: () => void; } type ToolbarButtonsProps = Omit & { resolvedPath: string; onCopyDiff: () => void; isMarkdownFile: boolean; }; function DiffHeaderToolbarButtons({ resolvedPath, onCopyDiff, onRevert, expandUnchanged, onToggleExpandUnchanged, wordWrap, onToggleWordWrap, viewMode, onToggleViewMode, onOpenFile, onPreviewMarkdown, isMarkdownFile, }: ToolbarButtonsProps) { return (
{onRevert && ( onRevert(resolvedPath)} tooltip="Revert changes"> )} {onToggleExpandUnchanged && ( {expandUnchanged ? ( ) : ( )} )} {viewMode === "split" ? ( ) : ( )} {isMarkdownFile && onPreviewMarkdown && ( onPreviewMarkdown(resolvedPath)} tooltip="Preview markdown" className={iconBtn} > )} {onOpenFile && ( onOpenFile(resolvedPath)} tooltip="Edit"> )}
); } function checkIsMarkdown(filePath: string): boolean { const ext = filePath.split(".").pop()?.toLowerCase(); return ext === "md" || ext === "mdx"; } export function useDiffHeaderToolbar(opts: DiffHeaderToolbarOptions) { const { filePath, diff, wordWrap, onToggleWordWrap, viewMode, onToggleViewMode, onOpenFile, onPreviewMarkdown, onRevert, expandUnchanged, onToggleExpandUnchanged, } = opts; return useCallback( (props: RenderHeaderMetadataProps): ReactNode => { const resolvedPath = props.fileDiff?.name || filePath; return ( navigator.clipboard.writeText(diff || "")} wordWrap={wordWrap} onToggleWordWrap={onToggleWordWrap} viewMode={viewMode} onToggleViewMode={onToggleViewMode} onOpenFile={onOpenFile} onPreviewMarkdown={onPreviewMarkdown} onRevert={onRevert} expandUnchanged={expandUnchanged} onToggleExpandUnchanged={onToggleExpandUnchanged} /> ); }, [ filePath, diff, wordWrap, onToggleWordWrap, viewMode, onToggleViewMode, onOpenFile, onPreviewMarkdown, onRevert, expandUnchanged, onToggleExpandUnchanged, ], ); }