openreplay/frontend/app/components/Session/Player/LivePlayer/LivePlayerInst.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

118 lines
3.5 KiB
TypeScript

import cn from 'classnames';
import { observer } from 'mobx-react-lite';
import React from 'react';
import { findDOMNode } from 'react-dom';
import {
ILivePlayerContext,
PlayerContext,
} from 'App/components/Session/playerContext';
import { useStore } from 'App/mstore';
import { CONSOLE } from 'App/mstore/uiPlayerStore';
import {
debounceUpdate,
getDefaultPanelHeight,
} from 'Components/Session/Player/ReplayPlayer/PlayerInst';
import stl from 'Components/Session_/Player/player.module.css';
import ConsolePanel from 'Shared/DevTools/ConsolePanel';
import LiveControls from './LiveControls';
import Overlay from './Overlay';
interface IProps {
fullView: boolean;
isMultiview?: boolean;
}
function Player({ fullView, isMultiview }: IProps) {
const { uiPlayerStore, sessionStore } = useStore();
const isAssist = window.location.pathname.includes('/assist/');
const closedLive =
sessionStore.fetchFailed || (isAssist && !sessionStore.current.live);
const defaultHeight = getDefaultPanelHeight();
const [panelHeight, setPanelHeight] = React.useState(defaultHeight);
// @ts-ignore TODO
const playerContext = React.useContext<ILivePlayerContext>(PlayerContext);
const screenWrapper = React.useRef<HTMLDivElement>(null);
const ready = playerContext.store.get().ready;
const bottomBlock = uiPlayerStore.bottomBlock;
React.useEffect(() => {
if (!closedLive || isMultiview) {
const parentElement = findDOMNode(
screenWrapper.current
) as HTMLDivElement | null; //TODO: good architecture
if (parentElement) {
playerContext.player.attach(parentElement);
playerContext.player.play();
}
}
}, []);
React.useEffect(() => {
playerContext.player.scale();
}, [playerContext.player, ready]);
if (!playerContext.player) return null;
const maxWidth = '100vw';
const handleResize = (e: React.MouseEvent<HTMLDivElement>) => {
e.preventDefault();
const startY = e.clientY;
const startHeight = panelHeight;
const handleMouseUp = () => {
document.removeEventListener('mousemove', handleMouseMove);
document.removeEventListener('mouseup', handleMouseUp);
};
const handleMouseMove = (e: MouseEvent) => {
const deltaY = e.clientY - startY;
const diff = startHeight - deltaY;
const max = diff > window.innerHeight / 2 ? window.innerHeight / 2 : diff;
const newHeight = Math.max(50, max);
setPanelHeight(newHeight);
playerContext.player.scale();
debounceUpdate(newHeight);
};
document.addEventListener('mousemove', handleMouseMove);
document.addEventListener('mouseup', handleMouseUp);
};
return (
<div className={cn(stl.playerBody, 'flex flex-1 flex-col relative')}>
<div className="relative flex-1 overflow-hidden">
<Overlay closedLive={closedLive} />
<div
className={cn(stl.screenWrapper, stl.checkers)}
ref={screenWrapper}
/>
</div>
{bottomBlock === CONSOLE ? (
<div
style={{
maxWidth,
width: '100%',
height: panelHeight,
position: 'relative',
overflow: 'hidden',
}}
>
<div
onMouseDown={handleResize}
className={'w-full h-2 cursor-ns-resize absolute top-0 left-0 z-20'}
/>
<ConsolePanel isLive />
</div>
) : null}
{!fullView && !isMultiview ? (
<LiveControls jump={playerContext.player.jump} />
) : null}
</div>
);
}
export default observer(Player);