import { createGlobalState } from '@vueuse/core' import { computed, ref, watch } from 'vue' import { useMediasoup } from './use-mediasoup' import { useProducers } from './use-producers' export const useMediaControls = createGlobalState(() => { const { producers } = useMediasoup() const { enableMic, enableVideo, disableVideo, enableShare, disableShare, pauseProducer, resumeProducer } = useProducers() const micProducer = computed(() => producers.values.value.find(p => p.appData.source === 'mic')) const cameraProducer = computed(() => producers.values.value.find(p => p.appData.source === 'camera')) const shareProducer = computed(() => producers.values.value.find(p => p.appData.source === 'share')) const isSoundEnabled = ref(true) const isMicEnabled = computed(() => isSoundEnabled.value && !!micProducer.value && !micProducer.value.paused) const isCameraEnabled = computed(() => !!cameraProducer.value && !cameraProducer.value.paused) const isShareEnabled = computed(() => !!shareProducer.value) watch(isSoundEnabled, async (enabled) => { if (!enabled) { if (micProducer.value && !micProducer.value.paused) await pauseProducer(micProducer.value.id) } else { if (micProducer.value?.paused) await resumeProducer(micProducer.value.id) } }) async function toggleMic() { if (!isSoundEnabled.value) return if (isMicEnabled.value) { await pauseProducer(micProducer.value!.id) } else if (micProducer.value?.paused) { await resumeProducer(micProducer.value.id) } else { await enableMic() } } function toggleSound() { isSoundEnabled.value = !isSoundEnabled.value } async function toggleCamera() { if (isCameraEnabled.value) await disableVideo() else await enableVideo() } async function toggleShare() { if (isShareEnabled.value) await disableShare() else await enableShare() } return { isMicEnabled, isSoundEnabled, isCameraEnabled, isShareEnabled, toggleMic, toggleSound, toggleCamera, toggleShare, } })