"use client"; import { IconGitCommit, IconArrowBackUp, IconPencil, IconHistoryToggle, IconArrowUp, } from "@tabler/icons-react"; import { Tooltip, TooltipContent, TooltipTrigger } from "@kandev/ui/tooltip"; import { ContextMenu, ContextMenuContent, ContextMenuItem, ContextMenuTrigger, } from "@kandev/ui/context-menu"; export type CommitItem = { commit_sha: string; commit_message: string; insertions: number; deletions: number; pushed?: boolean; }; /** Context menu for commit items */ function CommitContextMenu({ children, commit, isLatest, onAmendCommit, onRevertCommit, onResetToCommit, }: { children: React.ReactNode; commit: CommitItem; isLatest: boolean; onAmendCommit?: (currentMessage: string) => void; onRevertCommit?: (sha: string) => void; onResetToCommit?: (sha: string) => void; }) { const hasActions = onAmendCommit || onRevertCommit || onResetToCommit; if (!hasActions) { return <>{children}; } return ( {children} {isLatest && onAmendCommit && ( onAmendCommit(commit.commit_message)}> Amend message )} {isLatest && onRevertCommit && ( onRevertCommit(commit.commit_sha)}> Revert commit )} {onResetToCommit && ( onResetToCommit(commit.commit_sha)}> Reset to this commit )} ); } /** Hover action buttons for a commit row */ function CommitRowActions({ commit, isLatest, onAmendCommit, onRevertCommit, onResetToCommit, }: { commit: CommitItem; isLatest: boolean; onAmendCommit?: (currentMessage: string) => void; onRevertCommit?: (sha: string) => void; onResetToCommit?: (sha: string) => void; }) { return ( {isLatest && onAmendCommit && ( Amend commit message )} {isLatest && onRevertCommit && ( Revert commit )} {onResetToCommit && ( Reset to this commit )} ); } /** Individual commit row with hover actions */ export function CommitRow({ commit, isLatest, onOpenCommitDetail, onAmendCommit, onRevertCommit, onResetToCommit, }: { commit: CommitItem; isLatest: boolean; onOpenCommitDetail?: (sha: string) => void; onAmendCommit?: (currentMessage: string) => void; onRevertCommit?: (sha: string) => void; onResetToCommit?: (sha: string) => void; }) { const showActions = onResetToCommit || (isLatest && (onAmendCommit || onRevertCommit)); return (
  • onOpenCommitDetail?.(commit.commit_sha)} onKeyDown={(e) => { if (e.key === "Enter" || e.key === " ") { e.preventDefault(); onOpenCommitDetail?.(commit.commit_sha); } }} > {commit.pushed === true ? "Pushed commit" : "Unpushed commit"} {commit.pushed === true ? ( {commit.commit_sha.slice(0, 7)} {commit.commit_message} +{commit.insertions}{" "} -{commit.deletions} {showActions && ( )}
  • ); }