openhands / src /hooks /use-conversation-overview-git-diff-stats.ts
SaylorTwift's picture
SaylorTwift HF Staff
Add files using upload-large-folder tool
a070805 verified
Raw
History Blame Contribute Delete
2.56 kB
import { useMemo } from "react";
import { useQueries } from "@tanstack/react-query";
import AgentServerGitService from "#/api/git-service/agent-server-git-service.api";
import { useActiveConversation } from "#/hooks/query/use-active-conversation";
import { useUnifiedGetGitChanges } from "#/hooks/query/use-unified-get-git-changes";
import { useConversationId } from "#/hooks/use-conversation-id";
import { useRuntimeIsReady } from "#/hooks/use-runtime-is-ready";
import { getGitPath } from "#/utils/get-git-path";
import {
countGitChangeDiffStats,
sumGitDiffLineStats,
} from "#/utils/git-diff-stats";
export function useConversationOverviewGitDiffStats() {
const { conversationId } = useConversationId();
const { data: conversation } = useActiveConversation();
const runtimeIsReady = useRuntimeIsReady();
const {
data: gitChanges,
isLoading: isLoadingChanges,
isSuccess: isChangesSuccess,
isError: isChangesError,
} = useUnifiedGetGitChanges();
const conversationUrl = conversation?.conversation_url;
const sessionApiKey = conversation?.session_api_key;
const gitPath = useMemo(
() =>
getGitPath(
conversation?.selected_repository,
conversation?.workspace?.working_dir?.trim(),
),
[conversation?.selected_repository, conversation?.workspace?.working_dir],
);
const diffCandidates = useMemo(
() => (gitChanges ?? []).filter((change) => change.status !== "D"),
[gitChanges],
);
const diffQueries = useQueries({
queries: diffCandidates.map((change) => ({
queryKey: [
"conversation_overview_file_diff",
conversationId,
conversationUrl,
sessionApiKey,
gitPath,
change.path,
],
queryFn: async () =>
AgentServerGitService.getGitChangeDiff(
conversationId!,
conversationUrl,
sessionApiKey,
`${gitPath}/${change.path}`,
),
enabled:
runtimeIsReady && !!conversationId && isChangesSuccess && !!change.path,
staleTime: 1000 * 60 * 5,
meta: {
disableToast: true,
},
})),
});
const isLoadingDiffs = diffQueries.some((query) => query.isLoading);
const totals = sumGitDiffLineStats(
diffQueries.flatMap((query) =>
query.data ? [countGitChangeDiffStats(query.data)] : [],
),
);
return {
additions: totals.additions,
deletions: totals.deletions,
changeCount: gitChanges?.length ?? 0,
isLoading: isLoadingChanges || isLoadingDiffs,
isError: isChangesError,
};
}