Skip to content

Commit 943ee9f

Browse files
committed
Improve accessibility of Alert componenté
1 parent 868f2db commit 943ee9f

File tree

1 file changed

+26
-2
lines changed

1 file changed

+26
-2
lines changed

src/Alert.tsx

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import React, { memo, forwardRef, useState, useEffect } from "react";
1+
import React, { memo, forwardRef, useState, useEffect, useRef } from "react";
22
import type { ReactNode } from "react";
33
import type { FrClassName } from "./lib/generatedFromCss/classNames";
44
import { symToStr } from "tsafe/symToStr";
@@ -81,14 +81,37 @@ export const Alert = memo(
8181

8282
const [isClosed, setIsClosed] = useState(props_isClosed ?? false);
8383

84+
const [buttonElement, setButtonElement] = useState<HTMLButtonElement | null>(null);
85+
86+
const refShouldButtonGetFocus = useRef<boolean>(false);
87+
8488
useEffect(() => {
8589
if (props_isClosed === undefined) {
8690
return;
8791
}
92+
setIsClosed(isClosed => {
93+
if (isClosed && !props_isClosed) {
94+
refShouldButtonGetFocus.current = true;
95+
}
8896

89-
setIsClosed(props_isClosed);
97+
return props_isClosed;
98+
});
9099
}, [props_isClosed]);
91100

101+
useEffect(() => {
102+
if (!refShouldButtonGetFocus.current) {
103+
return;
104+
}
105+
106+
if (buttonElement === null) {
107+
//NOTE: This should not be reachable
108+
return;
109+
}
110+
111+
refShouldButtonGetFocus.current = false;
112+
buttonElement.focus();
113+
}, [buttonElement]);
114+
92115
const onCloseButtonClick = useConstCallback(() => {
93116
if (props_isClosed === undefined) {
94117
//Uncontrolled
@@ -123,6 +146,7 @@ export const Alert = memo(
123146
{/* TODO: Use our button once we have one */}
124147
{isClosable && (
125148
<button
149+
ref={setButtonElement}
126150
className={cx(fr.cx("fr-link--close", "fr-link"), classes.close)}
127151
onClick={onCloseButtonClick}
128152
>

0 commit comments

Comments
 (0)