import React, { useEffect, useState } from 'react'; import { connect } from 'react-redux'; import { Loader, Modal } from 'UI'; import { toggleFullscreen, closeBottomBlock } from 'Duck/components/player'; import { fetchList } from 'Duck/integrations'; import { PlayerProvider, injectNotes, connectPlayer, init as initPlayer, clean as cleanPlayer, Controls } from 'Player'; import cn from 'classnames'; import RightBlock from './RightBlock'; import withLocationHandlers from 'HOCs/withLocationHandlers'; import { useStore } from 'App/mstore' import PlayerBlockHeader from '../Session_/PlayerBlockHeader'; import PlayerBlock from '../Session_/PlayerBlock'; import styles from '../Session_/session.module.css'; import { countDaysFrom } from 'App/date'; import ReadNote from '../Session_/Player/Controls/components/ReadNote'; import { fetchList as fetchMembers } from 'Duck/member'; const TABS = { EVENTS: 'User Actions', HEATMAPS: 'Click Map', }; const InitLoader = connectPlayer((state) => ({ loading: !state.initialized, }))(Loader); const PlayerContentConnected = connectPlayer((state) => ({ showEvents: !state.showEvents, hasError: state.error, }))(PlayerContent); function PlayerContent({ session, live, fullscreen, activeTab, setActiveTab, hasError }) { const sessionDays = countDaysFrom(session.startedAt); return (
{hasError ? (
{sessionDays > 2 ? 'Session not found.' : 'This session is still being processed.'}
{sessionDays > 2 ? 'Please check your data retention policy.' : 'Please check it again in a few minutes.'}
) : (
{activeTab !== '' && }
)}
); } function RightMenu({ live, tabs, activeTab, setActiveTab, fullscreen }) { return !live && !fullscreen && ; } function WebPlayer(props) { const { session, toggleFullscreen, closeBottomBlock, live, fullscreen, jwt, fetchList } = props; const { notesStore } = useStore() const [activeTab, setActiveTab] = useState(''); const [showNoteModal, setShowNote] = useState(false) const [noteItem, setNoteItem] = useState(null) useEffect(() => { fetchList('issues'); initPlayer(session, jwt); props.fetchMembers() notesStore.fetchSessionNotes(session.sessionId).then(r => { injectNotes(r) const note = props.query.get('note'); if (note) { Controls.pause() setNoteItem(notesStore.getNoteById(parseInt(note, 10), r)) setShowNote(true) } }) const jumptTime = props.query.get('jumpto'); if (jumptTime) { Controls.jump(parseInt(jumptTime)); } return () => cleanPlayer(); }, [session.sessionId]); // LAYOUT (TODO: local layout state - useContext or something..) useEffect( () => () => { toggleFullscreen(false); closeBottomBlock(); }, [] ); const onNoteClose = () => {setShowNote(false); Controls.togglePlay()} return ( {showNoteModal ? ( m.id === noteItem?.userId)?.email || ''} timestamp={noteItem?.timestamp} tags={noteItem?.tags} isPublic={noteItem?.isPublic} message={noteItem?.message} sessionId={noteItem?.sessionId} date={noteItem?.createdAt} noteId={noteItem?.noteId} onClose={onNoteClose} notFound={!noteItem} /> ) : null} ); } export default connect( (state) => ({ session: state.getIn(['sessions', 'current']), jwt: state.get('jwt'), fullscreen: state.getIn(['components', 'player', 'fullscreen']), showEvents: state.get('showEvents'), members: state.getIn(['members', 'list']), }), { toggleFullscreen, closeBottomBlock, fetchList, fetchMembers, } )(withLocationHandlers()(WebPlayer));