'use client' import {useEffect, useState} from 'react' import PropTypes from 'prop-types' import Box from '@mui/material/Box' import Select from '@mui/material/Select' import MenuItem from '@mui/material/MenuItem' import ListSubheader from '@mui/material/ListSubheader' import Divider from '@mui/material/Divider' import FormControl from '@mui/material/FormControl' 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 TranslateIcon from '@mui/icons-material/Translate' import StarIcon from '@mui/icons-material/Star' import ArticleIcon from '@mui/icons-material/Article' import Image from 'next/image' import {formatJsonString} from '../../lib/utils/format' import {getAlias} from '../../lib/utils/get-alias' import {formatKuveti} from '../../lib/kuveti' import LicenseModal from '../cc/license-modal' import FilesDialog from '../files/files-dialog' import KitsDialog from '../files/kits-dialog' import {StreamButton} from '../streaming-buttons' import EntegreMizik from './entegre-mizik' import OkiMizik from './oki-mizik' import DiferansDialog from './diferans-dialog' import Komante from './komante' import ReponsMastodon from './repons-mastodon' import {useCurrentTrack} from './current-track-context' 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 CONTINENTS = ['Afrique', 'Asie', 'Europe'] const TRAD_FIELDS = [ // Afrique — langues vedettes en premier {field: 'ayisyen', title: 'Ayisyen 🇭🇹', continent: 'Afrique', vedette: true}, {field: 'yoruba', title: 'Yorùbá', continent: 'Afrique', vedette: true}, {field: 'lingala', title: 'Lingála', continent: 'Afrique', vedette: true}, {field: 'wolof', title: 'Wolof', continent: 'Afrique', vedette: true}, {field: 'swahili', title: 'Kiswahili', continent: 'Afrique', vedette: true}, {field: 'hausa', title: 'Hausa', continent: 'Afrique', vedette: true}, {field: 'arabe', title: 'العربية', continent: 'Afrique'}, {field: 'oromo', title: 'Oromoo', continent: 'Afrique'}, {field: 'igbo', title: 'Igbo', continent: 'Afrique'}, {field: 'zoulou', title: 'isiZulu', continent: 'Afrique'}, {field: 'malgache', title: 'Malagasy', continent: 'Afrique'}, {field: 'xhosa', title: 'isiXhosa', continent: 'Afrique'}, {field: 'tswana', title: 'Setswana', continent: 'Afrique'}, {field: 'tsonga', title: 'Xitsonga', continent: 'Afrique'}, {field: 'sesotho', title: 'Sesotho', continent: 'Afrique'}, // Asie {field: 'japonais', title: '日本語', continent: 'Asie'}, {field: 'coreen', title: '한국어', continent: 'Asie'}, // Europe {field: 'anglais', title: 'English', continent: 'Europe'}, {field: 'francais', title: 'Français', continent: 'Europe'}, {field: 'espagnol', title: 'Español', continent: 'Europe'}, {field: 'allemand', title: 'Deutsch', continent: 'Europe'}, {field: 'italien', title: 'Italiano', continent: 'Europe'}, {field: 'portugais', title: 'Português', continent: 'Europe'}, ] const langToArray = parole => { if (!parole || !parole.traductions) { return [] } return TRAD_FIELDS .filter(({field}) => parole.traductions[field]) .map(({field, title, continent, vedette}) => ({field, title, continent, vedette, 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) const [, setCurrentTrack] = useCurrentTrack() useEffect(() => { const isBrowser = () => typeof window !== 'undefined' if (!isBrowser()) { return } window.scrollTo({top: 0, behavior: 'smooth'}) }, []) useEffect(() => { setCurrentTrack(parole) return () => setCurrentTrack(null) }, [parole, setCurrentTrack]) 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.kits?.length > 0)) && ( {parole?.files && ( )} {parole.creativeCommons && parole.kits?.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 => ( ))} )} {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, }