diff --git a/src/elements/emby-itemrefreshindicator/RefreshIndicator.tsx b/src/elements/emby-itemrefreshindicator/RefreshIndicator.tsx new file mode 100644 index 0000000000..aabc709201 --- /dev/null +++ b/src/elements/emby-itemrefreshindicator/RefreshIndicator.tsx @@ -0,0 +1,92 @@ +import React, { FC, useCallback, useEffect, useState } from 'react'; +import Events, { Event } from 'utils/events'; +import serverNotifications from 'scripts/serverNotifications'; +import classNames from 'classnames'; + +import CircularProgress, { + CircularProgressProps +} from '@mui/material/CircularProgress'; +import Typography from '@mui/material/Typography'; +import Box from '@mui/material/Box'; +import { toPercent } from 'utils/number'; +import { getCurrentDateTimeLocale } from 'scripts/globalize'; +import type { ItemDto } from 'types/itemDto'; + +function CircularProgressWithLabel( + props: CircularProgressProps & { value: number } +) { + return ( + + + + + {toPercent(props.value / 100, getCurrentDateTimeLocale())} + + + + ); +} + +interface RefreshIndicatorProps { + item: ItemDto; + className?: string; +} + +const RefreshIndicator: FC = ({ item, className }) => { + const [progress, setProgress] = useState(item.RefreshProgress || 0); + + const onRefreshProgress = useCallback((_e: Event, apiClient, info) => { + if (info.ItemId === item?.Id) { + setProgress(parseFloat(info.Progress)); + } + }, [item?.Id]); + + const unbindEvents = useCallback(() => { + Events.off(serverNotifications, 'RefreshProgress', onRefreshProgress); + }, [onRefreshProgress]); + + const bindEvents = useCallback(() => { + unbindEvents(); + + if (item?.Id) { + Events.on(serverNotifications, 'RefreshProgress', onRefreshProgress); + } + }, [item?.Id, onRefreshProgress, unbindEvents]); + + useEffect(() => { + bindEvents(); + + return () => { + unbindEvents(); + }; + }, [bindEvents, item.Id, unbindEvents]); + + const progressringClass = classNames( + 'progressring', + className, + { 'hide': !progress || progress >= 100 } + ); + + return ( +
+ +
+ ); +}; + +export default RefreshIndicator;