import React, { useMemo } from 'react'; import { FormattedMessage } from 'react-intl'; import { FixedSizeList } from 'react-window'; import firstBy from 'thenby'; import { format } from 'date-fns'; import Icon from 'components/common/Icon'; import Tag from 'components/common/Tag'; import useLocale from 'hooks/useLocale'; import useCountryNames from 'hooks/useCountryNames'; import { BROWSERS } from 'lib/constants'; import Bolt from 'assets/bolt.svg'; import Visitor from 'assets/visitor.svg'; import Eye from 'assets/eye.svg'; import { stringToColor } from 'lib/format'; import styles from './RealtimeLog.module.css'; import Dot from '../common/Dot'; const TYPE_PAGEVIEW = 0; const TYPE_SESSION = 1; const TYPE_EVENT = 2; const TYPE_ICONS = { [TYPE_PAGEVIEW]: , [TYPE_SESSION]: , [TYPE_EVENT]: , }; export default function RealtimeLog({ data, websites }) { const [locale] = useLocale(); const countryNames = useCountryNames(locale); const logs = useMemo(() => { const { pageviews, sessions, events } = data; return [...pageviews, ...sessions, ...events].sort(firstBy('created_at', -1)); }, [data]); const uuids = useMemo(() => { return data.sessions.reduce((obj, { session_id, session_uuid }) => { obj[session_id] = session_uuid; return obj; }, {}); }, [data]); function getType({ view_id, session_id, event_id }) { if (event_id) { return TYPE_EVENT; } if (view_id) { return TYPE_PAGEVIEW; } if (session_id) { return TYPE_SESSION; } return null; } function getIcon(row) { return TYPE_ICONS[getType(row)]; } function getWebsite({ website_id }) { return websites.find(n => n.website_id === website_id)?.name; } function getDetail({ event_type, event_value, view_id, session_id, url, browser, os, country, device, }) { if (event_type) { return (
{event_type} {event_value}
); } if (view_id) { return url; } if (session_id) { return ( ); } } function getTime({ created_at }) { return format(new Date(created_at), 'h:mm:ss'); } function getColor(row) { const { session_id } = row; return stringToColor(uuids[session_id] || `${session_id}${getWebsite(row)}`); } const Row = ({ index, style }) => { const row = logs[index]; return (
{getTime(row)}
{getDetail(row)}
{getWebsite(row)}
); }; return (
{Row}
); }