Spaces:
Sleeping
Sleeping
| import { useCallback, useEffect, useState } from 'react'; | |
| import volumeImg from '../../../assets/volume.svg'; | |
| import { sound } from '@pixi/sound'; | |
| import Button from './Button'; | |
| import { useQuery } from 'convex/react'; | |
| import { api } from '../../../convex/_generated/api'; | |
| export default function MusicButton() { | |
| const musicUrl = useQuery(api.music.getBackgroundMusic); | |
| const [isPlaying, setPlaying] = useState(false); | |
| useEffect(() => { | |
| if (musicUrl) { | |
| sound.add('background', musicUrl).loop = true; | |
| } | |
| }, [musicUrl]); | |
| const flipSwitch = async () => { | |
| if (isPlaying) { | |
| sound.stop('background'); | |
| } else { | |
| await sound.play('background'); | |
| } | |
| setPlaying(!isPlaying); | |
| }; | |
| const handleKeyPress = useCallback( | |
| (event: { key: string }) => { | |
| if (event.key === 'm' || event.key === 'M') { | |
| void flipSwitch(); | |
| } | |
| }, | |
| [flipSwitch], | |
| ); | |
| useEffect(() => { | |
| window.addEventListener('keydown', handleKeyPress); | |
| return () => window.removeEventListener('keydown', handleKeyPress); | |
| }, [handleKeyPress]); | |
| return ( | |
| <> | |
| <Button | |
| onClick={() => void flipSwitch()} | |
| className="hidden lg:block" | |
| title="Play AI generated music (press m to play/mute)" | |
| imgUrl={volumeImg} | |
| > | |
| {isPlaying ? 'Mute' : 'Music'} | |
| </Button> | |
| </> | |
| ); | |
| } | |