mirror of
https://github.com/Stremio/stremio-web.git
synced 2026-04-20 10:42:12 +00:00
73 lines
2.1 KiB
TypeScript
73 lines
2.1 KiB
TypeScript
import React, { useEffect, useMemo, useRef, useState } from 'react';
|
|
import classNames from 'classnames';
|
|
import { t } from 'i18next';
|
|
import { Transition } from 'stremio/components';
|
|
import { useBinaryState } from 'stremio/common';
|
|
import styles from './Indicator.less';
|
|
|
|
type Property = {
|
|
label: string,
|
|
format: (value: number) => string,
|
|
};
|
|
|
|
const PROPERTIES: Record<string, Property> = {
|
|
'extraSubtitlesDelay': {
|
|
label: 'SUBTITLES_DELAY',
|
|
format: (value) => `${(value / 1000).toFixed(2)}s`,
|
|
},
|
|
};
|
|
|
|
type VideoState = Record<string, number>;
|
|
|
|
type Props = {
|
|
className: string,
|
|
videoState: VideoState,
|
|
};
|
|
|
|
const Indicator = ({ className, videoState }: Props) => {
|
|
const timeout = useRef<NodeJS.Timeout | null>(null);
|
|
const prevVideoState = useRef<VideoState>(videoState);
|
|
|
|
const [shown, show, hide] = useBinaryState(false);
|
|
const [current, setCurrent] = useState<string | null>(null);
|
|
|
|
const label = useMemo(() => {
|
|
const property = current && PROPERTIES[current];
|
|
return property && t(property.label);
|
|
}, [current]);
|
|
|
|
const value = useMemo(() => {
|
|
const property = current && PROPERTIES[current];
|
|
const value = current && videoState[current];
|
|
return property && value && property.format(value);
|
|
}, [current, videoState]);
|
|
|
|
useEffect(() => {
|
|
for (const property of Object.keys(PROPERTIES)) {
|
|
const prev = prevVideoState.current[property];
|
|
const next = videoState[property];
|
|
|
|
if (next && next !== prev) {
|
|
setCurrent(property);
|
|
show();
|
|
|
|
timeout.current && clearTimeout(timeout.current);
|
|
timeout.current = setTimeout(hide, 1000);
|
|
}
|
|
}
|
|
|
|
prevVideoState.current = videoState;
|
|
}, [videoState]);
|
|
|
|
return (
|
|
<Transition when={shown} name={'fade'}>
|
|
<div className={classNames(className, styles['indicator-container'])}>
|
|
<div className={styles['indicator']}>
|
|
<div>{label} {value}</div>
|
|
</div>
|
|
</div>
|
|
</Transition>
|
|
);
|
|
};
|
|
|
|
export default Indicator;
|