UNPKG

one

Version:

One is a React framework for web, iOS, and Android apps.

68 lines (65 loc) • 1.8 kB
import { useEffect, useId, useRef, useState } from "react"; import { createPlayer } from "./player.mjs"; const unclaimedPlayers = /* @__PURE__ */ new Map(); function trackPlayer(instanceId, player) { const pending = unclaimedPlayers.get(instanceId); if (pending) { pending.push(player); } else { unclaimedPlayers.set(instanceId, [player]); } } function releaseDiscardedPlayers(instanceId, retained) { const pending = unclaimedPlayers.get(instanceId); unclaimedPlayers.delete(instanceId); if (!pending) return; for (const player of pending) { if (player !== retained) player.remove(); } } function useAudioPlayer(source = null, options = {}) { const instanceId = useId(); const [player, setPlayer] = useState(() => { const created = createPlayer(source, options); trackPlayer(instanceId, created); return created; }); const key = JSON.stringify(source ?? null); const first = useRef(true); useEffect(() => { if (first.current) { first.current = false; return; } try { player.replace(source); } catch (error) { if (error instanceof Error && error.message.includes("was removed")) { setPlayer(createPlayer(source, options)); } else { throw error; } } }, [key]); useEffect(() => { releaseDiscardedPlayers(instanceId, player); return () => player.remove(); }, [player]); return player; } function useAudioPlayerStatus(player) { const [status, setStatus] = useState(() => player.getStatus()); useEffect(() => { let subscription; try { setStatus(player.getStatus()); subscription = player.addListener("playbackStatusUpdate", setStatus); } catch { return; } return () => subscription.remove(); }, [player]); return status; } export { useAudioPlayer, useAudioPlayerStatus }; //# sourceMappingURL=hooks.mjs.map