'use client' import {useEffect, useState} from 'react' import PropTypes from 'prop-types' import Box from '@mui/material/Box' import Tabs from '@mui/material/Tabs' import Tab from '@mui/material/Tab' import Typography from '@mui/material/Typography' import Tooltip from '@mui/material/Tooltip' import {useMediaQuery} from '@mui/material' import Link from 'next/link' import slugify from 'slugify' import {styled} from '@mui/material/styles' import ExplicitIcon from '@mui/icons-material/Explicit' import ArrowBackIosNewIcon from '@mui/icons-material/ArrowBackIosNew' import ArrowForwardIosIcon from '@mui/icons-material/ArrowForwardIos' import Image from 'next/image' import {formatJsonString, getAlias} from '../../lib/utils/format' import {formatKuveti} from '../../lib/kuveti' import LicenseModal from '../cc/license-modal' import FilesDialog from '../files/files-dialog' import StemsDialog from '../files/stems-dialog' import {StreamButton} from '../streaming-buttons' import EntegreMizik from './entegre-mizik' import OkiMizik from './oki-mizik' import DiferansDialog from './diferans-dialog' const IMAGE_URL = process.env.NEXT_PUBLIC_API_URL_ROOT || 'http://localhost:1337' const PREFIX = 'teks' const classes = { container: `${PREFIX}-container`, tooltip: `${PREFIX}-tooltip`, text: `${PREFIX}-text`, gridText: `${PREFIX}-gridText`, grid: `${PREFIX}-grid`, koute: `${PREFIX}-koute`, vwe: `${PREFIX}-vwe`, pataje: `${PREFIX}-pataje`, separation: `${PREFIX}-separation` } const Root = styled('div')(( { theme } ) => ({ [`&.${classes.container}`]: { marginTop: '3em', }, [`& .${classes.gridText}`]: { border: '2px solid grey', borderRadius: '5px', marginTop: '2em', padding: '1em' }, [`& .${classes.pataje}`]: { position: 'absolute', zIndex: 9999 }, [`& .${classes.separation}`]: { color: 'black', ...theme.applyStyles('dark', { color: 'white' }) }, '@media (max-width: 600px)': { marginLeft: '0', }, '@media (min-width: 600px)': { marginLeft: '240px', }, })) const LANG_NAMES = { fr: 'Français', en: 'English', es: 'Español', de: 'Deutsch', it: 'Italiano', pt: 'Português', ja: '日本語', ko: '한국어', } const TRAD_FIELDS = [ {field: 'anglais', title: 'English'}, {field: 'francais', title: 'Français'}, {field: 'espagnol', title: 'Español'}, {field: 'allemand', title: 'Deutsch'}, {field: 'italien', title: 'Italiano'}, {field: 'portugais', title: 'Português'}, {field: 'japonais', title: '日本語'}, {field: 'coreen', title: '한국어'}, ] const langToArray = parole => { if (!parole || !parole.traductions) { return [] } return TRAD_FIELDS .filter(({field}) => parole.traductions[field]) .map(({field, title}) => ({title, lang: parole.traductions[field]})) } const ExplicitTooltip = Tooltip export default function Teks({parole}) { const isMobile = useMediaQuery('(max-width:600px)') const langArray = langToArray(parole) const enhancedAliases = getAlias(parole.artistes, parole.prioriteArtistes, true) const coverFmt = formatKuveti(parole.couverture) const [tab, setTab] = useState(0) useEffect(() => { const isBrowser = () => typeof window !== 'undefined' if (!isBrowser()) { return } window.scrollTo({top: 0, behavior: 'smooth'}) }, []) return ( {enhancedAliases.map(({type, value}) => { if (type === 'element') { return ( {value} ) } return {value} })} {parole.titre} ({parole?.annee}) {parole.explicitLyrics && ( )} {coverFmt?.url && ( {parole.titre} )} {parole?.user && ( parole soumise par {parole.user.username} )} {parole?.userAdmin&& !parole.user && ( parole soumise par {parole.userAdmin.firstname} )} {parole.creativeCommons && ( )} {(parole?.files || (parole.creativeCommons && parole.stems?.length > 0)) && ( {parole?.files && ( )} {parole.creativeCommons && parole.stems?.length > 0 && ( )} )} {(parole.okiMizikID || parole.streamAudio.length > 0 || parole.gadeEmbed) && ( )} {parole.okiMizikID && ( )} {parole?.difference?.length > 0 && ( )} {parole.streamAudio?.length > 0 && ( Écouter sur {parole.streamAudio.map((lyen, i) => ( ))} )} setTab(value)} variant='scrollable' scrollButtons allowScrollButtonsMobile centered={langArray.length === 0} slots={{ StartScrollButtonIcon: ArrowBackIosNewIcon, EndScrollButtonIcon: ArrowForwardIosIcon }} sx={{ borderBottom: 1, borderColor: 'divider', mb: 2, '& .MuiTabs-scrollButtons': { width: 36, height: 36, borderRadius: '50%', color: 'primary.main', backgroundColor: 'action.hover', mx: 0.5, '&.Mui-disabled': { opacity: 0 } } }} > {langArray.map(({title}) => ( ))} {tab === 0 && ( <> {parole.langueSource && parole.langueSource !== 'ka' && ( ({LANG_NAMES[parole.langueSource]}) )} {formatJsonString(parole.transcription)} )} {langArray.map(({title, lang}, index) => ( tab === index + 1 && ( {formatJsonString(lang)} ) ))} ) } Teks.propTypes = { parole: PropTypes.object.isRequired, }