import cn from 'classnames'; import { Duration } from 'luxon'; import { observer } from 'mobx-react-lite'; import React from 'react'; import { RouteComponentProps, withRouter } from 'react-router-dom'; import { durationFormatted, formatTimeOrDate } from 'App/date'; import { useStore } from 'App/mstore'; import { assist as assistRoute, isRoute, liveSession, sessions as sessionsRoute, } from 'App/routes'; import { capitalize } from 'App/utils'; import { Avatar, CountryFlag, Icon, Label, TextEllipsis, Tooltip } from 'UI'; import Counter from './Counter'; import ErrorBars from './ErrorBars'; import PlayLink from './PlayLink'; import SessionMetaList from './SessionMetaList'; import stl from './sessionItem.module.css'; const ASSIST_ROUTE = assistRoute(); const ASSIST_LIVE_SESSION = liveSession(); const SESSIONS_ROUTE = sessionsRoute(); interface Props { session: { sessionId: string; userBrowser: string; userOs: string; userId: string; userAnonymousId: string; userDisplayName: string; userCountry: string; userCity: string; userState: string; startedAt: number; duration: Duration; eventsCount: number; errorsCount: number; pagesCount: number; viewed: boolean; favorite: boolean; userDeviceType: string; userUuid: string; userNumericHash: number; live: boolean; metadata: Record; issueTypes: []; active: boolean; isCallActive?: boolean; agentIds?: string[]; timezone: string; platform: string; }; onUserClick?: (userId: string, userAnonymousId: string) => void; hasUserFilter?: boolean; disableUser?: boolean; metaList?: Array; // showActive?: boolean; lastPlayedSessionId?: string; live?: boolean; onClick?: any; compact?: boolean; isDisabled?: boolean; isAdd?: boolean; ignoreAssist?: boolean; bookmarked?: boolean; toggleFavorite?: (sessionId: string) => void; query?: string; } const PREFETCH_STATE = { none: 0, loading: 1, fetched: 2, }; function SessionItem(props: RouteComponentProps & Props) { const { settingsStore, sessionStore } = useStore(); const { timezone, shownTimezone } = settingsStore.sessionSettings; const [prefetchState, setPrefetched] = React.useState(PREFETCH_STATE.none); const { session, onUserClick = () => null, hasUserFilter = false, disableUser = false, metaList = [], lastPlayedSessionId, onClick = null, compact = false, ignoreAssist = false, bookmarked = false, query, } = props; const { sessionId, userBrowser, userOs, userId, userAnonymousId, userDisplayName, userCountry, userCity, userState, startedAt, duration, eventsCount, viewed, userDeviceType, userNumericHash, live, metadata, issueTypes, active, platform, timezone: userTimezone, } = session; const location = props.location; const queryParams = Object.fromEntries(new URLSearchParams(location.search)); const isMobile = platform !== 'web'; const formattedDuration = durationFormatted(duration); const hasUserId = userId || userAnonymousId; const isSessions = isRoute(SESSIONS_ROUTE, location.pathname); const isAssist = (!ignoreAssist && (isRoute(ASSIST_ROUTE, location.pathname) || isRoute(ASSIST_LIVE_SESSION, location.pathname) || location.pathname.includes('multiview'))) || props.live; const isLastPlayed = lastPlayedSessionId === sessionId; const _metaList = Object.keys(metadata).map((key) => { const value = metadata[key]; return { label: key, value }; }); const handleHover = async () => { if ( prefetchState !== PREFETCH_STATE.none || props.live || isAssist || isMobile ) return; setPrefetched(PREFETCH_STATE.loading); try { await sessionStore.getFirstMob(sessionId); setPrefetched(PREFETCH_STATE.fetched); } catch (e) { console.error('Error while prefetching first mob', e); } }; const populateData = () => { if ( props.live || isAssist || prefetchState === PREFETCH_STATE.none || isMobile ) { return; } sessionStore.prefetchSession(session); }; return (
e.stopPropagation()} onMouseEnter={handleHover} >
{!compact && (
!disableUser && !hasUserFilter && hasUserId ? onUserClick(userId, userAnonymousId) : null } >
{_metaList.length > 0 && ( )}
)}
Local Time:{' '} {formatTimeOrDate(startedAt, timezone, true)}{' '} {timezone.label} {userTimezone ? ( User's Time:{' '} {formatTimeOrDate( startedAt, { label: userTimezone.split('+').join(' +'), value: userTimezone.split(':')[0], }, true )}{' '} {userTimezone} ) : null}
} className="w-fit !block" >
{!isAssist && ( <>
{eventsCount} {eventsCount === 0 || eventsCount > 1 ? 'Events' : 'Event'}
)}
{live || props.live ? ( ) : ( formattedDuration )}
{userBrowser ? ( ) : null} {userOs && userBrowser ? ( ) : null}
{isSessions && (
)}
{live && session.isCallActive && session.agentIds!.length > 0 ? (
) : null} {isSessions && (
{isLastPlayed && ( )}
)} {props.isAdd ? (
(props.isDisabled ? null : props.onClick())} >
) : ( )}
); } export default withRouter(observer(SessionItem));