| 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, |
| }; |
| } |
|
|