UNPKG

@primer/react

Version:

An implementation of GitHub's Primer Design System using React

187 lines (184 loc) 4.52 kB
import { c } from 'react-compiler-runtime'; import { announceFromElement } from '@primer/live-region-element'; import { useRef, useState, useEffect } from 'react'; import { useEffectOnce } from '../internal/hooks/useEffectOnce.js'; import { useEffectCallback } from '../internal/hooks/useEffectCallback.js'; import { jsx } from 'react/jsx-runtime'; /** * `Announce` is a component that will announce the text content of the * `children` passed in to screen readers using the given politeness level. It * will also announce any changes to the text content of `children` */ function Announce(props) { const $ = c(25); let children; let delayMs; let rest; let t0; let t1; let t2; let t3; if ($[0] !== props) { ({ as: t0, announceOnShow: t1, children, delayMs, hidden: t2, politeness: t3, ...rest } = props); $[0] = props; $[1] = children; $[2] = delayMs; $[3] = rest; $[4] = t0; $[5] = t1; $[6] = t2; $[7] = t3; } else { children = $[1]; delayMs = $[2]; rest = $[3]; t0 = $[4]; t1 = $[5]; t2 = $[6]; t3 = $[7]; } const BaseComponent = t0 === undefined ? "div" : t0; const announceOnShow = t1 === undefined ? true : t1; const hidden = t2 === undefined ? false : t2; const politeness = t3 === undefined ? "polite" : t3; const ref = useRef(null); const [previousAnnouncementText, setPreviousAnnouncementText] = useState(null); const savedAnnouncement = useRef(null); let t4; if ($[8] !== delayMs || $[9] !== hidden || $[10] !== politeness || $[11] !== previousAnnouncementText) { t4 = () => { var _savedAnnouncement$cu; const { current: element } = ref; if (!element) { return; } if (hidden) { return; } const style = window.getComputedStyle(element); if (style.display === "none") { return; } if (style.visibility === "hidden") { return; } const textContent = getTextContent(element); if (textContent === previousAnnouncementText) { return; } (_savedAnnouncement$cu = savedAnnouncement.current) === null || _savedAnnouncement$cu === void 0 ? void 0 : _savedAnnouncement$cu.cancel(); savedAnnouncement.current = announceFromElement(element, politeness === "assertive" ? { politeness } : { politeness, delayMs }); setPreviousAnnouncementText(textContent); }; $[8] = delayMs; $[9] = hidden; $[10] = politeness; $[11] = previousAnnouncementText; $[12] = t4; } else { t4 = $[12]; } const announce = useEffectCallback(t4); let t5; if ($[13] !== announce || $[14] !== announceOnShow) { t5 = () => { if (announceOnShow) { announce(); } }; $[13] = announce; $[14] = announceOnShow; $[15] = t5; } else { t5 = $[15]; } useEffectOnce(t5); let t6; let t7; if ($[16] !== announce) { t6 = () => { const { current: container } = ref; if (container === null) { return; } const observer = new MutationObserver(() => { announce(); }); observer.observe(container, { subtree: true, childList: true, characterData: true }); return () => { observer.disconnect(); }; }; t7 = [announce]; $[16] = announce; $[17] = t6; $[18] = t7; } else { t6 = $[17]; t7 = $[18]; } useEffect(t6, t7); let t8; let t9; if ($[19] === Symbol.for("react.memo_cache_sentinel")) { t8 = () => () => { if (savedAnnouncement.current !== null) { savedAnnouncement.current.cancel(); savedAnnouncement.current = null; } }; t9 = []; $[19] = t8; $[20] = t9; } else { t8 = $[19]; t9 = $[20]; } useEffect(t8, t9); let t10; if ($[21] !== BaseComponent || $[22] !== children || $[23] !== rest) { t10 = /*#__PURE__*/jsx(BaseComponent, { ...rest, ref: ref, children: children }); $[21] = BaseComponent; $[22] = children; $[23] = rest; $[24] = t10; } else { t10 = $[24]; } return t10; } function getTextContent(element) { let value = ''; if (element.hasAttribute('aria-label')) { value = element.getAttribute('aria-label'); } else if (element.textContent) { value = element.textContent; } return value ? value.trim() : ''; } export { Announce };