/* Copyright 2024 New Vector Ltd. SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial Please see LICENSE in the repository root for full details. */ import { type ChangeEvent, type FC, type ReactElement, type ReactNode, useCallback, useId, } from "react"; import { Heading, InlineField, Label, RadioControl, Separator, } from "@vector-im/compound-web"; import { Trans, useTranslation } from "react-i18next"; import { type MediaDevice } from "../livekit/MediaDevicesContext"; import styles from "./DeviceSelection.module.css"; interface Props { devices: MediaDevice; title: string; numberedLabel: (number: number) => string; } export const DeviceSelection: FC = ({ devices, title, numberedLabel, }) => { const { t } = useTranslation(); const groupId = useId(); const onChange = useCallback( (e: ChangeEvent) => { devices.select(e.target.value); }, [devices], ); if (devices.available.size == 0) return null; return (
{title}
{[...devices.available].map(([id, label]) => { let labelText: ReactNode; switch (label.type) { case "name": labelText = label.name; break; case "number": labelText = numberedLabel(label.number); break; case "default": labelText = label.name === null ? ( t("settings.devices.default") ) : ( Default{" "} ({{ name: label.name } as unknown as ReactElement}) ); break; } return ( } > ); })}
); };