@primer/react
Version:
An implementation of GitHub's Primer Design System using React
182 lines (179 loc) • 4.37 kB
JavaScript
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 };