import { AddLinkEventTracker, ILinkEventTracker, RemoveLinkEventTracker } from '@nitrots/nitro-renderer'; import { FC, useEffect, useState } from 'react'; import { LocalizeText } from '../../api'; import { Column, Flex, Text } from '../../common'; import { useSoundboard } from '../../hooks'; import { NitroCard } from '../../layout'; export const SoundboardView: FC<{}> = () => { const [ isVisible, setIsVisible ] = useState(false); const { enabled, sounds, lastPlayed, play } = useSoundboard(); const PAGE_SIZE = 9; const [ page, setPage ] = useState(0); const totalPages = Math.max(1, Math.ceil(sounds.length / PAGE_SIZE)); // Clamp the page if the sound list shrinks (or on first load). useEffect(() => { if(page > (totalPages - 1)) setPage(0); }, [ totalPages, page ]); const pageSounds = sounds.slice(page * PAGE_SIZE, (page * PAGE_SIZE) + PAGE_SIZE); useEffect(() => { const linkTracker: ILinkEventTracker = { linkReceived: (url: string) => { const parts = url.split('/'); if(parts.length < 2) return; switch(parts[1]) { case 'show': setIsVisible(true); return; case 'hide': setIsVisible(false); return; case 'toggle': setIsVisible(prev => !prev); return; } }, eventUrlPrefix: 'soundboard/', }; AddLinkEventTracker(linkTracker); return () => RemoveLinkEventTracker(linkTracker); }, []); // The soundboard belongs to the room — close it when the room turns it off. useEffect(() => { if(!enabled) setIsVisible(false); }, [ enabled ]); if(!isVisible || !enabled) return null; return ( setIsVisible(false) } /> { !sounds.length && { LocalizeText('soundboard.empty') } } { !!sounds.length && <>
{ pageSounds.map(sound => ( )) }
{ totalPages > 1 && { page + 1 } / { totalPages } } } { lastPlayed && { LocalizeText('soundboard.lastplayed', [ 'user' ], [ lastPlayed.username ]) } }
); };