mirror of
https://github.com/jellyfin/jellyfin-web
synced 2025-03-30 19:56:21 +00:00
Add RefreshIndicator
This commit is contained in:
parent
22bce0cd94
commit
090e2991cb
1 changed files with 92 additions and 0 deletions
92
src/elements/emby-itemrefreshindicator/RefreshIndicator.tsx
Normal file
92
src/elements/emby-itemrefreshindicator/RefreshIndicator.tsx
Normal file
|
@ -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 (
|
||||
<Box sx={{ position: 'relative', display: 'inline-flex' }}>
|
||||
<CircularProgress variant='determinate' {...props} />
|
||||
<Box
|
||||
sx={{
|
||||
top: 0,
|
||||
left: 0,
|
||||
bottom: 0,
|
||||
right: 0,
|
||||
position: 'absolute',
|
||||
display: 'flex',
|
||||
alignItems: 'center',
|
||||
justifyContent: 'center'
|
||||
}}
|
||||
>
|
||||
<Typography
|
||||
variant='caption'
|
||||
component='div'
|
||||
color='text.secondary'
|
||||
>
|
||||
{toPercent(props.value / 100, getCurrentDateTimeLocale())}
|
||||
</Typography>
|
||||
</Box>
|
||||
</Box>
|
||||
);
|
||||
}
|
||||
|
||||
interface RefreshIndicatorProps {
|
||||
item: ItemDto;
|
||||
className?: string;
|
||||
}
|
||||
|
||||
const RefreshIndicator: FC<RefreshIndicatorProps> = ({ 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 (
|
||||
<div className={progressringClass}>
|
||||
<CircularProgressWithLabel value={Math.floor(progress)} />
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
||||
export default RefreshIndicator;
|
Loading…
Add table
Add a link
Reference in a new issue