one
Version:
One is a React framework for web, iOS, and Android apps.
90 lines (89 loc) • 2.81 kB
JavaScript
var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __export = (target, all) => {
for (var name in all) __defProp(target, name, {
get: all[name],
enumerable: true
});
};
var __copyProps = (to, from, except, desc) => {
if (from && typeof from === "object" || typeof from === "function") {
for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, {
get: () => from[key],
enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
});
}
return to;
};
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
var hooks_exports = {};
__export(hooks_exports, {
useAudioPlayer: () => useAudioPlayer,
useAudioPlayerStatus: () => useAudioPlayerStatus
});
module.exports = __toCommonJS(hooks_exports);
var import_react = require("react");
var import_player = require("./player.cjs");
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 = (0, import_react.useId)();
const [player, setPlayer] = (0, import_react.useState)(() => {
const created = (0, import_player.createPlayer)(source, options);
trackPlayer(instanceId, created);
return created;
});
const key = JSON.stringify(source ?? null);
const first = (0, import_react.useRef)(true);
(0, import_react.useEffect)(() => {
if (first.current) {
first.current = false;
return;
}
try {
player.replace(source);
} catch (error) {
if (error instanceof Error && error.message.includes("was removed")) {
setPlayer((0, import_player.createPlayer)(source, options));
} else {
throw error;
}
}
}, [key]);
(0, import_react.useEffect)(() => {
releaseDiscardedPlayers(instanceId, player);
return () => player.remove();
}, [player]);
return player;
}
function useAudioPlayerStatus(player) {
const [status, setStatus] = (0, import_react.useState)(() => player.getStatus());
(0, import_react.useEffect)(() => {
let subscription;
try {
setStatus(player.getStatus());
subscription = player.addListener("playbackStatusUpdate", setStatus);
} catch {
return;
}
return () => subscription.remove();
}, [player]);
return status;
}