♿️(frontend) announce mic/camera state for screen readers on shortcut
announce "Microphone/Camera turned on/off" when toggling via keyboard shortcut so screen reader users get feedback
This commit is contained in:
@@ -29,6 +29,7 @@ and this project adheres to
|
|||||||
- ⬆️(python) bump minimal required python version to 3.13 #1033
|
- ⬆️(python) bump minimal required python version to 3.13 #1033
|
||||||
- ♿️(frontend) improve accessibility of the IntroSlider carousel #1026
|
- ♿️(frontend) improve accessibility of the IntroSlider carousel #1026
|
||||||
- ♿️(frontend) add skip link component for keyboard navigation #1019
|
- ♿️(frontend) add skip link component for keyboard navigation #1019
|
||||||
|
- ♿️(frontend) announce mic/camera state to SR on shortcut toggle #1052
|
||||||
|
|
||||||
### Fixed
|
### Fixed
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
import { ToggleButton } from '@/primitives'
|
import { ToggleButton } from '@/primitives'
|
||||||
import { useRegisterKeyboardShortcut } from '@/features/shortcuts/useRegisterKeyboardShortcut'
|
import { useRegisterKeyboardShortcut } from '@/features/shortcuts/useRegisterKeyboardShortcut'
|
||||||
|
import { useScreenReaderAnnounce } from '@/hooks/useScreenReaderAnnounce'
|
||||||
import { useMemo, useState } from 'react'
|
import { useMemo, useState } from 'react'
|
||||||
import { appendShortcutLabel } from '@/features/shortcuts/utils'
|
import { appendShortcutLabel } from '@/features/shortcuts/utils'
|
||||||
import { useTranslation } from 'react-i18next'
|
import { useTranslation } from 'react-i18next'
|
||||||
@@ -87,10 +88,24 @@ export const ToggleDevice = <T extends ToggleSource>({
|
|||||||
const deviceIcons = useDeviceIcons(kind)
|
const deviceIcons = useDeviceIcons(kind)
|
||||||
const cannotUseDevice = useCannotUseDevice(kind)
|
const cannotUseDevice = useCannotUseDevice(kind)
|
||||||
const deviceShortcut = useDeviceShortcut(kind)
|
const deviceShortcut = useDeviceShortcut(kind)
|
||||||
|
const announce = useScreenReaderAnnounce()
|
||||||
|
|
||||||
useRegisterKeyboardShortcut({
|
useRegisterKeyboardShortcut({
|
||||||
id: deviceShortcut?.id,
|
id: deviceShortcut?.id,
|
||||||
handler: async () => await toggle(),
|
handler: async () => {
|
||||||
|
const nextState = !enabled
|
||||||
|
try {
|
||||||
|
const didChange = await toggle(nextState)
|
||||||
|
if (didChange === false) return
|
||||||
|
|
||||||
|
const message = t(nextState ? 'turnedOn' : 'turnedOff', {
|
||||||
|
keyPrefix: `selectDevice.${kind}`,
|
||||||
|
})
|
||||||
|
announce(message, 'assertive')
|
||||||
|
} catch {
|
||||||
|
// no announce
|
||||||
|
}
|
||||||
|
},
|
||||||
isDisabled: cannotUseDevice,
|
isDisabled: cannotUseDevice,
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|||||||
@@ -22,6 +22,8 @@
|
|||||||
"permissionsNeeded": "Kamera auswählen - genehmigung erforderlich",
|
"permissionsNeeded": "Kamera auswählen - genehmigung erforderlich",
|
||||||
"disable": "Kamera deaktivieren",
|
"disable": "Kamera deaktivieren",
|
||||||
"enable": "Kamera aktivieren",
|
"enable": "Kamera aktivieren",
|
||||||
|
"turnedOff": "Kamera deaktiviert",
|
||||||
|
"turnedOn": "Kamera aktiviert",
|
||||||
"label": "Kamera",
|
"label": "Kamera",
|
||||||
"placeholder": "Kamera aktivieren, um die Vorschau zu sehen"
|
"placeholder": "Kamera aktivieren, um die Vorschau zu sehen"
|
||||||
},
|
},
|
||||||
@@ -30,6 +32,8 @@
|
|||||||
"permissionsNeeded": "Mikrofon auswählen - genehmigung erforderlich",
|
"permissionsNeeded": "Mikrofon auswählen - genehmigung erforderlich",
|
||||||
"disable": "Mikrofon deaktivieren",
|
"disable": "Mikrofon deaktivieren",
|
||||||
"enable": "Mikrofon aktivieren",
|
"enable": "Mikrofon aktivieren",
|
||||||
|
"turnedOff": "Mikrofon deaktiviert",
|
||||||
|
"turnedOn": "Mikrofon aktiviert",
|
||||||
"label": "Mikrofon"
|
"label": "Mikrofon"
|
||||||
},
|
},
|
||||||
"audiooutput": {
|
"audiooutput": {
|
||||||
|
|||||||
@@ -22,6 +22,8 @@
|
|||||||
"permissionsNeeded": "Select camera - permission needed",
|
"permissionsNeeded": "Select camera - permission needed",
|
||||||
"disable": "Disable camera",
|
"disable": "Disable camera",
|
||||||
"enable": "Enable camera",
|
"enable": "Enable camera",
|
||||||
|
"turnedOff": "Camera turned off",
|
||||||
|
"turnedOn": "Camera turned on",
|
||||||
"label": "Camera",
|
"label": "Camera",
|
||||||
"placeholder": "Enable camera to see the preview"
|
"placeholder": "Enable camera to see the preview"
|
||||||
},
|
},
|
||||||
@@ -30,6 +32,8 @@
|
|||||||
"permissionsNeeded": "Select microphone - permission needed",
|
"permissionsNeeded": "Select microphone - permission needed",
|
||||||
"disable": "Disable microphone",
|
"disable": "Disable microphone",
|
||||||
"enable": "Enable microphone",
|
"enable": "Enable microphone",
|
||||||
|
"turnedOff": "Microphone turned off",
|
||||||
|
"turnedOn": "Microphone turned on",
|
||||||
"label": "Microphone"
|
"label": "Microphone"
|
||||||
},
|
},
|
||||||
"audiooutput": {
|
"audiooutput": {
|
||||||
|
|||||||
@@ -22,6 +22,8 @@
|
|||||||
"permissionsNeeded": "Choisir la webcam - autorisations nécessaires",
|
"permissionsNeeded": "Choisir la webcam - autorisations nécessaires",
|
||||||
"disable": "Désactiver la webcam",
|
"disable": "Désactiver la webcam",
|
||||||
"enable": "Activer la webcam",
|
"enable": "Activer la webcam",
|
||||||
|
"turnedOff": "Webcam désactivée",
|
||||||
|
"turnedOn": "Webcam activée",
|
||||||
"label": "Webcam",
|
"label": "Webcam",
|
||||||
"placeholder": "Activez la webcam pour prévisualiser l'affichage"
|
"placeholder": "Activez la webcam pour prévisualiser l'affichage"
|
||||||
},
|
},
|
||||||
@@ -30,6 +32,8 @@
|
|||||||
"permissionsNeeded": "Choisir le micro - autorisations nécessaires",
|
"permissionsNeeded": "Choisir le micro - autorisations nécessaires",
|
||||||
"disable": "Désactiver le micro",
|
"disable": "Désactiver le micro",
|
||||||
"enable": "Activer le micro",
|
"enable": "Activer le micro",
|
||||||
|
"turnedOff": "Micro désactivé",
|
||||||
|
"turnedOn": "Micro activé",
|
||||||
"label": "Microphone"
|
"label": "Microphone"
|
||||||
},
|
},
|
||||||
"audiooutput": {
|
"audiooutput": {
|
||||||
|
|||||||
@@ -22,6 +22,8 @@
|
|||||||
"permissionsNeeded": "Selecteer camera - Toestemming vereist",
|
"permissionsNeeded": "Selecteer camera - Toestemming vereist",
|
||||||
"disable": "Camera uitschakelen",
|
"disable": "Camera uitschakelen",
|
||||||
"enable": "Camera inschakelen",
|
"enable": "Camera inschakelen",
|
||||||
|
"turnedOff": "Camera uitgeschakeld",
|
||||||
|
"turnedOn": "Camera ingeschakeld",
|
||||||
"label": "Camera",
|
"label": "Camera",
|
||||||
"placeholder": "Schakel de camera in om de preview te zien"
|
"placeholder": "Schakel de camera in om de preview te zien"
|
||||||
},
|
},
|
||||||
@@ -30,6 +32,8 @@
|
|||||||
"permissionsNeeded": "Selecteer microfoon - Toestemming vereist",
|
"permissionsNeeded": "Selecteer microfoon - Toestemming vereist",
|
||||||
"disable": "Microfoon dempen",
|
"disable": "Microfoon dempen",
|
||||||
"enable": "Microfoon dempen opheffen",
|
"enable": "Microfoon dempen opheffen",
|
||||||
|
"turnedOff": "Microfoon uitgeschakeld",
|
||||||
|
"turnedOn": "Microfoon ingeschakeld",
|
||||||
"label": "Microfoon"
|
"label": "Microfoon"
|
||||||
},
|
},
|
||||||
"audiooutput": {
|
"audiooutput": {
|
||||||
|
|||||||
Reference in New Issue
Block a user