@100mslive/roomkit-react
Version:

72 lines (69 loc) • 2.12 kB
JSX
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,
};