|
1 | | -import React, { useState, useEffect, useCallback, useMemo } from 'react'; |
| 1 | +import React, { useState, useEffect, useCallback, useMemo, useRef } from 'react'; |
2 | 2 | import { X, ArrowLeft, RefreshCw, Copy, Check } from 'lucide-react'; |
3 | 3 | import { ZedDiffViewer } from '../panels/diff/ZedDiffViewer'; |
4 | 4 | import { API } from '../../utils/api'; |
@@ -47,6 +47,7 @@ export const DiffOverlay: React.FC<DiffOverlayProps> = React.memo(({ |
47 | 47 | const [loading, setLoading] = useState(false); |
48 | 48 | const [error, setError] = useState<string | null>(null); |
49 | 49 | const [copied, setCopied] = useState(false); |
| 50 | + const overlayRefreshTimerRef = useRef<number | null>(null); |
50 | 51 |
|
51 | 52 | const derivedFiles = useMemo(() => { |
52 | 53 | if (!diff) return []; |
@@ -226,6 +227,29 @@ export const DiffOverlay: React.FC<DiffOverlayProps> = React.memo(({ |
226 | 227 | } |
227 | 228 | }, [filePath]); |
228 | 229 |
|
| 230 | + // Keep overlay in sync with staging actions triggered outside the overlay (e.g. Stage/Unstage All in RightPanel). |
| 231 | + useEffect(() => { |
| 232 | + if (!isOpen || !sessionId || !target) return; |
| 233 | + if (target.kind !== 'working' || !filePath) return; |
| 234 | + const unsub = window.electronAPI?.events?.onGitStatusUpdated?.((data) => { |
| 235 | + if (!data || data.sessionId !== sessionId) return; |
| 236 | + if (overlayRefreshTimerRef.current) { |
| 237 | + window.clearTimeout(overlayRefreshTimerRef.current); |
| 238 | + } |
| 239 | + overlayRefreshTimerRef.current = window.setTimeout(() => { |
| 240 | + overlayRefreshTimerRef.current = null; |
| 241 | + void handleRefresh(); |
| 242 | + }, 80); |
| 243 | + }); |
| 244 | + return () => { |
| 245 | + if (overlayRefreshTimerRef.current) { |
| 246 | + window.clearTimeout(overlayRefreshTimerRef.current); |
| 247 | + overlayRefreshTimerRef.current = null; |
| 248 | + } |
| 249 | + if (unsub) unsub(); |
| 250 | + }; |
| 251 | + }, [isOpen, sessionId, target, filePath, handleRefresh]); |
| 252 | + |
229 | 253 | if (!isOpen) return null; |
230 | 254 |
|
231 | 255 | const workingScope = target?.kind === 'working' ? (target.scope || 'all') : null; |
|
0 commit comments