From ffe3421fa9bc9751f4acbc9aff90885d07e61e88 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20Famibelle-Pronzola?= Date: Sat, 22 Jul 2023 13:45:08 +0400 Subject: [PATCH] Split MizikList and add GroupedVirtuoso --- components/awtis/awtis-detay.js | 49 +++++----- components/awtis/mizik-lis.js | 157 ++++++++++++++++---------------- components/awtis/mizik-lyen.js | 56 ++++++++++++ 3 files changed, 161 insertions(+), 101 deletions(-) create mode 100644 components/awtis/mizik-lyen.js diff --git a/components/awtis/awtis-detay.js b/components/awtis/awtis-detay.js index e26e733..18e449a 100644 --- a/components/awtis/awtis-detay.js +++ b/components/awtis/awtis-detay.js @@ -21,19 +21,19 @@ import {green} from '@mui/material/colors' import ExpandMoreIcon from '@mui/icons-material/ExpandMore' import KeyboardBackspaceIcon from '@mui/icons-material/KeyboardBackspace' +import {formatKuveti} from '../../lib/kuveti' import AwtisBiyografi from './awtis-biyografi' -import MizikLis from './mizik-lis' +import MizikLyen from './mizik-lyen' const IMAGE_URL = process.env.NEXT_PUBLIC_API_URL_ROOT || 'http://localhost:1337' const noImageUrl = 'https://place-hold.it/140x140?text=Indisponible' -const sortTeks = paroles => paroles.sort((a, b) => b.id - a.id) +const sortTeks = paroles => paroles.sort((a, b) => a.attributes.titre.localeCompare(b.attributes.titre, 'fr', {sensitivity: 'base'})) export default function AwtisDetay({anAwtis}) { - const router = useRouter() const [esByografiOuve, meteEsByografiOuve] = useState(false) const {alias, biographie, paroles, photo} = anAwtis - const sortedTeks = sortTeks(paroles.data) + const sortedTeks = sortTeks(paroles?.data) const gwanBiyo = biographie && biographie.length > 100 const biyo = gwanBiyo ? `${biographie.slice(0, 100)}...` : biographie @@ -42,12 +42,6 @@ export default function AwtisDetay({anAwtis}) { meteEsByografiOuve(true) } - const handleBack = () => { - const href = '/awtis?paj&paj=1' - const as = '/awtis/paj/1' - router.push(href, as) - } - return ( @@ -64,7 +58,7 @@ export default function AwtisDetay({anAwtis}) { {biyo && ( - + @@ -79,7 +73,7 @@ export default function AwtisDetay({anAwtis}) { )} - + {paroles.data.length > 1 ? ( @@ -91,29 +85,40 @@ export default function AwtisDetay({anAwtis}) { Liste des paroles - - + + {sortedTeks.map(anPawol => { + const {couverture} = anPawol.attributes + const kuvetiFormat = formatKuveti(couverture) + + return ( + + + + ) + })} ) : ( paroles.data.length === 0 ? ( Aucune parole pour le moment ) : ( - <> + Parole - - + + - + ) )} - - + + + + {esByografiOuve && ( a.attributes.titre.localeCompare(b.attributes.titre, 'fr', {sensitivity: 'base'})) + const grupPawol = groupBy(pawol, anPawol => anPawol.attributes.titre[0].toUpperCase()) + const grupCounts = Object.values(grupPawol).map(anPawol => anPawol.length) + const grup = Object.keys(grupPawol) + grup.sort((a, b) => a[0].localeCompare(b[0], 'fr', {sensitivity: 'base'})) -const PREFIX = 'mizik-lis' - -const classes = { - root: `${PREFIX}-root` + return {pawol: pawolTrie, grupCounts, grup} } -const StyledList = styled(List)(( - { - theme - } -) => ({ - [`&.${classes.root}`]: { - width: '100%', - maxWidth: 360, - backgroundColor: theme.palette.background.paper - } -})) - -export default function MizikLis({meteEsMobilOuve, niAwtis, paroles, slugTeksChwazi, meteSlugTeksChwazi}) { - const router = useRouter() - - const handleClick = slug => { - if (meteSlugTeksChwazi) { - meteSlugTeksChwazi(slug) - } - - if (slug !== slugTeksChwazi) { - if (niAwtis) { - router.push(`/paroles/${slug}`).then(() => window.scrollTo(0, 0)) - } else { - router.push(`/paroles/${slug}#${slug}`).then(() => window.scrollTo(0, 0)) - } - } - - if (meteEsMobilOuve) { - meteEsMobilOuve(false) - } - } +export default function MizikLis({niAwtis, paroles}) { + const params = useParams() + const {pawol, grupCounts, grup} = grupPawol(paroles) return ( - - {paroles.map(({id, attributes}) => ( - handleClick(attributes.slug)} - > - {attributes.titre}} secondary={niAwtis ? getAlias(attributes.artistes, attributes.prioriteArtistes) : null} /> - {attributes.gadeEmbed && !attributes.okiMizikID && ( - - )} - {attributes.explicitLyrics && ( - - )} - {attributes.okiMizikID && ( - - )} - {esBrandNew(attributes.publishedAt) && ( - - )} - - ))} - +
{grup[index]}
} + itemContent={index => { + const anPawol = pawol[index] + const {couverture} = anPawol.attributes + const kuvetiFormat = formatKuveti(couverture) + + return ( + + ) + }} + /> + ) +} + +const MUIComponents = { + List: React.forwardRef(({style, children}, listRef) => ( + + {children} + + )), + + Item: ({children, ...props}) => ( + + {children} + + ), + + Group: ({children, style, ...props}) => ( + + {children} + ) } MizikLis.propTypes = { - meteEsMobilOuve: PropTypes.func, niAwtis: PropTypes.bool, - paroles: PropTypes.array.isRequired, - slugTeksChwazi: PropTypes.string, - meteSlugTeksChwazi: PropTypes.func + paroles: PropTypes.array.isRequired } -MizikLis.defaultProps = { - meteEsMobilOuve: null, - niAwtis: false, - slugTeksChwazi: null, - meteSlugTeksChwazi: null +MUIComponents.List.propTypes = { + style: PropTypes.object, + children: PropTypes.node.isRequired, +} + +MUIComponents.Item.propTypes = { + children: PropTypes.node.isRequired, +} + +MUIComponents.Group.propTypes = { + children: PropTypes.node.isRequired, + style: PropTypes.object, } diff --git a/components/awtis/mizik-lyen.js b/components/awtis/mizik-lyen.js new file mode 100644 index 0000000..8a7396c --- /dev/null +++ b/components/awtis/mizik-lyen.js @@ -0,0 +1,56 @@ +import PropTypes from 'prop-types' +import Link from 'next/link' +import ListItemButton from '@mui/material/ListItemButton' +import ListItemText from '@mui/material/ListItemText' +import Typography from '@mui/material/Typography' +import ListItemAvatar from '@mui/material/ListItemAvatar' +import Avatar from '@mui/material/Avatar' +import FiberNewOutlinedIcon from '@mui/icons-material/FiberNewOutlined' +import LibraryMusicIcon from '@mui/icons-material/LibraryMusic' +import ExplicitIcon from '@mui/icons-material/Explicit' + +import {esBrandNew} from '../../lib/date' +import {getAlias} from '../../lib/utils/format' + +const apiUrl = process.env.NEXT_PUBLIC_API_URL_ROOT || 'http://localhost:1337' + +export default function MizikLyen({niAwtis, anPawol, kuveti, slug}) { + return ( + + + + + + {anPawol.attributes.titre}} + secondary={niAwtis ? getAlias(anPawol.attributes.artistes, anPawol.attributes.prioriteArtistes) : null} /> + + {esBrandNew(anPawol.attributes.publishedAt) && ( + + )} + + {anPawol.attributes.explicitLyrics && ( + + )} + {anPawol.attributes.okiMizikID && ( + + )} + + + ) +} + +MizikLyen.propTypes = { + niAwtis: PropTypes.bool, + anPawol: PropTypes.object, + kuveti: PropTypes.object, + slug: PropTypes.string +}