Skip to content

Commit f6b6cd2

Browse files
authored
fix(pronto): use list visualType for device selection mobile devices (#2202)
### 💡 Overview Use list visualType for device selectors on mobile devices. The preview mode renders a live media stream per device, which is not reliably supported on mobile browsers. ### 📝 Implementation notes 🎫 Ticket: https://linear.app/stream/issue/REACT-940/device-preview-for-audio-and-video-devices 📑 Docs: GetStream/docs-content#1195 <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **Bug Fixes** * Video device selector now automatically adapts its display layout based on device type (list view on mobile, preview view on desktop) for improved reliability and usability across different platforms. <!-- end of auto-generated comment: release notes by coderabbit.ai -->
1 parent 704681a commit f6b6cd2

File tree

4 files changed

+15
-2
lines changed

4 files changed

+15
-2
lines changed

packages/react-sdk/src/components/DeviceSettings/DeviceSelectorVideo.tsx

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,12 @@ import { DeviceVideoPreviewItem } from './DeviceVideoPreviewItem';
55

66
export type DeviceSelectorVideoProps = {
77
title?: string;
8+
/**
9+
* The visual style used to render the device selector.
10+
*
11+
* Note: `'preview'` is not reliable on mobile browsers. Use `'list'` or
12+
* `'dropdown'` on mobile devices.
13+
*/
814
visualType?: 'list' | 'dropdown' | 'preview';
915
};
1016

sample-apps/react/react-dogfood/components/ToggleCameraButton.tsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import {
99
useCallStateHooks,
1010
useI18n,
1111
} from '@stream-io/video-react-sdk';
12+
import { isMobile } from '../helpers/isMobile';
1213

1314
const ToggleMenuButton = forwardRef<HTMLButtonElement, ToggleMenuButtonProps>(
1415
function ToggleMenuButton(props, ref) {
@@ -34,13 +35,14 @@ const ToggleMenuButton = forwardRef<HTMLButtonElement, ToggleMenuButtonProps>(
3435
);
3536

3637
export const ToggleCameraButton = () => {
38+
const visualType = isMobile() ? 'list' : 'preview';
3739
return (
3840
<MenuToggle
3941
placement="top-start"
4042
ToggleButton={ToggleMenuButton}
4143
visualType={MenuVisualType.MENU}
4244
>
43-
<DeviceSelectorVideo visualType="preview" />
45+
<DeviceSelectorVideo visualType={visualType} />
4446
</MenuToggle>
4547
);
4648
};

sample-apps/react/react-dogfood/components/ToggleDualCameraButton.tsx

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,18 @@ import {
44
Restricted,
55
ToggleVideoPublishingButton,
66
} from '@stream-io/video-react-sdk';
7+
import { isMobile } from '../helpers/isMobile';
78
import { DegradedPerformanceNotification } from './DegradedPerformanceNotification';
89

910
export const ToggleDualCameraButton = () => {
11+
const visualType = isMobile() ? 'list' : 'preview';
12+
1013
return (
1114
<Restricted requiredGrants={[OwnCapability.SEND_VIDEO]} hasPermissionsOnly>
1215
<div className="rd__dual-toggle">
1316
<DegradedPerformanceNotification className="rd__call-controls__notification" />
1417
<ToggleVideoPublishingButton
15-
Menu={<DeviceSelectorVideo visualType="preview" />}
18+
Menu={<DeviceSelectorVideo visualType={visualType} />}
1619
menuPlacement="top"
1720
/>
1821
</div>
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
export const isMobile = () =>
2+
typeof navigator !== 'undefined' && /Mobi/i.test(navigator.userAgent);

0 commit comments

Comments
 (0)