diff --git a/src/common/animations.less b/src/common/animations.less index 3b9815f14..141dc52e2 100644 --- a/src/common/animations.less +++ b/src/common/animations.less @@ -88,7 +88,7 @@ .fade-active { opacity: 1; - transition: opacity 0.3s cubic-bezier(0.32, 0, 0.67, 0); + transition: opacity 0.1s cubic-bezier(0.32, 0, 0.67, 0); } .fade-exit { diff --git a/src/components/Transition/Transition.tsx b/src/components/Transition/Transition.tsx index e12b2a42b..beaef325a 100644 --- a/src/components/Transition/Transition.tsx +++ b/src/components/Transition/Transition.tsx @@ -5,9 +5,10 @@ type Props = { children: JSX.Element, when: boolean, name: string, + duration?: number, }; -const Transition = ({ children, when, name }: Props) => { +const Transition = ({ children, when, name, duration }: Props) => { const [element, setElement] = useState(null); const [mounted, setMounted] = useState(false); @@ -29,6 +30,10 @@ const Transition = ({ children, when, name }: Props) => { ); }, [name, state, active, children]); + const style = useMemo(() => { + if (duration) return { transitionDuration: `${duration}ms` }; + }, [duration]); + const onTransitionEnd = useCallback(() => { state === 'exit' && setMounted(false); }, [state]); @@ -53,6 +58,7 @@ const Transition = ({ children, when, name }: Props) => { mounted && cloneElement(children, { ref: callbackRef, className, + style, }) ); }; diff --git a/src/routes/Player/AudioMenu/AudioMenu.tsx b/src/routes/Player/AudioMenu/AudioMenu.tsx index 3149f1336..c90311a80 100644 --- a/src/routes/Player/AudioMenu/AudioMenu.tsx +++ b/src/routes/Player/AudioMenu/AudioMenu.tsx @@ -1,4 +1,4 @@ -import React, { MouseEvent, useCallback } from 'react'; +import React, { forwardRef, MouseEvent, useCallback } from 'react'; import { useTranslation } from 'react-i18next'; import classNames from 'classnames'; import { languages } from 'stremio/common'; @@ -12,7 +12,7 @@ type Props = { onAudioTrackSelected: (id: string) => void, }; -const AudioMenu = ({ className, selectedAudioTrackId, audioTracks, onAudioTrackSelected }: Props) => { +const AudioMenu = forwardRef(({ className, selectedAudioTrackId, audioTracks, onAudioTrackSelected }: Props, ref) => { const { t } = useTranslation(); const onAudioTrackClick = useCallback(({ currentTarget }: MouseEvent) => { @@ -26,7 +26,7 @@ const AudioMenu = ({ className, selectedAudioTrackId, audioTracks, onAudioTrackS }; return ( -
+
{ t('AUDIO_TRACKS') } @@ -62,6 +62,6 @@ const AudioMenu = ({ className, selectedAudioTrackId, audioTracks, onAudioTrackS
); -}; +}); export default AudioMenu; diff --git a/src/routes/Player/Indicator/Indicator.tsx b/src/routes/Player/Indicator/Indicator.tsx index f88682e71..7525fe1cd 100644 --- a/src/routes/Player/Indicator/Indicator.tsx +++ b/src/routes/Player/Indicator/Indicator.tsx @@ -61,7 +61,7 @@ const Indicator = ({ className, videoState, disabled }: Props) => { }, [videoState]); return ( - +
{label} {value}
diff --git a/src/routes/Player/OptionsMenu/OptionsMenu.js b/src/routes/Player/OptionsMenu/OptionsMenu.js index 3f2c11cd4..3580bee13 100644 --- a/src/routes/Player/OptionsMenu/OptionsMenu.js +++ b/src/routes/Player/OptionsMenu/OptionsMenu.js @@ -9,7 +9,7 @@ const { useServices } = require('stremio/services'); const Option = require('./Option'); const styles = require('./styles'); -const OptionsMenu = ({ className, stream, playbackDevices, extraSubtitlesTracks, selectedExtraSubtitlesTrackId }) => { +const OptionsMenu = React.forwardRef(({ className, stream, playbackDevices, extraSubtitlesTracks, selectedExtraSubtitlesTrackId }, ref) => { const { t } = useTranslation(); const { core } = useServices(); const platform = usePlatform(); @@ -108,7 +108,7 @@ const OptionsMenu = ({ className, stream, playbackDevices, extraSubtitlesTracks, }, []); return ( -
+
{ streamingUrl || downloadUrl ?
); }; diff --git a/src/routes/Player/SpeedMenu/SpeedMenu.js b/src/routes/Player/SpeedMenu/SpeedMenu.js index f71ce6116..48e1d17e8 100644 --- a/src/routes/Player/SpeedMenu/SpeedMenu.js +++ b/src/routes/Player/SpeedMenu/SpeedMenu.js @@ -9,7 +9,7 @@ const styles = require('./styles'); const RATES = Array.from(Array(8).keys(), (n) => n * 0.25 + 0.25).reverse(); -const SpeedMenu = ({ className, playbackSpeed, onPlaybackSpeedChanged }) => { +const SpeedMenu = React.forwardRef(({ className, playbackSpeed, onPlaybackSpeedChanged }, ref) => { const { t } = useTranslation(); const onMouseDown = React.useCallback((event) => { event.nativeEvent.speedMenuClosePrevented = true; @@ -20,7 +20,7 @@ const SpeedMenu = ({ className, playbackSpeed, onPlaybackSpeedChanged }) => { } }, [onPlaybackSpeedChanged]); return ( -
+
{ t('PLAYBACK_SPEED') }
@@ -39,7 +39,7 @@ const SpeedMenu = ({ className, playbackSpeed, onPlaybackSpeedChanged }) => {
); -}; +}); SpeedMenu.propTypes = { className: PropTypes.string, diff --git a/src/routes/Player/StatisticsMenu/StatisticsMenu.js b/src/routes/Player/StatisticsMenu/StatisticsMenu.js index b5f5232ea..2c138a4e3 100644 --- a/src/routes/Player/StatisticsMenu/StatisticsMenu.js +++ b/src/routes/Player/StatisticsMenu/StatisticsMenu.js @@ -6,10 +6,10 @@ const classNames = require('classnames'); const PropTypes = require('prop-types'); const styles = require('./styles.less'); -const StatisticsMenu = ({ className, peers, speed, completed, infoHash }) => { +const StatisticsMenu = React.forwardRef(({ className, peers, speed, completed, infoHash }, ref) => { const { t } = useTranslation(); return ( -
+
{t('PLAYER_STATISTICS')}
@@ -49,7 +49,7 @@ const StatisticsMenu = ({ className, peers, speed, completed, infoHash }) => {
); -}; +}); StatisticsMenu.propTypes = { className: PropTypes.string, diff --git a/src/routes/Player/SubtitlesMenu/SubtitlesMenu.js b/src/routes/Player/SubtitlesMenu/SubtitlesMenu.js index 9b0a8e90d..8717aab07 100644 --- a/src/routes/Player/SubtitlesMenu/SubtitlesMenu.js +++ b/src/routes/Player/SubtitlesMenu/SubtitlesMenu.js @@ -30,7 +30,7 @@ const sortByValues = (items, values) => items.sort((a, b) => { return left - right; }); -const SubtitlesMenu = React.memo((props) => { +const SubtitlesMenu = React.memo(React.forwardRef((props, ref) => { const subtitlesTracks = React.useMemo(() => { return normalizeTracksLang(Array.isArray(props.subtitlesTracks) ? props.subtitlesTracks : []); }, [props.subtitlesTracks]); @@ -153,7 +153,7 @@ const SubtitlesMenu = React.memo((props) => { } }, [props.selectedSubtitlesTrackId, props.selectedExtraSubtitlesTrackId, props.subtitlesOffset, props.extraSubtitlesOffset, props.onSubtitlesOffsetChanged, props.onExtraSubtitlesOffsetChanged]); return ( -
+
{ t('PLAYER_SUBTITLES_LANGUAGES') }
@@ -255,7 +255,7 @@ const SubtitlesMenu = React.memo((props) => {
); -}); +})); SubtitlesMenu.displayName = 'MainNavBars';