UNPKG

jobiqo-cl

Version:

[![CircleCI](https://circleci.com/gh/jobiqo/jobiqo-cl.svg?style=svg&circle-token=5a24efa5b8bbc4879276123e77d0d3f35ca7144c)](https://circleci.com/gh/jobiqo/jobiqo-cl)

149 lines (127 loc) 4.6 kB
'use strict'; 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;