import { useGitFileDiffForCommit, useGitLog, useGitMutations } from "@yaakapp-internal/git"; import type { GitCommit } from "@yaakapp-internal/git"; import { InlineCode, SplitLayout } from "@yaakapp-internal/ui"; import classNames from "classnames"; import { formatDistanceToNowStrict } from "date-fns"; import { useCallback, useEffect, useMemo, useState } from "react"; import { sync } from "../../init/sync"; import { showConfirm } from "../../lib/confirm"; import { EmptyStateText } from "../EmptyStateText"; import { Button } from "../core/Button"; import { DiffViewer } from "../core/Editor/DiffViewer"; import { useGitCallbacks } from "./callbacks"; export function FileHistoryDialog({ dir, relaPath }: { dir: string; relaPath: string }) { const callbacks = useGitCallbacks(dir); const { restoreFileFromCommit } = useGitMutations(dir, callbacks); const log = useGitLog(dir, undefined, relaPath); const commits = log.data ?? []; const [selectedOid, setSelectedOid] = useState(null); const selectedCommit = useMemo( () => commits.find((commit) => commit.oid === selectedOid) ?? null, [commits, selectedOid], ); const diff = useGitFileDiffForCommit(dir, relaPath, selectedCommit?.oid); useEffect(() => { if (commits.length === 0) { setSelectedOid(null); } else if (selectedOid == null || !commits.some((commit) => commit.oid === selectedOid)) { setSelectedOid(commits[0]?.oid ?? null); } }, [commits, selectedOid]); const handleRestoreCommit = useCallback( async (commit: GitCommit) => { const confirmed = await showConfirm({ id: "git-restore-file-history-entry", title: "Restore File", description: "This will restore the file to the selected commit.", confirmText: "Restore", color: "warning", }); if (!confirmed) return; await restoreFileFromCommit.mutateAsync({ commitOid: commit.oid, relaPath }); await sync({ force: true }); }, [relaPath, restoreFileFromCommit], ); if (commits.length === 0 && !log.isLoading) { return No history for this file; } return (
(
{commits.map((commit) => ( setSelectedOid(commit.oid)} /> ))}
)} secondSlot={({ style }) => (
{selectedCommit == null ? ( Select a commit to view diff ) : (
{selectedCommit.message || "No message"}
)}
)} />
); } function CommitListItem({ commit, selected, onSelect, }: { commit: GitCommit; selected: boolean; onSelect: () => void; }) { return ( ); }