diff --git a/src/components/Transition/Transition.tsx b/src/components/Transition/Transition.tsx index 1423de011..ae84d80e5 100644 --- a/src/components/Transition/Transition.tsx +++ b/src/components/Transition/Transition.tsx @@ -5,15 +5,15 @@ type Props = { children: JSX.Element, when: boolean, name: string, - onTransitionEnd?: () => void }; -const Transition = ({ children, when, name, onTransitionEnd }: Props) => { +const Transition = ({ children, when, name }: Props) => { const [element, setElement] = useState(null); const [mounted, setMounted] = useState(false); const [state, setState] = useState('enter'); const [active, setActive] = useState(false); + const [transitionEnded, setTransitionEnded] = useState(false); const callbackRef = useCallback((element: HTMLElement | null) => { setElement(element); @@ -30,20 +30,15 @@ const Transition = ({ children, when, name, onTransitionEnd }: Props) => { ); }, [name, state, active, children]); - const handleTransitionEnd = useCallback(() => { - switch (state) { - case 'enter': - onTransitionEnd?.(); - break; - case 'exit': - setMounted(false); - break; - } + const onTransitionEnd = useCallback(() => { + setTransitionEnded(true); + state === 'exit' && setMounted(false); }, [state]); useEffect(() => { setState(when ? 'enter' : 'exit'); when && setMounted(true); + setTransitionEnded(false); }, [when]); useEffect(() => { @@ -53,14 +48,15 @@ const Transition = ({ children, when, name, onTransitionEnd }: Props) => { }, [element]); useEffect(() => { - element?.addEventListener('transitionend', handleTransitionEnd); - return () => element?.removeEventListener('transitionend', handleTransitionEnd); + element?.addEventListener('transitionend', onTransitionEnd); + return () => element?.removeEventListener('transitionend', onTransitionEnd); }, [element, onTransitionEnd]); return ( mounted && cloneElement(children, { ref: callbackRef, className, + transitionEnded }) ); }; diff --git a/src/routes/Player/Player.js b/src/routes/Player/Player.js index 69fdb73e6..6a28e3bbd 100644 --- a/src/routes/Player/Player.js +++ b/src/routes/Player/Player.js @@ -45,7 +45,6 @@ const Player = ({ urlParams, queryParams }) => { const routeFocused = useRouteFocused(); const toast = useToast(); - const [sideDrawerTransitionEnded, setSideDrawerTransitionEnded] = React.useState(false); const [seeking, setSeeking] = React.useState(false); const [casting, setCasting] = React.useState(() => { @@ -511,10 +510,6 @@ const Player = ({ urlParams, queryParams }) => { } }, [settings.pauseOnMinimize, shell.windowClosed, shell.windowHidden]); - React.useEffect(() => { - if (!sideDrawerOpen) setSideDrawerTransitionEnded(false); - }, [sideDrawerOpen]); - React.useLayoutEffect(() => { const onKeyDown = (event) => { switch (event.code) { @@ -831,14 +826,13 @@ const Player = ({ urlParams, queryParams }) => { : null } - setSideDrawerTransitionEnded(true)}> + { diff --git a/src/routes/Player/SideDrawer/SideDrawer.tsx b/src/routes/Player/SideDrawer/SideDrawer.tsx index 6b33f2f9e..e1eb3c1ae 100644 --- a/src/routes/Player/SideDrawer/SideDrawer.tsx +++ b/src/routes/Player/SideDrawer/SideDrawer.tsx @@ -13,14 +13,15 @@ type Props = { className?: string; seriesInfo: SeriesInfo; metaItem: MetaItem; - selectedVideoID: string; - transitionEnded: boolean; closeSideDrawer: () => void; + selected: string; + transitionEnded: boolean; }; -const SideDrawer = memo(forwardRef(({ seriesInfo, className, closeSideDrawer, ...props }: Props, ref) => { +const SideDrawer = memo(forwardRef(({ seriesInfo, className, closeSideDrawer, selected, transitionEnded, ...props }: Props, ref) => { const { core } = useServices(); const [season, setSeason] = useState(seriesInfo?.season); + const selectedVideoRef = useRef(null); const metaItem = useMemo(() => { return seriesInfo ? { @@ -77,12 +78,13 @@ const SideDrawer = memo(forwardRef(({ seriesInfo, classNa event.stopPropagation(); }; - const selectedVideoRef = useRef(null); + const getSelectedRef = useCallback((video: Video) => { + return video.id === selected ? selectedVideoRef : null; + }, [selected]); useEffect(() => { - props.transitionEnded && - selectedVideoRef?.current?.scrollIntoView({ behavior: 'smooth', block: 'center' }); - }, [props.transitionEnded]); + transitionEnded && selectedVideoRef?.current?.scrollIntoView({ behavior: 'smooth', block: 'center' }); + }, [transitionEnded]); return (
@@ -129,7 +131,7 @@ const SideDrawer = memo(forwardRef(({ seriesInfo, classNa scheduled={video.scheduled} onMarkVideoAsWatched={onMarkVideoAsWatched} onMarkSeasonAsWatched={onMarkSeasonAsWatched} - ref={video.id === props.selectedVideoID ? selectedVideoRef : null} + ref={getSelectedRef(video)} /> ))}