diff --git a/src/components/layout/aux-panel-git-log-tab.tsx b/src/components/layout/aux-panel-git-log-tab.tsx index 1443c7f..6eddf32 100644 --- a/src/components/layout/aux-panel-git-log-tab.tsx +++ b/src/components/layout/aux-panel-git-log-tab.tsx @@ -75,6 +75,8 @@ import { CollapsibleTrigger, } from "@/components/ui/collapsible" import { Skeleton } from "@/components/ui/skeleton" +import { listen, type UnlistenFn } from "@tauri-apps/api/event" +import { disposeTauriListener } from "@/lib/tauri-listener" import { useFolderContext } from "@/contexts/folder-context" import { useWorkspaceContext } from "@/contexts/workspace-context" import { @@ -862,6 +864,39 @@ export function GitLogTab() { void fetchLog() }, [fetchLog]) + // Refresh branches & log on branch change, commit, or push + useEffect(() => { + if (!folder) return + + const events = [ + "folder://git-branch-changed", + "folder://git-commit-succeeded", + "folder://git-push-succeeded", + ] as const + + const unlistens: (UnlistenFn | null)[] = events.map(() => null) + + events.forEach((eventName, i) => { + listen<{ folder_id: number }>(eventName, (event) => { + if (event.payload.folder_id !== folder.id) return + void refreshBranches() + void fetchLog({ inline: true }) + }) + .then((fn) => { + unlistens[i] = fn + }) + .catch((err) => { + console.error(`[GitLogTab] failed to listen ${eventName}:`, err) + }) + }) + + return () => { + events.forEach((eventName, i) => { + disposeTauriListener(unlistens[i], `GitLogTab.${eventName}`) + }) + } + }, [folder, refreshBranches, fetchLog]) + const handleScroll = useCallback((e: UIEvent) => { const nextScrolled = e.currentTarget.scrollTop > 0 setScrolled((prev) => (prev === nextScrolled ? prev : nextScrolled)) diff --git a/src/components/layout/branch-dropdown.tsx b/src/components/layout/branch-dropdown.tsx index f27a868..347521b 100644 --- a/src/components/layout/branch-dropdown.tsx +++ b/src/components/layout/branch-dropdown.tsx @@ -1,7 +1,7 @@ "use client" import { useState, useRef, useCallback, useMemo, useEffect } from "react" -import { listen, type UnlistenFn } from "@tauri-apps/api/event" +import { emit, listen, type UnlistenFn } from "@tauri-apps/api/event" import { GitBranch, ChevronDown, @@ -245,6 +245,9 @@ export function BranchDropdown({ const successDescription = getSuccessDescription?.(result) updateTask(taskId, { status: "completed" }) onBranchChange() + void emit("folder://git-branch-changed", { + folder_id: folder?.id, + }) if (successDescription !== false) { toast.success( t("toasts.taskCompleted", { label }),