"use client" import * as React from "react" import { useMultibandTrackVolume } from "@/common" import AudioVisualizer from "@/components/Agent/AudioVisualizer" import AgoraRTC, { IMicrophoneAudioTrack } from "agora-rtc-sdk-ng" import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "@/components/ui/select" import { Button } from "@/components/ui/button" import { MicIconByStatus } from "@/components/Icon" export default function MicrophoneBlock(props: { audioTrack?: IMicrophoneAudioTrack }) { const { audioTrack } = props const [audioMute, setAudioMute] = React.useState(false) const [mediaStreamTrack, setMediaStreamTrack] = React.useState() React.useEffect(() => { audioTrack?.on("track-updated", onAudioTrackupdated) if (audioTrack) { setMediaStreamTrack(audioTrack.getMediaStreamTrack()) } return () => { audioTrack?.off("track-updated", onAudioTrackupdated) } }, [audioTrack]) React.useEffect(() => { audioTrack?.setMuted(audioMute) }, [audioTrack, audioMute]) const subscribedVolumes = useMultibandTrackVolume(mediaStreamTrack, 20) const onAudioTrackupdated = (track: MediaStreamTrack) => { console.log("[test] audio track updated", track) setMediaStreamTrack(track) } const onClickMute = () => { setAudioMute(!audioMute) } return ( } >
) } export function CommonDeviceWrapper(props: { children: React.ReactNode title: string Icon: ( props: React.SVGProps & { active?: boolean }, ) => React.ReactNode onIconClick: () => void isActive: boolean select?: React.ReactNode }) { const { title, Icon, onIconClick, isActive, select, children } = props return (
{title}
{select}
{children}
) } export type TDeviceSelectItem = { label: string value: string deviceId: string } export const DEFAULT_DEVICE_ITEM: TDeviceSelectItem = { label: "Default", value: "default", deviceId: "", } export const DeviceSelect = (props: { items: TDeviceSelectItem[] value: string onChange: (value: string) => void placeholder?: string }) => { const { items, value, onChange, placeholder } = props return ( ) } export const MicrophoneSelect = (props: { audioTrack?: IMicrophoneAudioTrack }) => { const { audioTrack } = props const [items, setItems] = React.useState([ DEFAULT_DEVICE_ITEM, ]) const [value, setValue] = React.useState("default") React.useEffect(() => { if (audioTrack) { const label = audioTrack?.getTrackLabel() setValue(label) AgoraRTC.getMicrophones().then((arr) => { setItems( arr.map((item) => ({ label: item.label, value: item.label, deviceId: item.deviceId, })), ) }) } }, [audioTrack]) const onChange = async (value: string) => { const target = items.find((item) => item.value === value) if (target) { setValue(target.value) if (audioTrack) { await audioTrack.setDevice(target.deviceId) } } } return }