diff --git a/app/packages/core/src/components/ColorModal/ColorFooter.tsx b/app/packages/core/src/components/ColorModal/ColorFooter.tsx index 04509601a2..f7a7515616 100644 --- a/app/packages/core/src/components/ColorModal/ColorFooter.tsx +++ b/app/packages/core/src/components/ColorModal/ColorFooter.tsx @@ -3,7 +3,7 @@ import * as foq from "@fiftyone/relay"; import * as fos from "@fiftyone/state"; import React, { useEffect } from "react"; import { useMutation } from "react-relay"; -import { useRecoilState, useRecoilValue } from "recoil"; +import { useRecoilValue } from "recoil"; import { ButtonGroup, ModalActionButtonContainer } from "./ShareStyledDiv"; import { activeColorEntry } from "./state"; @@ -14,8 +14,7 @@ const ColorFooter: React.FC = () => { ? canEditCustomColors.message : "Save to dataset app config"; const setColorScheme = fos.useSetSessionColorScheme(); - const [activeColorModalField, setActiveColorModalField] = - useRecoilState(activeColorEntry); + const activeColorModalField = useRecoilValue(activeColorEntry); const [setDatasetColorScheme] = useMutation(foq.setDatasetColorScheme); const colorScheme = useRecoilValue(fos.colorScheme); @@ -26,8 +25,8 @@ const ColorFooter: React.FC = () => { const subscription = useRecoilValue(fos.stateSubscription); useEffect( - () => foq.subscribe(() => setActiveColorModalField(null)), - [setActiveColorModalField] + () => foq.subscribe((_, { set }) => set(activeColorEntry, null)), + [] ); if (!activeColorModalField) return null; diff --git a/app/packages/core/src/components/Modal/ModalLooker.tsx b/app/packages/core/src/components/Modal/ModalLooker.tsx index 08b52c7ca0..6e0313ab6d 100644 --- a/app/packages/core/src/components/Modal/ModalLooker.tsx +++ b/app/packages/core/src/components/Modal/ModalLooker.tsx @@ -1,11 +1,10 @@ import { useTheme } from "@fiftyone/components"; import type { ImageLooker } from "@fiftyone/looker"; import * as fos from "@fiftyone/state"; -import React, { useEffect, useMemo } from "react"; -import { useRecoilCallback, useRecoilValue, useSetRecoilState } from "recoil"; +import React, { useMemo } from "react"; +import { useRecoilCallback, useRecoilValue } from "recoil"; import { ImaVidLookerReact } from "./ImaVidLooker"; import { VideoLookerReact } from "./VideoLooker"; -import { useModalContext } from "./hooks"; import useLooker from "./use-looker"; export const useShowOverlays = () => { @@ -28,21 +27,8 @@ interface LookerProps { } const ModalLookerNoTimeline = React.memo((props: LookerProps) => { - const { id, looker, ref } = useLooker(props); + const { id, ref } = useLooker(props); const theme = useTheme(); - const setModalLooker = useSetRecoilState(fos.modalLooker); - - const { setActiveLookerRef } = useModalContext(); - - useEffect(() => { - setModalLooker(looker); - }, [looker, setModalLooker]); - - useEffect(() => { - if (looker) { - setActiveLookerRef(looker as fos.Lookers); - } - }, [looker, setActiveLookerRef]); return (
({ useKeyEvents(initialRef, sample.sample._id, looker); + const setModalLooker = useSetRecoilState(fos.modalLooker); + + const { setActiveLookerRef } = useModalContext(); + + useEffect(() => { + setModalLooker(looker); + }, [looker, setModalLooker]); + + useEffect(() => { + if (looker) { + setActiveLookerRef(looker as fos.Lookers); + } + }, [looker, setActiveLookerRef]); + return { id, looker, ref, sample, updateLookerOptions }; } diff --git a/app/packages/looker/src/lookers/video.ts b/app/packages/looker/src/lookers/video.ts index 0307594409..305bb3ce83 100644 --- a/app/packages/looker/src/lookers/video.ts +++ b/app/packages/looker/src/lookers/video.ts @@ -15,6 +15,7 @@ import { FrameSample, LabelData, StateUpdate, + VideoConfig, VideoSample, VideoState, } from "../state"; @@ -318,7 +319,7 @@ export class VideoLooker extends AbstractLooker { ...this.getDefaultOptions(), ...options, }, - buffers: [[firstFrame, firstFrame]] as Buffers, + buffers: this.initialBuffers(config), seekBarHovering: false, SHORTCUTS: VIDEO_SHORTCUTS, hasPoster: false, @@ -328,8 +329,8 @@ export class VideoLooker extends AbstractLooker { } hasDefaultZoom(state: VideoState, overlays: Overlay[]): boolean { - let pan = [0, 0]; - let scale = 1; + const pan = [0, 0]; + const scale = 1; return ( scale === state.scale && @@ -402,10 +403,9 @@ export class VideoLooker extends AbstractLooker { lookerWithReader !== this && frameCount !== null ) { - lookerWithReader && lookerWithReader.pause(); - this.setReader(); + lookerWithReader?.pause(); lookerWithReader = this; - this.state.buffers = [[1, 1]]; + this.setReader(); } else if (lookerWithReader !== this && frameCount) { this.state.buffering && this.dispatchEvent("buffering", false); this.state.playing = false; @@ -549,10 +549,14 @@ export class VideoLooker extends AbstractLooker { } updateSample(sample: VideoSample) { - this.state.buffers = [[1, 1]]; - this.frames.clear(); + if (lookerWithReader === this) { + lookerWithReader?.pause(); + lookerWithReader = null; + } + + this.frames = new Map(); + this.state.buffers = this.initialBuffers(this.state.config); super.updateSample(sample); - this.setReader(); } getVideo() { @@ -565,6 +569,11 @@ export class VideoLooker extends AbstractLooker { this.frames.get(frameNumber)?.deref() !== undefined ); } + + private initialBuffers(config: VideoConfig) { + const firstFrame = config.support ? config.support[0] : 1; + return [[firstFrame, firstFrame]] as Buffers; + } } const withFrames = (obj: T): T => diff --git a/app/packages/looker/src/state.ts b/app/packages/looker/src/state.ts index 84281f154a..0b46900802 100644 --- a/app/packages/looker/src/state.ts +++ b/app/packages/looker/src/state.ts @@ -341,6 +341,7 @@ export interface ImageState extends BaseState { } export interface VideoState extends BaseState { + buffers: Buffers; config: VideoConfig; options: VideoOptions; seeking: boolean;