Skip to content

Commit db84ec2

Browse files
committed
worktree: refresh changes on git-status-updated
1 parent 1c87498 commit db84ec2

File tree

1 file changed

+33
-4
lines changed

1 file changed

+33
-4
lines changed

packages/ui/src/components/layout/RightPanel.tsx

Lines changed: 33 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -450,6 +450,7 @@ export const RightPanel: React.FC<RightPanelProps> = React.memo(({
450450
const requestIdRef = useRef(0);
451451
const historyRequestIdRef = useRef(0);
452452
const refreshTimerRef = useRef<number | null>(null);
453+
const changesRefreshTimerRef = useRef<number | null>(null);
453454
const selectedCommitHashRef = useRef<string | null>(null);
454455
const selectedIsUncommittedRef = useRef(false);
455456

@@ -676,6 +677,10 @@ export const RightPanel: React.FC<RightPanelProps> = React.memo(({
676677
window.clearTimeout(refreshTimerRef.current);
677678
refreshTimerRef.current = null;
678679
}
680+
if (changesRefreshTimerRef.current) {
681+
window.clearTimeout(changesRefreshTimerRef.current);
682+
changesRefreshTimerRef.current = null;
683+
}
679684
};
680685
}, []);
681686

@@ -703,6 +708,19 @@ export const RightPanel: React.FC<RightPanelProps> = React.memo(({
703708
}, 200);
704709
}, [session.id, fetchCommits, fetchFiles, selectedIsUncommitted]);
705710

711+
const scheduleChangesRefresh = useCallback(() => {
712+
if (!session.id) return;
713+
if (changesRefreshTimerRef.current) {
714+
window.clearTimeout(changesRefreshTimerRef.current);
715+
}
716+
changesRefreshTimerRef.current = window.setTimeout(() => {
717+
changesRefreshTimerRef.current = null;
718+
if (selectedIsUncommittedRef.current) {
719+
fetchFiles();
720+
}
721+
}, 80);
722+
}, [session.id, fetchFiles]);
723+
706724
// Refresh once after a run completes (running -> waiting/error/etc).
707725
const prevStatusRef = useRef(session.status);
708726
useEffect(() => {
@@ -737,6 +755,17 @@ export const RightPanel: React.FC<RightPanelProps> = React.memo(({
737755
scheduleRefresh();
738756
}, [session.id, gitSig, scheduleRefresh]);
739757

758+
// Zed-style: refresh changes whenever git status is updated for this session.
759+
// This covers staging operations that don't change the "has changes" booleans.
760+
useEffect(() => {
761+
if (!session.id) return;
762+
const unsub = window.electronAPI?.events?.onGitStatusUpdated?.((data) => {
763+
if (!data || data.sessionId !== session.id) return;
764+
scheduleChangesRefresh();
765+
});
766+
return () => { if (unsub) unsub(); };
767+
}, [session.id, scheduleChangesRefresh]);
768+
740769
// Refresh after agent-run git commands that can change History/WT state.
741770
useEffect(() => {
742771
if (!session.id) return;
@@ -803,10 +832,10 @@ export const RightPanel: React.FC<RightPanelProps> = React.memo(({
803832
console.error('[RightPanel] Failed to change stage state', err);
804833
} finally {
805834
setIsStageChanging(false);
806-
handleRefresh();
835+
scheduleChangesRefresh();
807836
}
808837
},
809-
[handleRefresh, isStageChanging, session.id]
838+
[isStageChanging, scheduleChangesRefresh, session.id]
810839
);
811840

812841
const handleChangeFileStage = useCallback(
@@ -819,10 +848,10 @@ export const RightPanel: React.FC<RightPanelProps> = React.memo(({
819848
console.error('[RightPanel] Failed to change file stage state', err);
820849
} finally {
821850
setIsStageChanging(false);
822-
handleRefresh();
851+
scheduleChangesRefresh();
823852
}
824853
},
825-
[handleRefresh, isStageChanging, session.id]
854+
[isStageChanging, scheduleChangesRefresh, session.id]
826855
);
827856

828857
const trackedFiles = useMemo(() => {

0 commit comments

Comments
 (0)