Files
navidrome/ui/src/radio/RadioEdit.js
T
Kendall Garner 8877b1695a Add Internet Radio support (#2063)
* add internet radio support

* Add dynamic sidebar icon to Radios

* Fix typos

* Make URL suffix consistent

* Fix typo

* address feedback

* Don't need to preload when playing Internet Radios

* Reorder migration, or else it won't be applied

* Make Radio list view responsive

Also added filter by name, removed RadioActions and RadioContextMenu, and added a default radio icon, in case of favicon is not available.

* Simplify StreamField usage

* fix button, hide progress on mobile

* use js styles over index.css

Co-authored-by: Deluan <deluan@navidrome.org>
2023-01-15 15:11:37 -05:00

135 lines
2.8 KiB
JavaScript

import { Card, makeStyles } from '@material-ui/core'
import React, { useCallback } from 'react'
import {
DateField,
EditContextProvider,
required,
SaveButton,
SimpleForm,
TextInput,
Toolbar,
useEditController,
useMutation,
useNotify,
useRedirect,
} from 'react-admin'
import DeleteRadioButton from './DeleteRadioButton'
const useStyles = makeStyles({
toolbar: {
display: 'flex',
justifyContent: 'space-between',
},
})
function urlValidate(value) {
if (!value) {
return undefined
}
try {
new URL(value)
return undefined
} catch (_) {
return 'ra.validation.url'
}
}
const RadioToolbar = (props) => (
<Toolbar {...props} classes={useStyles()}>
<SaveButton disabled={props.pristine} />
<DeleteRadioButton />
</Toolbar>
)
const RadioEditLayout = ({
hasCreate,
hasShow,
hasEdit,
hasList,
...props
}) => {
const [mutate] = useMutation()
const notify = useNotify()
const redirect = useRedirect()
const { record } = props
const save = useCallback(
async (values) => {
try {
await mutate(
{
type: 'update',
resource: 'radio',
payload: {
id: values.id,
data: {
name: values.name,
streamUrl: values.streamUrl,
homePageUrl: values.homePageUrl,
},
},
},
{ returnPromise: true }
)
notify('resources.radio.notifications.updated', 'info', {
smart_count: 1,
})
redirect('/radio')
} catch (error) {
if (error.body.errors) {
return error.body.errors
}
}
},
[mutate, notify, redirect]
)
if (!record) {
return null
}
return (
<>
{record && (
<Card>
<SimpleForm
variant="outlined"
save={save}
toolbar={<RadioToolbar />}
{...props}
>
<TextInput source="name" validate={[required()]} />
<TextInput
type="url"
source="streamUrl"
fullWidth
validate={[required(), urlValidate]}
/>
<TextInput
type="url"
source="homePageUrl"
fullWidth
validate={[urlValidate]}
/>
<DateField variant="body1" source="updatedAt" showTime />
<DateField variant="body1" source="createdAt" showTime />
</SimpleForm>
</Card>
)}
</>
)
}
const RadioEdit = (props) => {
const controllerProps = useEditController(props)
return (
<EditContextProvider value={controllerProps}>
<RadioEditLayout {...props} record={controllerProps.record} />
</EditContextProvider>
)
}
export default RadioEdit