UNPKG

one

Version:

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

92 lines (89 loc) • 2.58 kB
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