one
Version:
One is a React framework for web, iOS, and Android apps.
68 lines (65 loc) • 1.8 kB
JavaScript
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