import { getVersion } from '@tauri-apps/api/app' import { computedAsync, createGlobalState } from '@vueuse/core' import { useClients } from '~/composables/use-clients' export const useApp = createGlobalState(() => { const { clients } = useClients() const mediasoup = useMediasoup() const signaling = useSignaling() const toast = useToast() const sfx = useSfx() const ready = ref(false) const isTauri = computed(() => '__TAURI_INTERNALS__' in window) const commitSha = __COMMIT_SHA__ const version = computedAsync(() => { if (import.meta.dev) { return 'dev' } else if (isTauri.value) { return getVersion() } else { return 'web' } }, '-') const inputMuted = computed(() => { return !!mediasoup.micProducer.value?.paused }) const previousInputMuted = ref(inputMuted.value) const outputMuted = ref(false) const videoEnabled = computed(() => { return !!mediasoup.videoProducer.value }) const sharingEnabled = computed(() => { return !!mediasoup.shareProducer.value }) const somebodyStreamingVideo = computed(() => { return !!mediasoup.videoProducer.value || !!mediasoup.shareProducer.value || mediasoup.videoConsumers.value.length > 0 || mediasoup.shareConsumers.value.length > 0 }) async function muteInput() { if (inputMuted.value || !mediasoup.micProducer.value) return await mediasoup.pauseProducer(mediasoup.micProducer.value) sfx.play('/sfx/off_micr.ogg').then() toast.add({ severity: 'info', summary: 'Microphone muted', closable: false, life: 1000 }) } async function unmuteInput() { if (!inputMuted.value || !mediasoup.micProducer.value) return if (outputMuted.value) { await unmuteOutput() } await mediasoup.resumeProducer(mediasoup.micProducer.value) sfx.play('/sfx/on_micr.ogg').then() toast.add({ severity: 'info', summary: 'Microphone activated', closable: false, life: 1000 }) } async function toggleInput() { if (inputMuted.value) await unmuteInput() else await muteInput() } async function muteOutput() { if (outputMuted.value) return outputMuted.value = true previousInputMuted.value = inputMuted.value await muteInput() await signaling.socket.value?.emitWithAck('updateClient', { outputMuted: true, }) toast.add({ severity: 'info', summary: 'Sound muted', closable: false, life: 1000 }) } async function unmuteOutput() { outputMuted.value = false if (!previousInputMuted.value) await unmuteInput() await signaling.socket.value?.emitWithAck('updateClient', { outputMuted: false, }) toast.add({ severity: 'info', summary: 'Sound resumed', closable: false, life: 1000 }) } async function toggleOutput() { if (outputMuted.value) await unmuteOutput() else await muteOutput() } async function toggleVideo() { if (!mediasoup.videoProducer.value) { await mediasoup.enableVideo() await sfx.play('/sfx/on_trans.ogg', 0.03) } else { await mediasoup.disableProducer(mediasoup.videoProducer.value) await sfx.play('/sfx/off_trans.ogg', 0.03) } } async function toggleShare() { if (!mediasoup.shareProducer.value) { await mediasoup.enableShare() await sfx.play('/sfx/on_trans.ogg', 0.03) } else { await mediasoup.disableProducer(mediasoup.shareProducer.value) await sfx.play('/sfx/off_trans.ogg', 0.03) } } return { ready, clients, inputMuted, muteInput, unmuteInput, toggleInput, outputMuted, muteOutput, unmuteOutput, toggleOutput, toggleVideo, version, isTauri, commitSha, toggleShare, videoEnabled, sharingEnabled, somebodyStreamingVideo, } })