import React, { useEffect } from 'react'; import { toggleBottomBlock } from 'Duck/components/player'; import BottomBlock from '../BottomBlock'; import EventRow from './components/EventRow'; import { connect } from 'react-redux'; import TimelineScale from './components/TimelineScale'; import FeatureSelection, { HELP_MESSAGE } from './components/FeatureSelection/FeatureSelection'; import TimelinePointer from './components/TimelinePointer'; import VerticalPointerLine from './components/VerticalPointerLine'; import cn from 'classnames'; import OverviewPanelContainer from './components/OverviewPanelContainer'; import { NoContent, Icon } from 'UI'; import { observer } from 'mobx-react-lite'; import {MobilePlayerContext, PlayerContext} from 'App/components/Session/playerContext'; function MobileOverviewPanelCont({ issuesList }: { issuesList: Record[] }) { const { store, player } = React.useContext(MobilePlayerContext) const [dataLoaded, setDataLoaded] = React.useState(false); const [selectedFeatures, setSelectedFeatures] = React.useState([ 'PERFORMANCE', 'FRUSTRATIONS', 'ERRORS', 'NETWORK', ]); const { endTime, eventList: eventsList, frustrationsList, exceptionsList, fetchList, performanceChartData, performanceList, } = store.get() const fetchPresented = fetchList.length > 0; const resources = { NETWORK: fetchList.filter((r: any) => r.status >= 400 || r.isRed || r.isYellow), ERRORS: exceptionsList, EVENTS: eventsList, PERFORMANCE: performanceChartData, FRUSTRATIONS: frustrationsList, }; useEffect(() => { if (dataLoaded) { return; } if ( exceptionsList.length > 0 || eventsList.length > 0 || issuesList.length > 0 || performanceChartData.length > 0 || frustrationsList.length > 0 ) { setDataLoaded(true); } }, [issuesList, exceptionsList, eventsList, performanceChartData, frustrationsList]); React.useEffect(() => { player.scale() }, [selectedFeatures]) return ( ) } function WebOverviewPanelCont({ issuesList }: { issuesList: Record[] }) { const { store } = React.useContext(PlayerContext); const [dataLoaded, setDataLoaded] = React.useState(false); const [selectedFeatures, setSelectedFeatures] = React.useState([ 'PERFORMANCE', 'FRUSTRATIONS', 'ERRORS', 'NETWORK', ]); const { endTime, currentTab, tabStates, } = store.get(); const stackEventList = tabStates[currentTab]?.stackList || [] const eventsList = tabStates[currentTab]?.eventList || [] const frustrationsList = tabStates[currentTab]?.frustrationsList || [] const exceptionsList = tabStates[currentTab]?.exceptionsList || [] const resourceListUnmap = tabStates[currentTab]?.resourceList || [] const fetchList = tabStates[currentTab]?.fetchList || [] const graphqlList = tabStates[currentTab]?.graphqlList || [] const performanceChartData = tabStates[currentTab]?.performanceChartData || [] const fetchPresented = fetchList.length > 0; const resourceList = resourceListUnmap .filter((r: any) => r.isRed || r.isYellow) .concat(fetchList.filter((i: any) => parseInt(i.status) >= 400)) .concat(graphqlList.filter((i: any) => parseInt(i.status) >= 400)) .filter((i: any) => i.type === "fetch"); const resources: any = React.useMemo(() => { return { NETWORK: resourceList, ERRORS: exceptionsList, EVENTS: stackEventList, PERFORMANCE: performanceChartData, FRUSTRATIONS: frustrationsList, }; }, [dataLoaded, currentTab]); useEffect(() => { if (dataLoaded) { return; } if ( resourceList.length > 0 || exceptionsList.length > 0 || eventsList.length > 0 || stackEventList.length > 0 || issuesList.length > 0 || performanceChartData.length > 0 ) { setDataLoaded(true); } }, [resourceList, issuesList, exceptionsList, eventsList, stackEventList, performanceChartData, currentTab]); return } function PanelComponent({ selectedFeatures, endTime, resources, fetchPresented, setSelectedFeatures, isMobile, performanceList }: any) { return ( X-RAY
Select a debug option to visualize on timeline.
} > {selectedFeatures.map((feature: any, index: number) => (
( )} endTime={endTime} message={HELP_MESSAGE[feature]} /> {isMobile && feature === 'PERFORMANCE' ? (
(
)} endTime={endTime} />
) : null}
))}
) } export const OverviewPanel = connect( (state: any) => ({ issuesList: state.getIn(['sessions', 'current']).issues, }), { toggleBottomBlock, } )(observer(WebOverviewPanelCont)); export const MobileOverviewPanel = connect( (state: any) => ({ issuesList: state.getIn(['sessions', 'current']).issues, }), { toggleBottomBlock, } )(observer(MobileOverviewPanelCont));