Files
ai-code-app/src/app/main/ChatRuntimeBridgeV2.tsx
2026-04-21 03:33:23 +09:00

65 lines
1.8 KiB
TypeScript

import { useEffect, useMemo, useState } from 'react';
import { useAppStore } from '../../store';
import { getChatClientSessionId } from './mainChatPanel';
import { chatConnectionGateway, chatGateway } from './chatV2';
import type { ChatMessage, ChatViewContext } from './mainChatPanel/types';
function isStandaloneDisplayMode() {
if (typeof window === 'undefined') {
return false;
}
return (
window.matchMedia?.('(display-mode: standalone)').matches === true ||
(window.navigator as Navigator & { standalone?: boolean }).standalone === true
);
}
export function ChatRuntimeBridgeV2() {
const { currentPage, focusedComponentId } = useAppStore();
const [sessionId] = useState(() => getChatClientSessionId());
const [, setMessages] = useState<ChatMessage[]>([]);
const currentContext: ChatViewContext = useMemo(
() => ({
pageId: currentPage.id,
pageTitle: currentPage.title,
topMenu: currentPage.topMenu,
focusedComponentId,
pageUrl: typeof window !== 'undefined' ? window.location.href : '',
isStandaloneMode: isStandaloneDisplayMode(),
pageVisibilityState:
typeof document !== 'undefined' && document.visibilityState === 'hidden' ? 'hidden' : 'visible',
chatTypeId: null,
chatTypeLabel: '',
chatTypeDescription: '',
chatTypeIsTemplate: false,
}),
[currentPage, focusedComponentId],
);
useEffect(() => {
let cancelled = false;
void chatGateway.fetchRuntimeSnapshot()
.then((snapshot) => {
if (!cancelled) {
chatConnectionGateway.setSharedRuntimeSnapshot(snapshot);
}
})
.catch(() => undefined);
return () => {
cancelled = true;
};
}, []);
chatConnectionGateway.useConnection({
sessionId,
currentContext,
setMessages,
});
return null;
}