import React, { useState, useEffect } from 'react' import { useDispatch, useSelector } from 'react-redux' import { useNotify, useTranslate } from 'react-admin' import { Popover, Badge, CircularProgress, IconButton, makeStyles, Tooltip, Card, CardContent, CardActions, Divider, Box, } from '@material-ui/core' import { FiActivity } from 'react-icons/fi' import { BiError } from 'react-icons/bi' import { VscSync } from 'react-icons/vsc' import { GiMagnifyingGlass } from 'react-icons/gi' import subsonic from '../subsonic' import { scanStatusUpdate } from '../actions' import { useInterval } from '../common' import { formatDuration } from '../utils' import config from '../config' const useStyles = makeStyles((theme) => ({ wrapper: { position: 'relative', color: (props) => (props.up ? null : 'orange'), }, progress: { color: theme.palette.primary.light, position: 'absolute', top: 10, left: 10, zIndex: 1, }, button: { color: 'inherit', zIndex: 2, }, counterStatus: { minWidth: '15em', }, })) const getUptime = (serverStart) => formatDuration((Date.now() - serverStart.startTime) / 1000) const Uptime = () => { const serverStart = useSelector((state) => state.activity.serverStart) const [uptime, setUptime] = useState(getUptime(serverStart)) useInterval(() => { setUptime(getUptime(serverStart)) }, 1000) return {uptime} } const ActivityPanel = () => { const serverStart = useSelector((state) => state.activity.serverStart) const up = serverStart.startTime const classes = useStyles({ up }) const translate = useTranslate() const notify = useNotify() const [anchorEl, setAnchorEl] = useState(null) const open = Boolean(anchorEl) const dispatch = useDispatch() const scanStatus = useSelector((state) => state.activity.scanStatus) const handleMenuOpen = (event) => setAnchorEl(event.currentTarget) const handleMenuClose = () => setAnchorEl(null) const triggerScan = (full) => () => subsonic.startScan({ fullScan: full }) // Get updated status on component mount useEffect(() => { subsonic .getScanStatus() .then((resp) => resp.json['subsonic-response']) .then((data) => { if (data.status === 'ok') { dispatch(scanStatusUpdate(data.scanStatus)) } }) }, [dispatch]) useEffect(() => { if (serverStart.version && serverStart.version !== config.version) { notify('ra.notification.new_version', 'info', {}, false, 604800000 * 50) } }, [serverStart, notify]) return (
{up ? : } {scanStatus.scanning && ( )} {translate('activity.serverUptime')}: {up ? : translate('activity.serverDown')} {translate('activity.totalScanned')}: {scanStatus.folderCount || '-'}
) } export default ActivityPanel