Skip to content

Commit d2c97af

Browse files
feat(snackbar): make snackbars more accessible (#1043)
1 parent f436072 commit d2c97af

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

52 files changed

+1660
-47
lines changed

src/components/InfoBar/InfoBar.tsx

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import LocaleReceiver, {
1414
useLocaleReceiver,
1515
} from '../LocaleProvider/LocaleReceiver';
1616
import enUS from './Locale/en_US';
17+
import { useMergedRefs } from '../../hooks/useMergedRefs';
1718

1819
import styles from './infoBar.module.scss';
1920
import themedComponentStyles from './infoBar.theme.module.scss';
@@ -28,13 +29,15 @@ export const InfoBar: FC<InfoBarsProps> = React.forwardRef(
2829
closable,
2930
closeButtonAriaLabelText: defaultCloseButtonAriaLabelText,
3031
closeButtonProps,
32+
closeButtonRef: externalCloseButtonRef,
3133
closeIcon = IconName.mdiClose,
3234
configContextProps = {
3335
noGradientContext: false,
3436
noThemeContext: false,
3537
},
3638
content,
3739
contentClassNames,
40+
contentId,
3841
contentWrapperClassNames,
3942
gradient = false,
4043
icon,
@@ -50,7 +53,11 @@ export const InfoBar: FC<InfoBarsProps> = React.forwardRef(
5053
moveFocusToSnackbar = false,
5154
...rest
5255
} = props;
53-
const closeButtonRef = useRef<HTMLButtonElement>(null);
56+
const internalCloseButtonRef = useRef<HTMLButtonElement>(null);
57+
const closeButtonRef = useMergedRefs(
58+
internalCloseButtonRef,
59+
externalCloseButtonRef
60+
);
5461

5562
const contextualGradient: Gradient = useContext(GradientContext);
5663
const mergedGradient: boolean = configContextProps.noGradientContext
@@ -85,14 +92,6 @@ export const InfoBar: FC<InfoBarsProps> = React.forwardRef(
8592
);
8693
}, [mergedLocale]);
8794

88-
useEffect(() => {
89-
setTimeout(() => {
90-
if (ref && 'current' in ref && moveFocusToSnackbar && closable) {
91-
ref.current.focus();
92-
}
93-
}, 0);
94-
}, [ref]);
95-
9695
const infoBarClassNames: string = mergeClasses([
9796
styles.infoBar,
9897
{ [styles.bordered]: !!bordered },
@@ -142,6 +141,7 @@ export const InfoBar: FC<InfoBarsProps> = React.forwardRef(
142141
ref={ref}
143142
style={style}
144143
role={role}
144+
aria-describedby={contentId}
145145
>
146146
<Icon
147147
path={getIconName()}
@@ -154,7 +154,9 @@ export const InfoBar: FC<InfoBarsProps> = React.forwardRef(
154154
contentWrapperClassNames,
155155
])}
156156
>
157-
<div className={messageClasses}>{content}</div>
157+
<div className={messageClasses} id={contentId}>
158+
{content}
159+
</div>
158160
{actionButtonProps && (
159161
<Button
160162
buttonWidth={ButtonWidth.fitContent}

src/components/InfoBar/InfoBar.types.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,11 @@ export interface InfoBarsProps
7575
* Custom classes of the content.
7676
*/
7777
contentClassNames?: string;
78+
/**
79+
* ID attribute for the content element.
80+
* Useful for aria-describedby references.
81+
*/
82+
contentId?: string;
7883
/**
7984
* Custom classes of the content wrapper.
8085
*/
@@ -132,4 +137,8 @@ export interface InfoBarsProps
132137
* @default false
133138
*/
134139
moveFocusToSnackbar?: boolean;
140+
/**
141+
* Ref for the close button element
142+
*/
143+
closeButtonRef?: React.Ref<HTMLButtonElement>;
135144
}

src/components/LocaleProvider/index.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import type { StepperLocale } from '../Stepper';
1414
import type { TableLocale } from '../Table/Table.types';
1515
import type { UploadLocale } from '../Upload/Upload.types';
1616
import type { ValidateMessages } from '../Form/Internal/OcForm.types';
17+
import type { SnackbarLocale } from '../Snackbar/Snackbar.types';
1718
import LocaleContext from './Context';
1819

1920
export interface Locale {
@@ -36,6 +37,7 @@ export interface Locale {
3637
Table?: TableLocale;
3738
TimePicker?: Record<string, any>;
3839
Upload?: UploadLocale;
40+
Snackbar?: SnackbarLocale;
3941
}
4042

4143
export interface LocaleProviderProps {

0 commit comments

Comments
 (0)