'use client' import { useEffect, useRef, useState } from 'react' import { useBack } from '@/hooks/useBack' import ResourceViewer from '@/components/ui/ResourceViewer' import { useVisitor } from '@/context/VisitorContext' import { t, tPlain } from '@/lib/i18n' import type { SectionDTO } from '@/lib/api/types' import AppBar from '@/components/ui/AppBar' import { trackEvent } from '@/lib/stats' interface Props { section: SectionDTO slug: string configId: string languages: string[] } export default function ArticleSection({ section, configId, languages }: Props) { const { language, setAvailableLanguages, instanceId } = useVisitor() const back = useBack() const article = section.article const [isPlaying, setIsPlaying] = useState(false) const [currentTime, setCurrentTime] = useState(0) const [duration, setDuration] = useState(0) const audioRef = useRef(null) const scrollRef = useRef(null) const articleReadTrackedRef = useRef(false) useEffect(() => { setAvailableLanguages([]) }, [languages]) useEffect(() => { const el = scrollRef.current if (!el || !instanceId) return const onScroll = () => { if (articleReadTrackedRef.current) return const total = el.scrollHeight - el.clientHeight if (total <= 0) return const ratio = el.scrollTop / total if (ratio >= 0.8) { articleReadTrackedRef.current = true trackEvent({ instanceId, configurationId: configId, sectionId: section.id, eventType: 'ArticleRead', language, }) } } el.addEventListener('scroll', onScroll, { passive: true }) return () => el.removeEventListener('scroll', onScroll) }, [instanceId, configId, section.id, language]) const audioUrl = article?.audioIds?.find((a) => a.language === language)?.value ?? article?.audioIds?.[0]?.value useEffect(() => { if (article?.isReadAudioAuto && audioRef.current) { audioRef.current.play().catch(() => {}) setIsPlaying(true) } }, [article?.isReadAudioAuto]) function toggleAudio() { if (!audioRef.current) return if (isPlaying) { audioRef.current.pause(); setIsPlaying(false) } else { audioRef.current.play(); setIsPlaying(true) } } const contents = [...(article?.contents ?? [])].sort((a, b) => (a.order ?? 0) - (b.order ?? 0)) const htmlContent = t(article?.content, language) return (
{/* Carousel images */} {contents.length > 0 && ( )} {/* HTML content */} {htmlContent && (
)}
{/* Floating audio player */} {audioUrl && ( <>