@massds/mayflower-react
Version:
React versions of Mayflower design system UI components
69 lines (63 loc) • 2.6 kB
JavaScript
;
exports.__esModule = true;
exports["default"] = void 0;
var _react = _interopRequireDefault(require("react"));
function _interopRequireDefault(e) { return e && e.__esModule ? e : { "default": e }; }
var useScript = function useScript(src) {
// Keep track of script status ("idle", "loading", "ready", "error")
var _React$useState = _react["default"].useState(src ? 'loading' : 'idle'),
status = _React$useState[0],
setStatus = _React$useState[1];
_react["default"].useEffect(function () {
// Allow falsy src value if waiting on other data needed for
// constructing the script URL passed to this hook.
if (!src) {
setStatus('idle');
return;
}
// Fetch existing script element by src
// It may have been added by another intance of this hook
var script = document.querySelector("script[src=\"" + src + "\"]");
if (!script) {
// Create script
script = document.createElement('script');
script.src = src;
script.async = true;
script.defer = true;
script.setAttribute('data-status', 'loading');
// Add script to document body
document.body.appendChild(script);
// Store status in attribute on script
// This can be read by other instances of this hook
var setAttributeFromEvent = function setAttributeFromEvent(event) {
script.setAttribute('data-status', event.type === 'load' ? 'ready' : 'error');
};
script.addEventListener('load', setAttributeFromEvent);
script.addEventListener('error', setAttributeFromEvent);
} else {
// Grab existing script status from attribute and set to state.
setStatus(script.getAttribute('data-status'));
}
// Script event handler to update status in state
// Note: Even if the script already exists we still need to add
// event handlers to update the state for *this* hook instance.
var setStateFromEvent = function setStateFromEvent(event) {
setStatus(event.type === 'load' ? 'ready' : 'error');
};
// Add event listeners
script.addEventListener('load', setStateFromEvent);
script.addEventListener('error', setStateFromEvent);
// Remove event listeners on cleanup
// eslint-disable-next-line consistent-return
return function () {
if (script) {
script.removeEventListener('load', setStateFromEvent);
script.removeEventListener('error', setStateFromEvent);
script.remove();
}
};
}, [src]);
return status;
};
var _default = exports["default"] = useScript;
module.exports = exports.default;