|
@@ -73,6 +73,11 @@ type ReplayPlayerContextProps = {
|
|
|
*/
|
|
|
isBuffering: boolean;
|
|
|
|
|
|
+ /**
|
|
|
+ * Set to true when the replay finish event is fired
|
|
|
+ */
|
|
|
+ isFinished: boolean;
|
|
|
+
|
|
|
/**
|
|
|
* Whether the video is currently playing
|
|
|
*/
|
|
@@ -93,6 +98,11 @@ type ReplayPlayerContextProps = {
|
|
|
*/
|
|
|
replay: ReplayReader | null;
|
|
|
|
|
|
+ /**
|
|
|
+ * Restart the replay
|
|
|
+ */
|
|
|
+ restart: () => void;
|
|
|
+
|
|
|
/**
|
|
|
* Set the currentHoverTime so collaborating components can highlight related
|
|
|
* information
|
|
@@ -139,10 +149,12 @@ const ReplayPlayerContext = React.createContext<ReplayPlayerContextProps>({
|
|
|
highlight: () => {},
|
|
|
initRoot: () => {},
|
|
|
isBuffering: false,
|
|
|
+ isFinished: false,
|
|
|
isPlaying: false,
|
|
|
isSkippingInactive: false,
|
|
|
removeHighlight: () => {},
|
|
|
replay: null,
|
|
|
+ restart: () => {},
|
|
|
setCurrentHoverTime: () => {},
|
|
|
setCurrentTime: () => {},
|
|
|
setSpeed: () => {},
|
|
@@ -183,18 +195,18 @@ export function Provider({children, replay, initialTimeOffset = 0, value = {}}:
|
|
|
const [dimensions, setDimensions] = useState<Dimensions>({height: 0, width: 0});
|
|
|
const [currentHoverTime, setCurrentHoverTime] = useState<undefined | number>();
|
|
|
const [isPlaying, setIsPlaying] = useState(false);
|
|
|
+ const [finishedAtMS, setFinishedAtMS] = useState<number>(-1);
|
|
|
const [isSkippingInactive, setIsSkippingInactive] = useState(false);
|
|
|
const [speed, setSpeedState] = useState(1);
|
|
|
const [fastForwardSpeed, setFFSpeed] = useState(0);
|
|
|
const [buffer, setBufferTime] = useState({target: -1, previous: -1});
|
|
|
const playTimer = useRef<number | undefined>(undefined);
|
|
|
|
|
|
+ const isFinished = replayerRef.current?.getCurrentTime() === finishedAtMS;
|
|
|
+
|
|
|
const forceDimensions = (dimension: Dimensions) => {
|
|
|
setDimensions(dimension);
|
|
|
};
|
|
|
- const setPlayingFalse = () => {
|
|
|
- setIsPlaying(false);
|
|
|
- };
|
|
|
const onFastForwardStart = (e: {speed: number}) => {
|
|
|
setFFSpeed(e.speed);
|
|
|
};
|
|
@@ -229,6 +241,11 @@ export function Provider({children, replay, initialTimeOffset = 0, value = {}}:
|
|
|
removeHighlightedNode({replayer, nodeId});
|
|
|
}, []);
|
|
|
|
|
|
+ const setReplayFinished = useCallback(() => {
|
|
|
+ setFinishedAtMS(replayerRef.current?.getCurrentTime() ?? -1);
|
|
|
+ setIsPlaying(false);
|
|
|
+ }, []);
|
|
|
+
|
|
|
const initRoot = useCallback(
|
|
|
(root: RootElem) => {
|
|
|
if (events === undefined) {
|
|
@@ -277,7 +294,7 @@ export function Provider({children, replay, initialTimeOffset = 0, value = {}}:
|
|
|
|
|
|
// @ts-expect-error: rrweb types event handlers with `unknown` parameters
|
|
|
inst.on(ReplayerEvents.Resize, forceDimensions);
|
|
|
- inst.on(ReplayerEvents.Finish, setPlayingFalse);
|
|
|
+ inst.on(ReplayerEvents.Finish, setReplayFinished);
|
|
|
// @ts-expect-error: rrweb types event handlers with `unknown` parameters
|
|
|
inst.on(ReplayerEvents.SkipStart, onFastForwardStart);
|
|
|
inst.on(ReplayerEvents.SkipEnd, onFastForwardEnd);
|
|
@@ -288,7 +305,7 @@ export function Provider({children, replay, initialTimeOffset = 0, value = {}}:
|
|
|
// @ts-expect-error
|
|
|
replayerRef.current = inst;
|
|
|
},
|
|
|
- [events, theme.purple200, hasNewEvents]
|
|
|
+ [events, theme.purple200, hasNewEvents, setReplayFinished]
|
|
|
);
|
|
|
|
|
|
useEffect(() => {
|
|
@@ -379,6 +396,13 @@ export function Provider({children, replay, initialTimeOffset = 0, value = {}}:
|
|
|
[getCurrentTime]
|
|
|
);
|
|
|
|
|
|
+ const restart = useCallback(() => {
|
|
|
+ if (replayerRef.current) {
|
|
|
+ replayerRef.current.play(0);
|
|
|
+ setIsPlaying(true);
|
|
|
+ }
|
|
|
+ }, []);
|
|
|
+
|
|
|
const toggleSkipInactive = useCallback((skip: boolean) => {
|
|
|
const replayer = replayerRef.current;
|
|
|
if (!replayer) {
|
|
@@ -425,10 +449,12 @@ export function Provider({children, replay, initialTimeOffset = 0, value = {}}:
|
|
|
highlight,
|
|
|
initRoot,
|
|
|
isBuffering,
|
|
|
+ isFinished,
|
|
|
isPlaying,
|
|
|
isSkippingInactive,
|
|
|
removeHighlight,
|
|
|
replay,
|
|
|
+ restart,
|
|
|
setCurrentHoverTime,
|
|
|
setCurrentTime,
|
|
|
setSpeed,
|