X-Git-Url: https://git.localhorst.tv/?a=blobdiff_plain;f=resources%2Fjs%2Fcomponents%2Fcommon%2FPngPlayer.js;h=ef70271b5b39d9bafaa55abe32a339277ce60ba9;hb=e001c4e421fad5822503901ba76dcd6abbba4fa2;hp=4bdb41adc5653aab9588820d19b0542a7f977911;hpb=c01ebf99d629029288a2ea7cf6874ca076d87f70;p=alttp.git diff --git a/resources/js/components/common/PngPlayer.js b/resources/js/components/common/PngPlayer.js index 4bdb41a..ef70271 100644 --- a/resources/js/components/common/PngPlayer.js +++ b/resources/js/components/common/PngPlayer.js @@ -20,10 +20,12 @@ const PngPlayer = ({ src }) => { const [apng, setApng] = React.useState(null); const [error, setError] = React.useState(null); + const [frameInfo, setFrameInfo] = React.useState(''); const [loading, setLoading] = React.useState(true); const [player, setPlayer] = React.useState(null); React.useEffect(() => { + if (!src) return; setError(null); setLoading(true); const ctrl = new AbortController(); @@ -52,21 +54,31 @@ const PngPlayer = ({ src }) => { React.useEffect(async () => { if (loading || !canvas.current) return; - setPlayer(await createPlayer(apng, canvas.current)); + setFrameInfo(`1/${apng.frames.length}`); + const p = await createPlayer(apng, canvas.current); + setPlayer(p); + const updateFrame = (number) => { + setFrameInfo(`${number + 1}/${apng.frames.length}`); + }; + p.on('frame', updateFrame); + return () => { + p.off('frame', updateFrame); + }; }, [apng, canvas.current, loading]); - const play = React.useCallback(() => { - if (player) player.play(); - }, [player]); - - const pause = React.useCallback(() => { - if (player) player.pause(); - }, [player]); - const stop = React.useCallback(() => { if (player) player.stop(); }, [player]); + const toggle = React.useCallback(() => { + if (!player) return; + if (player.paused) { + player.play(); + } else { + player.pause(); + } + }, [player]); + const nextFrame = React.useCallback(() => { if (player) player.renderNextFrame(); }, [player]); @@ -82,6 +94,7 @@ const PngPlayer = ({ src }) => {
+ {frameInfo}
-