jobiqo-cl
Version:
[](https://circleci.com/gh/jobiqo/jobiqo-cl)
149 lines (127 loc) • 4.6 kB
JavaScript
;
Object.defineProperty(exports, '__esModule', { value: true });
function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; }
var React = require('react');
var React__default = _interopDefault(React);
var index = require('../../../prop-types/index.js');
var reactDom = require('react-dom');
var index$1 = require('../../visually-hidden/es/index.js');
var index$2 = require('../../utils/es/index.js');
function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
// an alert (SRs don't read them on first load anyway)
var keys = {
polite: -1,
assertive: -1
};
var elements = {
polite: {},
assertive: {}
};
var liveRegions = {
polite: null,
assertive: null
};
var renderTimer = null; ////////////////////////////////////////////////////////////////////////////////
// Alert
var Alert = React.forwardRef(function Alert(_ref, forwardedRef) {
var children = _ref.children,
_ref$type = _ref.type,
type = _ref$type === void 0 ? "polite" : _ref$type,
props = _objectWithoutPropertiesLoose(_ref, ["children", "type"]);
var ownRef = React.useRef(null);
var ref = index$2.useForkedRef(forwardedRef, ownRef);
var child = React.useMemo(function () {
return React__default.createElement("div", _extends({}, props, {
ref: ref,
"data-reach-alert": true
}), children);
}, // eslint-disable-next-line react-hooks/exhaustive-deps
[children, props]);
useMirrorEffects(type, child, ownRef);
return child;
});
Alert.displayName = "Alert";
if (process.env.NODE_ENV !== "production") {
Alert.propTypes = {
children: index.default.node,
type: index.default.string
};
}
function createMirror(type, doc) {
if (doc === void 0) {
doc = document;
}
var key = ++keys[type];
var mount = function mount(element) {
if (liveRegions[type]) {
elements[type][key] = element;
renderAlerts();
} else {
var node = doc.createElement("div");
node.setAttribute("data-reach-live-" + type, "true");
liveRegions[type] = node;
doc.body.appendChild(liveRegions[type]);
mount(element);
}
};
var update = function update(element) {
elements[type][key] = element;
renderAlerts();
};
var unmount = function unmount() {
delete elements[type][key];
renderAlerts();
};
return {
mount: mount,
update: update,
unmount: unmount
};
}
function renderAlerts() {
clearTimeout(renderTimer);
renderTimer = setTimeout(function () {
Object.keys(elements).forEach(function (type) {
var container = liveRegions[type];
if (container) {
reactDom.render(React__default.createElement(index$1.default, null, React__default.createElement("div", {
role: type === "assertive" ? "alert" : "status",
"aria-live": type
}, Object.keys(elements[type]).map(function (key) {
return React__default.cloneElement(elements[type][key], {
key: key,
ref: null
});
}))), liveRegions[type]);
}
});
}, 500);
}
function useMirrorEffects(type, element, ref) {
var prevType = index$2.usePrevious(type);
var mirror = React.useRef(null);
var mounted = React.useRef(false);
React.useEffect(function () {
var _ref2 = ref.current || {},
ownerDocument = _ref2.ownerDocument;
if (!mounted.current) {
mounted.current = true;
mirror.current = createMirror(type, ownerDocument);
mirror.current.mount(element);
} else if (!prevType !== type) {
mirror.current.unmount();
mirror.current = createMirror(type, ownerDocument);
mirror.current.mount(element);
} else {
mirror.current.update(element, prevType, type);
} // eslint-disable-next-line react-hooks/exhaustive-deps
}, [element, type, prevType]);
React.useEffect(function () {
return function () {
mirror.current && mirror.current.unmount();
};
}, []);
}
exports.Alert = Alert;
exports.default = Alert;