Files
pawol.nu/components/teks/teks.js
T

261 lines
7.2 KiB
JavaScript
Raw Normal View History

import {forwardRef} from 'react'
import PropTypes from 'prop-types'
import {
Box,
Grid,
Snackbar,
Typography,
Tooltip,
Zoom,
useMediaQuery
} from '@mui/material'
import {styled} from '@mui/material/styles'
import MuiAlert from '@mui/material/Alert'
import ExplicitIcon from '@mui/icons-material/Explicit'
2022-05-22 00:17:28 +04:00
import {formatJsonString, getAlias} from '../../lib/utils/format'
import VweKomante from '../komante/vwe-komante'
import EntegreMizik from './entegre-mizik'
import OkiMizik from './oki-mizik'
import Pataje from './pataje'
const PREFIX = 'teks'
const classes = {
root: `${PREFIX}-root`,
tooltip: `${PREFIX}-tooltip`,
text: `${PREFIX}-text`,
gridText: `${PREFIX}-gridText`,
grid: `${PREFIX}-grid`,
koute: `${PREFIX}-koute`,
vwe: `${PREFIX}-vwe`,
pataje: `${PREFIX}-pataje`
}
const Root = styled('div')((
{
theme
}
) => ({
[`& .${classes.text}`]: {
marginBottom: '0.5em'
},
[`& .${classes.gridText}`]: {
border: '2px solid grey',
borderRadius: '5px',
marginTop: '2em',
padding: '1em'
},
[`& .${classes.grid}`]: {
marginTop: '1em'
},
[`& .${classes.pataje}`]: {
position: 'fixed',
top: '59px',
left: '110px',
zIndex: 2,
[theme.breakpoints.up('sm')]: {
top: '62px',
left: '340px'
}
}
}))
2022-05-20 02:15:56 +04:00
const langToArray = parole => {
const langArray = []
2022-05-20 02:15:56 +04:00
if (parole && parole.traductions) {
const {francais, anglais, espagnol, allemand, italien} = parole.traductions
if (francais) {
langArray.push({title: 'Traduction', flag: 'fr', lang: francais})
}
2022-05-20 02:15:56 +04:00
if (anglais) {
langArray.push({title: 'Translation', flag: 'en', lang: anglais})
}
if (espagnol) {
langArray.push({title: 'Traducción', flag: 'es', lang: espagnol})
}
2022-05-20 02:15:56 +04:00
if (allemand) {
langArray.push({title: 'Übersetzung', flag: 'de', lang: allemand})
}
2022-05-20 02:15:56 +04:00
if (italien) {
langArray.push({title: 'Traduzione', flag: 'it', lang: italien})
}
}
return langArray
}
const alignTeks = (langArray, isMobile) => {
if (langArray.length > 0 && !isMobile) {
return 'justify'
}
if (langArray.length > 0 && isMobile) {
return 'justify'
}
if (langArray.length === 0 && isMobile) {
return 'justify'
}
if (langArray.length === 0 && !isMobile) {
return 'center'
}
}
const Alert = forwardRef(function Alert(props, ref) {
return <MuiAlert ref={ref} elevation={6} variant='filled' {...props} />
})
const ExplicitTooltip = Tooltip
2022-05-20 02:15:56 +04:00
export default function Teks({parole, paroleId, commentaires, open, success, error, setSuccess, setError, handleClose}) {
const isMobile = useMediaQuery('(max-width:800px)')
2022-05-20 02:15:56 +04:00
const langArray = langToArray(parole)
2022-05-22 00:17:28 +04:00
const aliases = getAlias(parole.artistes, parole.prioriteArtistes)
return (
<Root>
<div className={classes.pataje}>
2022-05-20 02:15:56 +04:00
<Pataje parole={parole} setError={setError} setSuccess={setSuccess} />
</div>
2022-05-22 22:20:23 +04:00
<Box sx={{textAlign: 'center'}}>
<Typography variant='h4' component='div' display='block'>
2022-03-15 22:55:30 +04:00
<Typography gutterBottom variant='h6' component='div'>
2022-05-22 00:17:28 +04:00
{aliases}
</Typography>
2022-03-15 22:55:30 +04:00
<Typography variant='h5' component='div'>
2022-05-20 02:15:56 +04:00
{parole.titre} <small>({parole?.annee})</small>
{parole.explicite && (
<ExplicitTooltip
title='Explicit Lyrics'
placement='bottom'
TransitionComponent={Zoom}
classes={{
tooltip: classes.tooltip
}}
>
<ExplicitIcon style={{marginLeft: 10}} color='secondary' />
</ExplicitTooltip>
)}
</Typography>
<Grid container alignItems='center' justifyContent='center'>
2022-05-20 02:15:56 +04:00
{commentaires && (
<VweKomante commentaires={commentaires} parole={parole} paroleId={paroleId} />
)}
</Grid>
</Typography>
2022-05-20 02:15:56 +04:00
{parole?.user?.data && (
<Typography style={{marginBottom: '1.5em'}} display='block' variant='caption'>
2022-05-23 18:34:55 +04:00
<i>parole soumise par {parole.user.data.attributes.username}</i>
</Typography>
)}
2022-05-22 14:18:30 +04:00
{parole?.userAdmin?.data && !parole.user.data && (
2022-05-08 05:26:23 +04:00
<Typography style={{marginBottom: '1.5em'}} display='block' variant='caption'>
2022-05-23 18:34:55 +04:00
<i>parole soumise par {parole.userAdmin.data.attributes.username || parole.userAdmin.data.attributes.firstname}</i>
2022-05-08 05:26:23 +04:00
</Typography>
)}
</Box>
2022-05-20 02:15:56 +04:00
{(parole.okiMizikID || parole.streamAudio.length > 0) && (
<Box sx={{textAlign: 'center'}}>
2022-05-20 02:15:56 +04:00
<EntegreMizik parole={parole} isMobile={isMobile} />
</Box>
)}
2022-05-20 02:15:56 +04:00
{parole.okiMizikID && (
<OkiMizik id={parole.okiMizikID} parole={parole} />
)}
<Grid container justifyContent='start' spacing={1}>
<Grid item xs={12} md={langArray.length > 0 ? 6 : null}>
<div className={classes.gridText}>
<Typography align='center' className={classes.text} variant='h4'>
Transcription
</Typography>
<Typography paragraph align={alignTeks(langArray, isMobile)} component='span'>
2022-05-20 02:15:56 +04:00
{formatJsonString(parole.transcription)}
</Typography>
</div>
</Grid>
{langArray.map(({title, flag, lang}) => (
<Grid key={title} item xs={12} md={6}>
<div className={classes.gridText}>
<Typography align='center' className={classes.text} variant='h4'>
{flag === 'fr' && (
<span>
🇫🇷
</span>
)}
{flag === 'en' && (
<span>
🇬🇧
</span>
)}
{flag === 'es' && (
<span>
🇪🇸
</span>
2022-03-22 07:12:41 +04:00
)}
{flag === 'de' && (
<span>
🇩🇪
</span>
)}
{flag === 'it' && (
<span>
🇮🇹
</span>
)} {title}
</Typography>
<Typography paragraph align='justify' component='span'>
{formatJsonString(lang)}
</Typography>
</div>
</Grid>
))}
</Grid>
{success && (
<Snackbar open={open} autoHideDuration={3000} onClose={handleClose}>
<Alert severity='success' onClose={handleClose}>
<strong>{success}</strong>
</Alert>
</Snackbar>
)}
{error && (
<Snackbar open={open} autoHideDuration={3000} onClose={handleClose}>
<Alert severity='error' onClose={handleClose}>
<strong>Une erreur sest produite</strong> : <i>{error.message}</i>
</Alert>
</Snackbar>
)}
</Root>
)
}
Teks.propTypes = {
2022-05-20 02:15:56 +04:00
parole: PropTypes.object.isRequired,
paroleId: PropTypes.number.isRequired,
commentaires: PropTypes.array,
open: PropTypes.bool.isRequired,
success: PropTypes.string,
error: PropTypes.string,
setSuccess: PropTypes.func.isRequired,
setError: PropTypes.func.isRequired,
handleClose: PropTypes.func.isRequired
}
Teks.defaultProps = {
2022-05-20 02:15:56 +04:00
commentaires: null,
success: '',
error: ''
}