UNPKG

@100mslive/roomkit-react

Version:

![Banner](https://github.com/100mslive/web-sdks/blob/06c65259912db6ccd8617f2ecb6fef51429251ec/prebuilt-banner.png)

72 lines (69 loc) 2.12 kB
import React, { useRef, useState } from 'react'; import PropTypes from 'prop-types'; import { Dropdown } from '../Dropdown'; import { Box, Flex } from '../Layout'; import { DialogDropdownTrigger } from '../Prebuilt/primitives/DropdownTrigger'; import { Text } from '../Text'; export const DeviceSelector = ({ title, devices, selection, onChange, icon, children = null }) => { const [open, setOpen] = useState(false); const ref = useRef(null); return ( <Box css={{ mb: '$6' }}> <Text css={{ mb: '$4' }}>{title}</Text> <Flex align="center" css={{ gap: '$4', '@md': { flexDirection: children ? 'column' : 'row', alignItems: children ? 'start' : 'center', }, }} > <Dropdown.Root open={open} onOpenChange={setOpen}> <DialogDropdownTrigger ref={ref} icon={icon} title={devices.find(({ deviceId }) => deviceId === selection)?.label || 'Select device from list'} open={open} /> <Dropdown.Portal> <Dropdown.Content align="start" sideOffset={8} css={{ w: // @ts-ignore ref.current?.clientWidth, zIndex: 1001, }} > {devices.map(device => { return ( <Dropdown.Item key={device.label} onSelect={() => onChange(device.deviceId)} css={{ px: '$9', }} > {device.label} </Dropdown.Item> ); })} </Dropdown.Content> </Dropdown.Portal> </Dropdown.Root> {children} </Flex> </Box> ); }; DeviceSelector.propTypes = { title: PropTypes.string.isRequired, devices: PropTypes.array.isRequired, selection: PropTypes.string, onChange: PropTypes.func.isRequired, icon: PropTypes.node, children: PropTypes.node, };