import React from 'react' import { useRouter } from './router' export function RouteAnnouncer() { const { asPath } = useRouter() const [routeAnnouncement, setRouteAnnouncement] = React.useState('') // Only announce the path change, but not for the first load because screen // reader will do that automatically. const previouslyLoadedPath = React.useRef(asPath) // Every time the path changes, announce the new page’s title following this // priority: first the document title (from head), otherwise the first h1, or // if none of these exist, then the pathname from the URL. This methodology is // inspired by Marcy Sutton’s accessible client routing user testing. More // information can be found here: // https://www.gatsbyjs.com/blog/2019-07-11-user-testing-accessible-client-routing/ React.useEffect( () => { // If the path hasn't change, we do nothing. if (previouslyLoadedPath.current === asPath) return previouslyLoadedPath.current = asPath if (document.title) { setRouteAnnouncement(document.title) } else { const pageHeader = document.querySelector('h1') const content = pageHeader?.innerText ?? pageHeader?.textContent setRouteAnnouncement(content || asPath) } }, // TODO: switch to pathname + query object of dynamic route requirements [asPath] ) return ( ) } export default RouteAnnouncer