quintodrome/ui/src/personal/Personal.js

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

125 lines
2.9 KiB
JavaScript
Raw Normal View History

import React from 'react'
2020-03-31 13:02:22 -08:00
import { useDispatch, useSelector } from 'react-redux'
import { Card } from '@material-ui/core'
import {
SelectInput,
2020-05-01 14:29:50 -08:00
SimpleForm,
Title,
useGetList,
useLocale,
2020-05-01 14:29:50 -08:00
useSetLocale,
useTranslate,
} from 'react-admin'
import { makeStyles } from '@material-ui/core/styles'
import HelpOutlineIcon from '@material-ui/icons/HelpOutline'
import { changeTheme } from './actions'
2020-03-31 13:02:22 -08:00
import themes from '../themes'
import { docsUrl } from '../utils/docsUrl'
const useStyles = makeStyles({
root: { marginTop: '1em' },
})
const helpKey = '_help'
function openInNewTab(url) {
const win = window.open(url, '_blank')
win.focus()
}
const HelpMsg = ({ caption }) => (
<>
<HelpOutlineIcon />
&nbsp;&nbsp; {caption}
</>
)
const SelectLanguage = (props) => {
2020-05-01 14:29:50 -08:00
const { ids, data, loaded } = useGetList(
'translation',
{ page: 1, perPage: -1 },
{ field: '', order: '' },
{}
)
const translate = useTranslate()
const setLocale = useSetLocale()
2020-05-01 14:29:50 -08:00
const locale = useLocale()
const langChoices = [{ id: 'en', name: 'English' }]
if (loaded) {
ids.forEach((id) => langChoices.push({ id: id, name: data[id].name }))
}
langChoices.sort((a, b) => a.name.localeCompare(b.name))
langChoices.push({
id: helpKey,
name: <HelpMsg caption={'Help to translate'} />,
})
2020-05-01 14:29:50 -08:00
return (
<SelectInput
{...props}
2020-05-01 14:29:50 -08:00
source="language"
label={translate('menu.personal.options.language')}
defaultValue={locale}
choices={langChoices}
2020-05-01 14:29:50 -08:00
translateChoice={false}
onChange={(event) => {
if (event.target.value === helpKey) {
openInNewTab(docsUrl('/docs/developers/translations/'))
return
}
setLocale(event.target.value)
localStorage.setItem('locale', event.target.value)
}}
/>
)
}
const SelectTheme = (props) => {
const translate = useTranslate()
const dispatch = useDispatch()
const currentTheme = useSelector((state) => state.theme)
const themeChoices = Object.keys(themes).map((key) => {
return { id: key, name: themes[key].themeName }
})
themeChoices.push({
id: helpKey,
name: <HelpMsg caption={'Create your own'} />,
})
return (
<SelectInput
{...props}
source="theme"
label={translate('menu.personal.options.theme')}
defaultValue={currentTheme}
2020-05-01 14:29:50 -08:00
translateChoice={false}
choices={themeChoices}
onChange={(event) => {
if (event.target.value === helpKey) {
openInNewTab(docsUrl('/docs/developers/creating-themes/'))
return
}
dispatch(changeTheme(event.target.value))
}}
/>
)
}
const Personal = () => {
const translate = useTranslate()
const classes = useStyles()
2020-03-31 13:02:22 -08:00
return (
<Card className={classes.root}>
<Title title={'Navidrome - ' + translate('menu.personal.name')} />
2020-04-03 17:03:34 -08:00
<SimpleForm toolbar={null}>
<SelectTheme />
<SelectLanguage />
</SimpleForm>
</Card>
)
}
export default Personal