({
politeness = "polite",
delay = 50,
}: UseAriaLiveOptions = {})
| 36 | * <div {...liveRegionProps} className="sr-only">{announcement}</div> |
| 37 | */ |
| 38 | export function useAriaLive({ |
| 39 | politeness = "polite", |
| 40 | delay = 50, |
| 41 | }: UseAriaLiveOptions = {}): UseAriaLiveReturn { |
| 42 | const [announcement, setAnnouncement] = useState(""); |
| 43 | const timerRef = useRef<ReturnType<typeof setTimeout> | null>(null); |
| 44 | |
| 45 | const announce = useCallback( |
| 46 | (message: string) => { |
| 47 | setAnnouncement(""); |
| 48 | if (timerRef.current) clearTimeout(timerRef.current); |
| 49 | timerRef.current = setTimeout(() => setAnnouncement(message), delay); |
| 50 | }, |
| 51 | [delay] |
| 52 | ); |
| 53 | |
| 54 | useEffect(() => () => { if (timerRef.current) clearTimeout(timerRef.current); }, []); |
| 55 | |
| 56 | return { |
| 57 | announcement, |
| 58 | announce, |
| 59 | liveRegionProps: { |
| 60 | role: "status", |
| 61 | "aria-live": politeness, |
| 62 | "aria-atomic": true, |
| 63 | }, |
| 64 | }; |
| 65 | } |
nothing calls this directly
no outgoing calls
no test coverage detected