import React, { useEffect, useState } from 'react' import PropTypes from 'prop-types' import Link from '@material-ui/core/Link' import Dialog from '@material-ui/core/Dialog' import IconButton from '@material-ui/core/IconButton' import TableContainer from '@material-ui/core/TableContainer' import Table from '@material-ui/core/Table' import TableBody from '@material-ui/core/TableBody' import TableRow from '@material-ui/core/TableRow' import TableCell from '@material-ui/core/TableCell' import Paper from '@material-ui/core/Paper' import FavoriteBorderIcon from '@material-ui/icons/FavoriteBorder' import { humanize, underscore } from 'inflection' import { useGetOne, usePermissions, useTranslate } from 'react-admin' import config from '../config' import { DialogTitle } from './DialogTitle' import { DialogContent } from './DialogContent' import { INSIGHTS_DOC_URL } from '../consts.js' import subsonic from '../subsonic/index.js' import { Typography } from '@material-ui/core' const links = { homepage: 'navidrome.org', reddit: 'reddit.com/r/Navidrome', twitter: 'twitter.com/navidrome', discord: 'discord.gg/xh7j7yF', source: 'github.com/navidrome/navidrome', bugReports: 'github.com/navidrome/navidrome/issues/new/choose', featureRequests: 'github.com/navidrome/navidrome/discussions/new', } const LinkToVersion = ({ version }) => { if (version === 'dev') { return <>{version} } const parts = version.split(' ') const commitID = parts[1].replace(/[()]/g, '') const isSnapshot = version.includes('SNAPSHOT') const url = isSnapshot ? `https://github.com/navidrome/navidrome/compare/v${ parts[0].split('-')[0] }...${commitID}` : `https://github.com/navidrome/navidrome/releases/tag/v${parts[0]}` return ( <> {parts[0]} {' (' + commitID + ')'} ) } const ShowVersion = ({ uiVersion, serverVersion }) => { const translate = useTranslate() const showRefresh = uiVersion !== serverVersion return ( <> {translate('menu.version')}: {showRefresh && ( UI {translate('menu.version')}: window.location.reload()}> {' ' + translate('ra.notification.new_version')} )} ) } const AboutDialog = ({ open, onClose }) => { const translate = useTranslate() const { permissions } = usePermissions() const { data, loading } = useGetOne('insights', 'insights_status') const [serverVersion, setServerVersion] = useState('') const uiVersion = config.version useEffect(() => { subsonic .ping() .then((resp) => resp.json['subsonic-response']) .then((data) => { if (data.status === 'ok') { setServerVersion(data.serverVersion) } }) .catch((e) => { // eslint-disable-next-line no-console console.error('error pinging server', e) }) }, [setServerVersion]) const lastRun = !loading && data?.lastRun let insightsStatus = 'N/A' if (lastRun === 'disabled') { insightsStatus = translate('about.links.insights.disabled') } else if (lastRun && lastRun?.startsWith('1969-12-31')) { insightsStatus = translate('about.links.insights.waiting') } else if (lastRun) { insightsStatus = lastRun } return ( Navidrome Music Server {Object.keys(links).map((key) => { return ( {translate(`about.links.${key}`, { _: humanize(underscore(key)), })} : {links[key]} ) })} {permissions === 'admin' ? ( {translate(`about.links.lastInsightsCollection`)}: {insightsStatus} ) : null} ko-fi.com/deluan
) } AboutDialog.propTypes = { open: PropTypes.bool.isRequired, onClose: PropTypes.func.isRequired, } export { AboutDialog, LinkToVersion }