openreplay/frontend/app/components/Session/Player/LivePlayer/LiveControls.tsx
Delirium a71381da40
getting rid of redux for good (#2556)
* start moving ui to redux tlk

* remove unused reducer

* changes for gdpr and site types

* ui: migrating duck/roles to mobx

* ui: drop unreferenced types

* ui: drop unreferenced types

* ui: move player slice reducer to mobx family

* ui: move assignments to issueReportingStore.ts

* remove issues store

* some fixes after issues store

* remove errors reducer, drop old components

* finish removing errors reducer

* start moving integrations state to mobx

* change(ui): funnel duck cleanup

* change(ui): custom fields

* change(ui): customMetrics cleanup

* change(ui): customMetrics cleanup

* change(ui): duck/filters minor cleanup

* change(ui): duck/filters cleanup

* change(ui): duck/customMetrics cleanup and upgrades

* fix integrations service, fix babel config to >.25 + not ie

* refactoring integrations reducers etc WIP

* finish removing integrations state

* some fixes for integrated check

* start of projects refactoring

* move api and "few" files to new project store

* new batch for site -> projects

* fix setid context

* move all critical components, drop site duck

* remove all duck/site refs, remove old components

* fixup for SessionTags.tsx, remove duck/sources (?)

* move session store

* init sessionstore outside of context

* fix userfilter

* replace simple actions for session store

* sessions sotre

* Rtm temp (#2597)

* change(ui): duck/search wip

* change(ui): duck/search wip

* change(ui): duck/search wip

* change(ui): duck/searchLive wip

* change(ui): duck/searchLive wip

* change(ui): duck/searchLive wip

* change(ui): duck/searchLive wip

* change(ui): search states

* change(ui): search states

* change(ui): search states

* change(ui): fix savedSearch store

* change(ui): fix savedSearch store

* some fixes for session connector

* change(ui): fix savedSearch store

* change(ui): fix searchLive

* change(ui): fix searchLive

* fixes for session replay

* change(ui): bookmark fetch

* last components for sessions

* add fetchautoplaylist

* finish session reducer, remove deleted reducers

* change(ui): fix the search fetch

* change(ui): fix the search fetch

* fix integrations call ctx

* ensure ctx for sessionstore

* fix(ui): checking for latest sessions path

* start removing user reducer

* removing user reducer pt2...

* finish user store

* remove rand log

* fix crashes

* tinkering workflow file for tracker test

* making sure prefetched sessions work properly

* fix conflict

* fix router redirects during loading

---------

Co-authored-by: Shekar Siri <sshekarsiri@gmail.com>
2024-10-03 11:38:36 +02:00

131 lines
4.1 KiB
TypeScript

import React from 'react';
import cn from 'classnames';
import { useStore } from 'App/mstore';
import LiveTag from './LiveTag';
import AssistSessionsTabs from './AssistSessionsTabs';
import {
CONSOLE
} from 'App/mstore/uiPlayerStore';
import { PlayerContext, ILivePlayerContext } from 'App/components/Session/playerContext';
import { observer } from 'mobx-react-lite';
import { useLocation } from 'react-router-dom';
import AssistDuration from './AssistDuration';
import Timeline from './Timeline';
import ControlButton from 'Components/Session_/Player/Controls/ControlButton';
import { SKIP_INTERVALS } from 'Components/Session_/Player/Controls/Controls';
import styles from 'Components/Session_/Player/Controls/controls.module.css';
function Controls(props: any) {
const { uiPlayerStore, searchStoreLive, sessionStore } = useStore();
const toggleBottomBlock = uiPlayerStore.toggleBottomBlock;
const bottomBlock = uiPlayerStore.bottomBlock;
const skipInterval = uiPlayerStore.skipInterval;
// @ts-ignore ?? TODO
const { player, store } = React.useContext<ILivePlayerContext>(PlayerContext);
const [noControls, setNoControls] = React.useState(false);
const [noGrid, setNoGrid] = React.useState(false);
const { search } = useLocation();
const { jumpToLive } = player;
const {
livePlay,
currentTab,
tabStates
} = store.get();
const exceptionsList = tabStates[currentTab]?.exceptionsList || [];
const logRedCount = tabStates[currentTab]?.logMarkedCountNow || 0;
const showExceptions = exceptionsList.length > 0;
const session = sessionStore.current;
const fetchAssistSessions = sessionStore.fetchLiveSessions;
const totalAssistSessions = sessionStore.totalLiveSessions;
const closedLive = !!sessionStore.errorStack || !!sessionStore.current;
const onKeyDown = (e: any) => {
if (e.target instanceof HTMLInputElement || e.target instanceof HTMLTextAreaElement) {
return;
}
if (e.key === 'ArrowRight') {
forthTenSeconds();
}
if (e.key === 'ArrowLeft') {
backTenSeconds();
}
};
React.useEffect(() => {
document.addEventListener('keydown', onKeyDown.bind(this));
if (totalAssistSessions === 0) {
fetchAssistSessions();
}
const queryParams = new URLSearchParams(search);
if (
(queryParams.has('noFooter') && queryParams.get('noFooter') === 'true')
) {
setNoControls(true);
}
if (
(queryParams.has('noGrid') && queryParams.get('noGrid') === 'true')
) {
setNoGrid(true);
}
return () => {
document.removeEventListener('keydown', onKeyDown.bind(this));
};
}, []);
const forthTenSeconds = () => {
// @ts-ignore
player.jumpInterval(SKIP_INTERVALS[skipInterval]);
};
const backTenSeconds = () => {
// @ts-ignore
player.jumpInterval(-SKIP_INTERVALS[skipInterval]);
};
const toggleBottomTools = (blockName: number) => {
toggleBottomBlock(blockName);
};
return (
<div className={styles.controls}>
{session.liveOnly ? null : <Timeline />}
{!noControls ?
<div className={cn(styles.buttons, '!px-5 !pt-0')} data-is-live style={{ height: noGrid ? '40px' : '' }}>
<div className="flex items-center">
{!closedLive && (
<div className={styles.buttonsLeft}>
<LiveTag isLive={livePlay} onClick={() => (livePlay ? null : jumpToLive())} />
<div className="font-semibold px-2">
<AssistDuration />
</div>
</div>
)}
</div>
{totalAssistSessions > 1 && !noGrid ? (
<div>
<AssistSessionsTabs session={session} />
</div>
) : null}
<div className="flex items-center h-full">
<ControlButton
onClick={() => toggleBottomTools(CONSOLE)}
active={bottomBlock === CONSOLE}
label="Console"
hasErrors={logRedCount > 0 || showExceptions}
/>
</div>
</div>
: null}
</div>
);
}
const ControlPlayer = observer(Controls);
export default ControlPlayer;