Files
pawol.nu/components/teks/teks-drawer.js
T
Cédric FAMIBELLE-PRONZOLA 6047b89eed Fix components position
2022-01-21 07:56:15 +04:00

434 lines
12 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import {useEffect, useState} from 'react'
import PropTypes from 'prop-types'
import Link from 'next/link'
import {useRouter} from 'next/router'
import {useSession} from 'next-auth/client'
import {
Grid,
Toolbar,
Typography,
AppBar,
CssBaseline,
Drawer,
Hidden,
IconButton,
Box,
useMediaQuery,
Snackbar,
Tooltip,
Zoom
} from '@mui/material'
import KeyboardBackspaceIcon from '@mui/icons-material/KeyboardBackspace'
import ExplicitIcon from '@mui/icons-material/Explicit'
import MenuIcon from '@mui/icons-material/Menu'
import {useTheme, styled} from '@mui/material/styles'
import MuiAlert from '@mui/material/Alert'
import {formatJsonString} from '../../lib/utils/format'
import VweKomante from '../komante/vwe-komante'
import Dekoneksyon from '../sesyon/dekoneksyon'
import DrawerBar from './drawer-bar'
import DenyeTeks from './denye-teks'
import VweKouteAchte from './vwe-koute-achte'
import OkiMizik from './oki-mizik'
import Pataje from './pataje'
import EntegreMizik from './entegre-mizik'
const PREFIX = 'teks-drawer'
const classes = {
tooltip: `${PREFIX}-tooltip`,
root: `${PREFIX}-root`,
drawer: `${PREFIX}-drawer`,
appBar: `${PREFIX}-appBar`,
menuButton: `${PREFIX}-menuButton`,
toolbar: `${PREFIX}-toolbar`,
drawerPaper: `${PREFIX}-drawerPaper`,
content: `${PREFIX}-content`,
list: `${PREFIX}-list`,
form: `${PREFIX}-form`,
text: `${PREFIX}-text`,
gridText: `${PREFIX}-gridText`,
grid: `${PREFIX}-grid`,
koute: `${PREFIX}-koute`,
vwe: `${PREFIX}-vwe`,
pataje: `${PREFIX}-pataje`
}
const Root = styled('div')((
{
theme
}
) => ({
[`&.${classes.root}`]: {
display: 'flex'
},
[`& .${classes.drawer}`]: {
marginTop: '10em',
[theme.breakpoints.up('sm')]: {
width: drawerWidth,
flexShrink: 0
}
},
[`& .${classes.appBar}`]: {
borderTop: '2px solid #303030',
marginTop: '4.50rem',
[theme.breakpoints.up('sm')]: {
width: `calc(100% - ${drawerWidth}px)`,
marginLeft: drawerWidth
},
zIndex: 1
},
[`& .${classes.menuButton}`]: {
[theme.breakpoints.up('sm')]: {
display: 'none'
}
},
[`& .${classes.toolbar}`]: theme.mixins.toolbar,
[`& .${classes.drawerPaper}`]: {
borderTop: '2px solid #303030',
marginTop: '4.50rem',
width: drawerWidth
},
[`& .${classes.content}`]: {
flexGrow: 1,
padding: theme.spacing(3)
},
[`& .${classes.list}`]: {
marginBottom: '6em'
},
[`& .${classes.form}`]: {
marginLeft: theme.spacing(1)
},
[`& .${classes.text}`]: {
marginBottom: '0.5em'
},
[`& .${classes.gridText}`]: {
border: '2px solid grey',
borderRadius: '5px',
marginTop: '2em',
padding: '1em'
},
[`& .${classes.grid}`]: {
marginTop: '1em'
},
[`& .${classes.koute}`]: {
position: 'absolute',
right: '40px',
top: '8px',
[theme.breakpoints.up('sm')]: {
top: '10px'
}
},
[`& .${classes.vwe}`]: {
position: 'absolute',
right: '90px',
top: '8px',
[theme.breakpoints.up('sm')]: {
top: '10px'
}
},
[`& .${classes.pataje}`]: {
position: 'fixed',
top: '85px',
left: '110px',
zIndex: 2,
[theme.breakpoints.up('sm')]: {
top: '88px',
left: '340px'
}
}
}))
function Alert(props) {
return <MuiAlert elevation={6} variant='filled' {...props} />
}
const drawerWidth = 240
const langToArray = anTeks => {
const langArray = []
if (anTeks && anTeks.tradiksyon) {
const {francais, english, espagnol} = anTeks.tradiksyon
if (francais) {
langArray.push({title: 'Traduction', flag: 'fr', lang: francais})
}
if (english) {
langArray.push({title: 'Translation', flag: 'en', lang: english})
}
if (espagnol) {
langArray.push({title: 'Traducción', flag: 'es', lang: espagnol})
}
}
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 ExplicitTooltip = Tooltip
export default function TeksDrawer({teks, anTeks, komante}) {
const [session] = useSession()
const router = useRouter()
const isMobile = useMediaQuery('(max-width:800px)')
const langArray = langToArray(anTeks)
const theme = useTheme()
const [esMobilOuve, meteEsMobilOuve] = useState(false)
const [open, setOpen] = useState(false)
const [error, setError] = useState('')
const [success, setSuccess] = useState('')
const handleClose = (event, reason) => {
if (reason === 'clickaway') {
return
}
setOpen(false)
setSuccess('')
setError('')
}
const handleDrawerToggle = () => {
meteEsMobilOuve(!esMobilOuve)
}
const container = typeof window === 'undefined' ? undefined : () => window.document.body
useEffect(() => {
if (error || success) {
setOpen(true)
}
}, [error, success, setOpen])
return (
<Root className={classes.root}>
<CssBaseline />
<AppBar position='fixed' className={classes.appBar}>
<Toolbar>
<IconButton
color='inherit'
aria-label='open drawer'
edge='start'
className={classes.menuButton}
size='large'
onClick={handleDrawerToggle}
>
<MenuIcon />
</IconButton>
{anTeks ? (
<>
<Link passHref href='/teks'>
<IconButton aria-label='return' size='medium'>
<KeyboardBackspaceIcon style={{fontSize: '1.5em'}} />
</IconButton>
</Link>
{anTeks.lyen && anTeks.lyen.length > 0 && (
<div className={classes.vwe}>
<VweKouteAchte niVideyo anTeks={anTeks} />
</div>
)}
{anTeks.kouteyAchtey && anTeks.kouteyAchtey.length > 0 && (
<div className={classes.koute}>
<VweKouteAchte niOdyo anTeks={anTeks} />
</div>
)}
</>
) : (
<Typography noWrap variant='h6'>
Dènyé Tèks
</Typography>
)}
</Toolbar>
</AppBar>
<nav className={classes.drawer} aria-label='mailbox folders'>
<Hidden smUp implementation='css'>
<Drawer
container={container}
variant='temporary'
anchor={theme.direction === 'rtl' ? 'right' : 'left'}
open={esMobilOuve}
classes={{
paper: classes.drawerPaper
}}
ModalProps={{
keepMounted: true
}}
onClose={handleDrawerToggle}
>
<DrawerBar meteEsMobilOuve={meteEsMobilOuve} teks={teks} anTeks={anTeks} />
</Drawer>
</Hidden>
<Hidden smDown implementation='css'>
<Drawer
open
classes={{
paper: classes.drawerPaper
}}
variant='permanent'
>
<DrawerBar teks={teks} anTeks={anTeks} />
</Drawer>
</Hidden>
</nav>
<main className={classes.content}>
{anTeks ? (
<>
<div className={classes.pataje}>
<Pataje teks={anTeks} setError={setError} setSuccess={setSuccess} />
</div>
<Box sx={{textAlign: 'center', marginTop: 9}}>
<Typography style={{marginTop: '0.8em'}} variant='h4' display='block'>
<Typography gutterBottom variant='h6'>
{anTeks.awtis.map(a => a.alias).join(', ')}
</Typography>
<Typography variant='h5'>
{anTeks.tit}
{anTeks.eksplisit && (
<ExplicitTooltip
title='Explicit Lyrics'
placement='bottom'
TransitionComponent={Zoom}
classes={{
tooltip: classes.tooltip
}}
>
<ExplicitIcon style={{marginLeft: 10}} color='secondary' />
</ExplicitTooltip>
)}
</Typography>
{komante && (
<VweKomante komante={komante} teks={anTeks} />
)}
{session && (
<Dekoneksyon chimen={router.asPath} tooltipPlacement='bottom' />
)}
</Typography>
{anTeks.user && (
<Typography style={{marginBottom: '1.5em'}} display='block' variant='caption'>
<i>texte soumis par {anTeks.user.username}</i>
</Typography>
)}
</Box>
{(anTeks.okiMizikID || anTeks.kouteyAchtey.length > 0) && (
<Box sx={{textAlign: 'center'}}>
<EntegreMizik anTeks={anTeks} isMobile={isMobile} />
</Box>
)}
{anTeks.okiMizikID && (
<OkiMizik id={anTeks.okiMizikID} />
)}
<Grid container justifyContent='center' 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'>
{formatJsonString(anTeks.transkripsyon)}
</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>
)} {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>
)}
</>
) : (
<DenyeTeks {...teks} />
)}
</main>
</Root>
)
}
TeksDrawer.propTypes = {
teks: PropTypes.array.isRequired,
anTeks: PropTypes.object,
komante: PropTypes.array
}
TeksDrawer.defaultProps = {
anTeks: null,
komante: null
}