{
tooltipContainer.current = el;
}}
/>
);
};
function useDeviceIdState(
deviceId: string,
devices: OmitFunctions
[],
) {
const [deviceIdState, setDeviceIdState] = useState(deviceId);
const setDeviceState = useCallback(
(device: OmitFunctions) => {
setDeviceIdState(device.deviceId);
},
[setDeviceIdState],
);
const oldDeviceId = usePrevious(() => deviceId, true);
const oldDevices = usePrevious(() => devices, true);
useEffect(() => {
if (deviceId !== oldDeviceId) {
setDeviceIdState(deviceId);
}
if (devices !== oldDevices) {
if (!devices.find((device) => device.deviceId === deviceIdState)) {
setDeviceIdState(deviceId);
}
}
}, [oldDeviceId, oldDevices, devices, deviceIdState, deviceId]);
return [deviceIdState, setDeviceState] as const;
}
const VolumeInput: FC<{
volume: number;
minVolume?: number;
maxVolume?: number;
onChange: (volume: number) => void;
label: string;
}> = ({ volume, minVolume, maxVolume, onChange, label }) => {
return (
{label}} noBorder>
);
};
export const AudioSettingsPanel: FC = ({
availableInputDevices,
availableOutputDevices,
callVolume,
checkUserMedia,
className = null,
currentLocale,
inputDeviceDisabled = false,
inputDeviceId,
onBackButtonClick,
onSave,
outputDeviceDisabled = false,
outputDeviceId,
ringtoneVolume,
showCallVolume = false,
showRingToneVolume = false,
supportDevices,
userMedia,
}) => {
// For firefox, when input device have empty label
// trigger get-user-media to load the device info at the first time
const triggerCheckUserMedia = useRef(false);
if (!triggerCheckUserMedia.current) {
triggerCheckUserMedia.current = true;
if (userMedia && availableInputDevices[0]?.label === '') {
checkUserMedia();
}
}
const [outputDeviceIdState, setOutputDeviceState] = useDeviceIdState(
outputDeviceId,
availableOutputDevices,
);
const [inputDeviceIdState, setInputDeviceState] = useDeviceIdState(
inputDeviceId,
availableInputDevices,
);
const [isFirefox] = useState(
navigator.userAgent.indexOf('Firefox') > -1,
);
const [ringtoneVolumeState, setRingtoneVolumeState] =
useState(ringtoneVolume);
const [callVolumeState, setCallVolumeState] = useState(callVolume);
const oldRingtoneVolume = usePrevious(() => ringtoneVolume, true);
const oldCallVolume = usePrevious(() => callVolume, true);
useEffect(() => {
if (ringtoneVolume !== oldRingtoneVolume) {
setRingtoneVolumeState(ringtoneVolume);
}
if (callVolume !== oldCallVolume) {
setCallVolumeState(callVolume);
}
}, [ringtoneVolume, callVolume, oldRingtoneVolume, oldCallVolume]);
const hasChanges =
outputDeviceId !== outputDeviceIdState ||
inputDeviceId !== inputDeviceIdState ||
ringtoneVolume !== ringtoneVolumeState ||
callVolume !== callVolumeState;
const onSaveClick = useCallback(
() =>
onSave({
outputDeviceId: outputDeviceIdState,
inputDeviceId: inputDeviceIdState,
ringtoneVolume: ringtoneVolumeState,
callVolume: callVolumeState,
}),
[
onSave,
outputDeviceIdState,
inputDeviceIdState,
ringtoneVolumeState,
callVolumeState,
],
);
return (
{i18n.getString('title', currentLocale)}
{supportDevices ? (
<>
>
) : null}
{showCallVolume ? (
) : null}
{showRingToneVolume ? (
) : null}
);
};