fix: mark context panel chat sessions as seen
Clears unread state when a chat session is active in the context panel Keeps embedded chat presence in sync while the window is focused
This commit is contained in:
@@ -17,6 +17,8 @@ import { useUIStore, type ContextPanelMode } from '@/stores/useUIStore';
|
|||||||
import { useInlineCommentDraftStore } from '@/stores/useInlineCommentDraftStore';
|
import { useInlineCommentDraftStore } from '@/stores/useInlineCommentDraftStore';
|
||||||
import { useSessionUIStore } from '@/sync/session-ui-store';
|
import { useSessionUIStore } from '@/sync/session-ui-store';
|
||||||
import { useInputStore } from '@/sync/input-store';
|
import { useInputStore } from '@/sync/input-store';
|
||||||
|
import { markSessionViewed } from '@/sync/notification-store';
|
||||||
|
import { setExternallyViewedSession } from '@/sync/sync-context';
|
||||||
import { ContextPanelContent } from './ContextSidebarTab';
|
import { ContextPanelContent } from './ContextSidebarTab';
|
||||||
import { toast } from '@/components/ui';
|
import { toast } from '@/components/ui';
|
||||||
import { runtimeFetch } from '@/lib/runtime-fetch';
|
import { runtimeFetch } from '@/lib/runtime-fetch';
|
||||||
@@ -2176,6 +2178,35 @@ export const ContextPanel: React.FC = () => {
|
|||||||
}, [activeTab, directoryKey, setSelectedFilePath]);
|
}, [activeTab, directoryKey, setSelectedFilePath]);
|
||||||
|
|
||||||
const activeChatTabID = activeTab?.mode === 'chat' ? activeTab.id : null;
|
const activeChatTabID = activeTab?.mode === 'chat' ? activeTab.id : null;
|
||||||
|
const activeChatSessionID = activeTab?.mode === 'chat' ? getSessionIDFromDedupeKey(activeTab.dedupeKey) : null;
|
||||||
|
|
||||||
|
React.useEffect(() => {
|
||||||
|
if (!isOpen || !directoryKey || !activeChatSessionID || typeof window === 'undefined') {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const markActiveChatViewed = () => {
|
||||||
|
if (document.visibilityState === 'hidden' || !document.hasFocus()) {
|
||||||
|
setExternallyViewedSession(directoryKey, activeChatSessionID, false);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
markSessionViewed(activeChatSessionID);
|
||||||
|
setExternallyViewedSession(directoryKey, activeChatSessionID, true);
|
||||||
|
};
|
||||||
|
|
||||||
|
markActiveChatViewed();
|
||||||
|
const interval = window.setInterval(markActiveChatViewed, 10_000);
|
||||||
|
window.addEventListener('focus', markActiveChatViewed);
|
||||||
|
document.addEventListener('visibilitychange', markActiveChatViewed);
|
||||||
|
|
||||||
|
return () => {
|
||||||
|
window.clearInterval(interval);
|
||||||
|
window.removeEventListener('focus', markActiveChatViewed);
|
||||||
|
document.removeEventListener('visibilitychange', markActiveChatViewed);
|
||||||
|
setExternallyViewedSession(directoryKey, activeChatSessionID, false);
|
||||||
|
};
|
||||||
|
}, [activeChatSessionID, directoryKey, isOpen]);
|
||||||
|
|
||||||
const getEmbeddedChatSrc = React.useCallback((tabID: string, sessionID: string, readOnly: boolean): string => {
|
const getEmbeddedChatSrc = React.useCallback((tabID: string, sessionID: string, readOnly: boolean): string => {
|
||||||
return getOrCreateEmbeddedSessionChatURL(chatFrameSrcByTabIDRef.current, tabID, sessionID, directoryKey || null, readOnly, {
|
return getOrCreateEmbeddedSessionChatURL(chatFrameSrcByTabIDRef.current, tabID, sessionID, directoryKey || null, readOnly, {
|
||||||
|
|||||||
Reference in New Issue
Block a user