one
Version:
One is a React framework for web, iOS, and Android apps.
92 lines (89 loc) • 2.58 kB
JavaScript
import { useEffect, useId, useRef, useState } from "react";
import { createPlayer } from "./player.native.js";
var unclaimedPlayers = /* @__PURE__ */ new Map();
function trackPlayer(instanceId, player) {
var pending = unclaimedPlayers.get(instanceId);
if (pending) {
pending.push(player);
} else {
unclaimedPlayers.set(instanceId, [player]);
}
}
function releaseDiscardedPlayers(instanceId, retained) {
var pending = unclaimedPlayers.get(instanceId);
unclaimedPlayers.delete(instanceId);
if (!pending) return;
var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = void 0;
try {
for (var _iterator = pending[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
var player = _step.value;
if (player !== retained) player.remove();
}
} catch (err) {
_didIteratorError = true;
_iteratorError = err;
} finally {
try {
if (!_iteratorNormalCompletion && _iterator.return != null) {
_iterator.return();
}
} finally {
if (_didIteratorError) {
throw _iteratorError;
}
}
}
}
function useAudioPlayer() {
var source = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : null, options = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {};
var instanceId = useId();
var [player, setPlayer] = useState(function() {
var created = createPlayer(source, options);
trackPlayer(instanceId, created);
return created;
});
var key = JSON.stringify(source !== null && source !== void 0 ? source : null);
var first = useRef(true);
useEffect(function() {
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(function() {
releaseDiscardedPlayers(instanceId, player);
return function() {
return player.remove();
};
}, [player]);
return player;
}
function useAudioPlayerStatus(player) {
var [status, setStatus] = useState(function() {
return player.getStatus();
});
useEffect(function() {
var subscription;
try {
setStatus(player.getStatus());
subscription = player.addListener("playbackStatusUpdate", setStatus);
} catch (unused) {
return;
}
return function() {
return subscription.remove();
};
}, [player]);
return status;
}
export { useAudioPlayer, useAudioPlayerStatus };
//# sourceMappingURL=hooks.native.js.map