import { observer } from 'mobx-react-lite'; import React from 'react'; import { connect } from 'react-redux'; import { useStore } from 'App/mstore'; import { debounce } from 'App/utils'; import { IResourceRequest, IResourceTiming } from "../../../../../player"; import { WsChannel } from "../../../../../player/web/messages"; import { PlayerContext } from "../../../playerContext"; let debounceUpdate: any = () => {}; const userBehaviorRegex = /User\s+(\w+\s+)?Behavior/i; const issuesErrorsRegex = /Issues\s+(and\s+|,?\s+)?(\w+\s+)?Errors/i; function isTitleLine(line: string): boolean { return userBehaviorRegex.test(line) || issuesErrorsRegex.test(line); } function SummaryBlock({ sessionId, zoomEnabled, zoomStartTs, zoomEndTs, zoomTab, duration, }: { sessionId: string; zoomEnabled: boolean; zoomStartTs: number; zoomEndTs: number; zoomTab: 'overview' | 'journey' | 'issues' | 'errors'; duration: any; }) { const { store } = React.useContext(PlayerContext) const { tabStates } = store.get(); const { aiSummaryStore } = useStore(); React.useEffect(() => { debounceUpdate = debounce( ( sessionId: string, events: any[], feat: 'journey' | 'issues' | 'errors', startTs: number, endTs: number ) => aiSummaryStore.getDetailedSummary(sessionId, events, feat, startTs, endTs), 500 ); }, []); React.useEffect(() => { if (zoomTab === 'overview') { void aiSummaryStore.getSummary(sessionId); } else { const totalFetchList: IResourceRequest[] = []; const totalResourceList: IResourceTiming[] = []; const totalWebsocketList: WsChannel[] = []; Object.values(tabStates).forEach(({ fetchList, resourceList, websocketList, }) => { totalFetchList.push(...fetchList); totalResourceList.push(...resourceList); totalWebsocketList.push(...websocketList); }) const resultingEvents = [ ...totalFetchList, ...totalResourceList, ...totalWebsocketList, ] const range = !zoomEnabled ? [0, duration] : [zoomStartTs, zoomEndTs]; void debounceUpdate(sessionId, resultingEvents, zoomTab, range[0], range[1]); } }, [zoomTab]); const formattedText = aiSummaryStore.text.split('\n').map((line) => { if (isTitleLine(line)) { return