Skip to content

Commit d473710

Browse files
Fix call readiness modal being not dismissable by keyboard (#5421)
1 parent 702e576 commit d473710

File tree

4 files changed

+25
-2
lines changed

4 files changed

+25
-2
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
{
2+
"type": "prerelease",
3+
"area": "fix",
4+
"workstream": "",
5+
"comment": "Fix call readiness modal being not dismissable by keyboard",
6+
"packageName": "@azure/communication-react",
7+
"email": "[email protected]",
8+
"dependentChangeType": "patch"
9+
}

packages/react-components/src/components/DevicePermissions/SitePermissionsScaffolding.tsx

+6-2
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,8 @@ export const SitePermissionsContainer = (props: SitePermissionsContainerProps):
121121
const { appName, onTroubleshootingClick, onPrimaryButtonClick, strings } = props;
122122
const theme = useTheme();
123123

124+
const showPrimaryButton = onPrimaryButtonClick && isValidString(strings?.primaryButtonText);
125+
124126
return (
125127
<Stack style={{ padding: '2rem', maxWidth: '25.375rem', alignSelf: 'center' }} aria-label={strings?.ariaLabel}>
126128
<Stack styles={iconBannerContainerStyles} horizontal horizontalAlign={'center'} verticalFill tokens={tokens}>
@@ -142,25 +144,27 @@ export const SitePermissionsContainer = (props: SitePermissionsContainerProps):
142144
</Stack>
143145
<Stack styles={textContainerStyles}>
144146
{strings && isValidString(strings?.primaryText) && (
145-
<Text styles={primaryTextStyles}>
147+
<Text styles={primaryTextStyles} role="alert" aria-live="assertive">
146148
{appName ? _formatString(strings.primaryText, { appName: appName }) : strings.primaryText}
147149
</Text>
148150
)}
149151
{strings && isValidString(strings?.secondaryText) && (
150152
<Text styles={secondaryTextStyles}>{strings?.secondaryText}</Text>
151153
)}
152154

153-
{onPrimaryButtonClick && isValidString(strings?.primaryButtonText) && (
155+
{showPrimaryButton && (
154156
<PrimaryButton
155157
styles={mergeStyleSets(primaryButtonStyles, props.styles?.primaryButton)}
156158
text={strings?.primaryButtonText}
157159
onClick={onPrimaryButtonClick}
160+
autoFocus
158161
/>
159162
)}
160163
{onTroubleshootingClick && isValidString(strings?.linkText) && (
161164
<Link
162165
styles={mergeStyleSets(linkTextStyles, props.styles?.troubleshootingLink)}
163166
onClick={onTroubleshootingClick}
167+
autoFocus={!showPrimaryButton}
164168
>
165169
{strings?.linkText}
166170
</Link>

packages/react-components/src/components/ModalClone/ModalClone.tsx

+1
Original file line numberDiff line numberDiff line change
@@ -448,6 +448,7 @@ const ModalBase: React.FunctionComponent<_ExtendedIModalProps> = React.forwardRe
448448
onBlur={internalState.isInKeyboardMoveMode ? handleExitKeyboardMoveMode : undefined}
449449
data-ui-id={dataUiId}
450450
// enableAriaHiddenSiblings is handled by the Popup
451+
{...(props.focusTrapZoneProps ?? {})}
451452
>
452453
{dragOptions && internalState.isInKeyboardMoveMode && (
453454
<div className={classNames.keyboardMoveIconContainer}>

packages/react-composites/src/composites/CallComposite/components/CallReadinessModal.tsx

+9
Original file line numberDiff line numberDiff line change
@@ -214,6 +214,15 @@ export const CallReadinessModal = (props: {
214214
setIsPermissionsModalDismissed(false);
215215
}}
216216
overlay={{ styles: { root: { background: 'rgba(0,0,0,0.4)' } } }}
217+
forceFocusInsideTrap={true}
218+
focusTrapZoneProps={{
219+
disabled: false,
220+
onKeyDown: (ev: React.KeyboardEvent<HTMLElement>) => {
221+
if (ev.key === 'Escape') {
222+
setIsPermissionsModalDismissed(false);
223+
}
224+
}
225+
}}
217226
>
218227
{modal()}
219228
</_ModalClone>

0 commit comments

Comments
 (0)