import React, { useMemo, useState, useCallback } from 'react' import { Button, Datagrid, TextField, TopToolbar, useNotify, useRecordContext, useRefresh, useTranslate, } from 'react-admin' import { makeStyles } from '@material-ui/core/styles' import { useMediaQuery, Tooltip, Chip, Typography } from '@material-ui/core' import { MdError, MdRefresh } from 'react-icons/md' import { List, DateField, SimpleList, useResourceRefresh } from '../common' import { httpClient } from '../dataProvider' import ToggleEnabledSwitch from './ToggleEnabledSwitch' const useStyles = makeStyles((theme) => ({ errorIcon: { color: theme.palette.error.main, marginRight: theme.spacing(0.5), verticalAlign: 'middle', }, errorChip: { backgroundColor: theme.palette.error.light, color: theme.palette.error.contrastText, }, })) const useManifest = () => { const record = useRecordContext() return useMemo(() => { if (!record?.manifest) return null try { return JSON.parse(record.manifest) } catch { return null } }, [record?.manifest]) } const EnabledOrErrorField = () => { const record = useRecordContext() const translate = useTranslate() const classes = useStyles() const manifest = useManifest() if (record.lastError) { return ( } label={translate('resources.plugin.fields.hasError')} className={classes.errorChip} /> ) } return } const ManifestField = ({ source }) => { const manifest = useManifest() if (!manifest) { return - } return {manifest[source] || '-'} } const PluginListActions = () => { const translate = useTranslate() const notify = useNotify() const refresh = useRefresh() const [loading, setLoading] = useState(false) const handleRescan = useCallback(() => { setLoading(true) httpClient('/api/plugin/rescan', { method: 'POST' }) .then(() => { refresh() }) .catch((error) => { notify(error.message || 'ra.page.error', { type: 'warning' }) }) .finally(() => { setLoading(false) }) }, [notify, refresh]) return ( ) } const PluginList = (props) => { const isXsmall = useMediaQuery((theme) => theme.breakpoints.down('xs')) const translate = useTranslate() useResourceRefresh('plugin') return ( } > {isXsmall ? ( record.id} secondaryText={(record) => { try { const manifest = JSON.parse(record.manifest) return manifest.description || '' } catch { return '' } }} tertiaryText={(record) => record.enabled ? translate('resources.plugin.status.enabled') : translate('resources.plugin.status.disabled') } linkType="show" /> ) : ( {!isXsmall && } )} ) } export default PluginList