Files
pawol.nu/components/teks/denye-teks.js
T
2022-05-14 01:27:11 +04:00

179 lines
11 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 {useState, useEffect, forwardRef} from 'react'
import {useRouter} from 'next/router'
import PropTypes from 'prop-types'
import Container from '@mui/material/Container'
import Grid from '@mui/material/Grid'
import Skeleton from '@mui/material/Skeleton'
import Card from '@mui/material/Card'
import CardActionArea from '@mui/material/CardActionArea'
import CardContent from '@mui/material/CardContent'
import Typography from '@mui/material/Typography'
import MuiAlert from '@mui/material/Alert'
import Snackbar from '@mui/material/Snackbar'
import ExplicitIcon from '@mui/icons-material/Explicit'
import {styled} from '@mui/material/styles'
import {format} from 'date-fns'
import {fr} from 'date-fns/locale'
import Image from 'next/image'
import {useMediaQuery} from '@mui/material'
import {jwennDenyeTeks} from '../../lib/oki-api'
const PREFIX = 'denye-teks'
const TEKS_PREFIX = 'teks-kat'
const KAT_ARRAY = Array.from({length: 6})
const classes = {
container: `${PREFIX}-container`
}
const teksClasses = {
root: `${TEKS_PREFIX}-root`,
media: `${TEKS_PREFIX}-media`
}
const Root = styled('div')(() => ({
[`&.${classes.container}`]: {
marginTop: '1em',
marginBottom: '2em'
}
}))
const StyledGrid = styled(Grid)({
[`& .${teksClasses.root}`]: {
maxWidth: 345
},
[`& .${teksClasses.media}`]: {
height: 240,
objectFit: 'contain'
}
})
const Alert = forwardRef(function Alert(props, ref) {
return <MuiAlert ref={ref} elevation={6} variant='filled' {...props} />
})
export default function DenyeTeks({error, setError}) {
const router = useRouter()
const [teks, setTeks] = useState([])
const [isLoading, setIsLoading] = useState(true)
const isMobile = useMediaQuery('(max-width:527px)')
const [isOpen, setIsOpen] = useState(false)
const handleClick = slug => {
router.push(`/paroles/${slug}#${slug}`).then(() => window.scrollTo(0, 0))
}
const noImageUrl = 'https://place-hold.it/140x140?text=Image%20indisponible'
const formatDate = date => format(new Date(date), 'P', {locale: fr})
useEffect(() => {
const getTeks = async () => {
try {
const denyeTeks = await jwennDenyeTeks()
setTeks(denyeTeks)
} catch (error_) {
setIsOpen(true)
setError(error_)
setIsLoading(false)
}
}
getTeks()
setIsLoading(false)
}, [setError])
const handleClose = (event, reason) => {
if (reason === 'clickaway') {
return
}
setIsOpen(false)
}
return (
<Root className={classes.container}>
<Container>
<Grid container spacing={3}>
{error && (
<Snackbar open={isOpen} autoHideDuration={3000} onClose={handleClose}>
<Alert severity='error' onClose={handleClose}>
<strong>Les éléments ne peuvent pas safficher</strong> : <i>{error.message}</i>
</Alert>
</Snackbar>
)}
{!error && KAT_ARRAY.map((kat, index) => (
<StyledGrid key={index} item xs={12} sm={6} md={4}> {/* eslint-disable-line react/no-array-index-key */}
<Card className={classes.root}>
{isLoading || teks.length === 0 ? (
<CardContent>
<Skeleton variant='rectangular' width='100%' height={isMobile ? 250 : 352} />
<Skeleton />
<Skeleton width='30%' />
<Skeleton width='10%' />
<Skeleton width='30%' />
</CardContent>
) : (
<CardActionArea onClick={() => handleClick(teks[index].slug)}>
<Image
src={teks[index].kouveti ? `${process.env.NEXT_PUBLIC_API_URL}${teks[index].kouveti.url}` : noImageUrl}
alt={teks[index].tit}
width={500}
height={500}
placeholder='blur'
blurDataURL='data:image/png;base64,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'
/>
<CardContent>
<Typography display='inline' style={{marginRight: 5}} variant='h6' component='h2'>
{teks[index].tit}
</Typography>
{teks[index].eksplisit && (
<ExplicitIcon style={{marginRight: 5}} color='secondary' fontSize='small' />
)}
<Typography variant='caption'>
{teks[index].user && (
<>
(<i>texte soumis par {teks[index].user.username}</i>)
</>
)}
{teks[index].userAdmin && !teks[index].user && (
<>
(<i>texte soumis par {teks[index].userAdmin}</i>)
</>
)}
</Typography>
<Typography variant='body2' color='textSecondary' component='p'>
{new Intl.ListFormat('fr').format(teks[index].awtis.map(({alias}) => alias))}
</Typography>
<Typography variant='body2' color='textSecondary' component='p'>
{teks[index].lanne}
</Typography>
<Typography align='center' style={{marginTop: '0.5em'}} variant='body1' color='textSecondary' component='p'>
Publié le : {formatDate(teks[index].published_at)}
</Typography>
</CardContent>
</CardActionArea>
)}
</Card>
</StyledGrid>
))}
</Grid>
</Container>
</Root>
)
}
DenyeTeks.defaultProps = {
error: null
}
DenyeTeks.propTypes = {
error: PropTypes.object,
setError: PropTypes.func.isRequired
}