75 lines
2.2 KiB
TypeScript
75 lines
2.2 KiB
TypeScript
import chadApi from '#shared/chad-api'
|
|
import { createGlobalState, useDevicesList, useLocalStorage, watchDebounced } from '@vueuse/core'
|
|
|
|
export interface SyncedPreferences {
|
|
toggleInputHotkey: string
|
|
toggleOutputHotkey: string
|
|
volumes: Record<Client['id'], number>
|
|
}
|
|
|
|
export const usePreferences = createGlobalState(() => {
|
|
const synced = ref(false)
|
|
|
|
const inputDeviceId = useLocalStorage<MediaDeviceInfo['deviceId']>('INPUT_DEVICE_ID', 'default')
|
|
const outputDeviceId = useLocalStorage<MediaDeviceInfo['deviceId']>('OUTPUT_DEVICE_ID', 'default')
|
|
|
|
const autoGainControl = useLocalStorage('AUTO_GAIN_CONTROL', false)
|
|
const noiseSuppression = useLocalStorage('NOISE_SUPPRESSION', true)
|
|
const echoCancellation = useLocalStorage('ECHO_CANCELLATION', true)
|
|
|
|
const toggleInputHotkey = ref<SyncedPreferences['toggleInputHotkey']>('')
|
|
const toggleOutputHotkey = ref<SyncedPreferences['toggleOutputHotkey']>('')
|
|
|
|
const {
|
|
ensurePermissions,
|
|
permissionGranted,
|
|
videoInputs,
|
|
audioInputs,
|
|
audioOutputs,
|
|
} = useDevicesList()
|
|
|
|
const inputDeviceExist = computed(() => {
|
|
return audioInputs.value.some(device => device.deviceId === inputDeviceId.value)
|
|
})
|
|
|
|
const outputDeviceExist = computed(() => {
|
|
return audioOutputs.value.some(device => device.deviceId === outputDeviceId.value)
|
|
})
|
|
|
|
watchDebounced(
|
|
[toggleInputHotkey, toggleOutputHotkey],
|
|
async ([toggleInputHotkey, toggleOutputHotkey]) => {
|
|
try {
|
|
await chadApi(
|
|
'/preferences',
|
|
{
|
|
method: 'PATCH',
|
|
body: {
|
|
toggleInputHotkey,
|
|
toggleOutputHotkey,
|
|
},
|
|
},
|
|
)
|
|
}
|
|
catch {}
|
|
},
|
|
{ debounce: 1000 },
|
|
)
|
|
|
|
return {
|
|
synced,
|
|
inputDeviceId,
|
|
outputDeviceId,
|
|
autoGainControl,
|
|
noiseSuppression,
|
|
echoCancellation,
|
|
toggleInputHotkey,
|
|
toggleOutputHotkey,
|
|
inputDeviceExist,
|
|
outputDeviceExist,
|
|
videoInputs: computed(() => JSON.parse(JSON.stringify(videoInputs.value))),
|
|
audioInputs: computed(() => JSON.parse(JSON.stringify(audioInputs.value))),
|
|
audioOutputs: computed(() => JSON.parse(JSON.stringify(audioOutputs.value))),
|
|
}
|
|
})
|