UNPKG

@primer/react

Version:

An implementation of GitHub's Primer Design System using React

182 lines (179 loc) 4.37 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'; import Box from '../Box/Box.js'; /** * `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(t0) { const $ = c(23); let children; let delayMs; let rest; let t1; let t2; let t3; if ($[0] !== t0) { ({ announceOnShow: t1, children, delayMs, hidden: t2, politeness: t3, ...rest } = t0); $[0] = t0; $[1] = children; $[2] = delayMs; $[3] = rest; $[4] = t1; $[5] = t2; $[6] = t3; } else { children = $[1]; delayMs = $[2]; rest = $[3]; t1 = $[4]; t2 = $[5]; t3 = $[6]; } 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 ($[7] !== delayMs || $[8] !== hidden || $[9] !== politeness || $[10] !== 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); }; $[7] = delayMs; $[8] = hidden; $[9] = politeness; $[10] = previousAnnouncementText; $[11] = t4; } else { t4 = $[11]; } const announce = useEffectCallback(t4); let t5; if ($[12] !== announce || $[13] !== announceOnShow) { t5 = () => { if (announceOnShow) { announce(); } }; $[12] = announce; $[13] = announceOnShow; $[14] = t5; } else { t5 = $[14]; } useEffectOnce(t5); let t6; let t7; if ($[15] !== 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]; $[15] = announce; $[16] = t6; $[17] = t7; } else { t6 = $[16]; t7 = $[17]; } useEffect(t6, t7); let t8; let t9; if ($[18] === Symbol.for("react.memo_cache_sentinel")) { t8 = () => () => { if (savedAnnouncement.current !== null) { savedAnnouncement.current.cancel(); savedAnnouncement.current = null; } }; t9 = []; $[18] = t8; $[19] = t9; } else { t8 = $[18]; t9 = $[19]; } useEffect(t8, t9); let t10; if ($[20] !== children || $[21] !== rest) { t10 = /*#__PURE__*/jsx(Box, { ...rest, ref: ref, children: children }); $[20] = children; $[21] = rest; $[22] = t10; } else { t10 = $[22]; } 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 };