import { useRef, useEffect, useCallback, useState } from 'react';
import {
useScore, usePlayback, usePianoSampler, ScoreRenderer,
} from '@muse-player/core';
import { PlaybackControls } from '@muse-player/component';
import '@muse-player/component/style.css';
function App() {
const containerRef = useRef<HTMLDivElement>(null);
const [activeNoteIds, setActiveNoteIds] = useState<string[]>([]);
const {
loadResult, svg, midiBase64, timeMap,
getElementsAtTime, getElementAttr, renderPage,
} = useScore();
const handleTimeUpdate = useCallback((time: number) => {
const result = getElementsAtTime(time * 1000);
if (result.page > 0) renderPage(result.page);
}, [getElementsAtTime, renderPage]);
const handleNotesUpdate = useCallback((noteIds: string[]) => {
setActiveNoteIds(noteIds);
}, []);
const { sampler, ready } = usePianoSampler();
const {
play, pause, stop, seek, playing,
currentTime, totalDuration, currentMeasure, tempo, updateTempo,
} = usePlayback(midiBase64, timeMap, handleTimeUpdate, handleNotesUpdate,
ready ? { sampler } : null);
useEffect(() => {
loadResult('/score/manifest.json');
}, [loadResult]);
return (
<>
<ScoreRenderer containerRef={containerRef} svg={svg} />
<PlaybackControls
playing={playing} currentTime={currentTime} totalDuration={totalDuration}
currentMeasure={currentMeasure} tempo={tempo}
onPlay={play} onPause={pause} onStop={stop}
onSeek={seek} onTempoChange={updateTempo}
/>
</>
);
}