azure-devops-ui
Version:
React components for building web UI in Azure DevOps
1 lines • 1.69 kB
JavaScript
const MaxAnnounceChildren=1,MaxAnnounceContainers=10,DefaultAnnounceDelay=1e3,ParentContainerId="utils-accessibility-announce";let nextId=0;function getAnnounceContainer(){let n=document.getElementById(ParentContainerId);return n||((n=document.createElement("div")).id=ParentContainerId,n.classList.add("visually-hidden"),document.body.appendChild(n)),n}function announce(e,t=!1,o=100){if(e){var i=t?"assertive":"polite",a=getAnnounceContainer(),s=a.getElementsByClassName(i);let n=0<s.length?s[s.length-1]:null;!n||n.childElementCount>=MaxAnnounceChildren?((n=document.createElement("div")).id=ParentContainerId+nextId++,n.setAttribute("aria-live",i),n.classList.add(i),n.setAttribute("aria-relevant","additions"),a.appendChild(n),s.length>MaxAnnounceContainers&&a.removeChild(s[0]),window.setTimeout(()=>{announce(e,t)},o)):((i=document.createElement("p")).textContent=e,n.appendChild(i),n.style.visibility="hidden",n.style.visibility="visible")}}class ProgressAnnouncer{constructor(n){this._startAnnounced=!1,this._completed=!1,this._options=n,this._start()}static forPromise(n,e){const t=new ProgressAnnouncer(e);return n.then(()=>{t.announceCompleted()},()=>{t.announceError()}),t}announceCompleted(){this._completed||(this._completed=!0,this._startAnnounced&&announce(this._options.announceEndMessage))}announceError(){this._completed||(this._completed=!0,announce(this._options.announceErrorMessage))}cancel(){this._completed=!0}_start(){window.setTimeout(()=>{this._completed||announce(this._options.announceStartMessage),this._startAnnounced=!0},void 0!==this._options.announceStartDelay?this._options.announceStartDelay:DefaultAnnounceDelay)}}export{announce,ProgressAnnouncer};