import React, { useMemo } from 'react'; import cn from 'classnames'; import { CountryFlag, Avatar, TextEllipsis, Label, Icon, Tooltip, ItemMenu } from 'UI'; import { useStore } from 'App/mstore'; import { observer } from 'mobx-react-lite'; import { durationFormatted, formatTimeOrDate } from 'App/date'; import stl from './sessionItem.module.css'; import Counter from './Counter'; import { withRouter, RouteComponentProps } from 'react-router-dom'; import SessionMetaList from './SessionMetaList'; import PlayLink from './PlayLink'; import ErrorBars from './ErrorBars'; import { assist as assistRoute, liveSession, sessions as sessionsRoute, session as sessionRoute, isRoute } from 'App/routes'; import { capitalize } from 'App/utils'; import { Duration } from 'luxon'; import copy from 'copy-to-clipboard'; import { toast } from 'react-toastify'; 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; }; 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 } function SessionItem(props: RouteComponentProps & Props) { const { settingsStore } = useStore(); const { timezone, shownTimezone } = settingsStore.sessionSettings; 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, timezone: userTimezone } = session; const location = props.location; const queryParams = Object.fromEntries(new URLSearchParams(location.search)); 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) .filter((i) => metaList.includes(i)) .map((key) => { const value = metadata[key]; return { label: key, value }; }); const menuItems = useMemo(() => { return [ { icon: 'link-45deg', text: 'Copy Session URL', onClick: () => { const sessionPath = `${window.location.origin}/${ window.location.pathname.split('/')[1] }${sessionRoute(sessionId)}`; copy(sessionPath); toast.success('Session URL copied to clipboard'); } }, { icon: 'trash', text: 'Remove', onClick: () => (props.toggleFavorite ? props.toggleFavorite(sessionId) : null) } ]; }, []); return (
e.stopPropagation()} >
{!compact && (
!disableUser && !hasUserFilter && hasUserId ? onUserClick(userId, userAnonymousId) : null } >
)}
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())} >
) : ( <> {bookmarked && (
)} )}
{_metaList.length > 0 && }
); } export default withRouter(observer(SessionItem));