import { definePluginSettings } from "@api/Settings"; import { Devs } from "@utils/constants"; import definePlugin, { OptionType } from "@utils/types"; import { findByProps, findByPropsLazy, findComponentByCode } from "@webpack"; import { FluxDispatcher, Forms, Select, Slider, Text, useEffect } from "@webpack/common"; import { useState } from "@webpack/common"; import { identity } from "@utils/misc"; import { boolean } from "ts-pattern/dist/patterns"; import { Settings } from "Vencord"; import { Link } from "@components/Link"; const audioConfigModule = findByPropsLazy("getOutputVolume"); function OutputVolumeComponent() { const [outputVolume, setOutputVolume] = useState(audioConfigModule.getOutputVolume()); useEffect(() => { const listener = () => setOutputVolume(audioConfigModule.getOutputVolume()); FluxDispatcher.subscribe("AUDIO_SET_OUTPUT_VOLUME", listener); }); return ( <> {Settings.plugins.VCPanelSettings.showOutputVolumeHeader && Output volume - {Math.floor(outputVolume)}%} { FluxDispatcher.dispatch({ type: "AUDIO_SET_OUTPUT_VOLUME", volume }); }} /> ); } function InputVolumeComponent() { const [inputVolume, setInputVolume] = useState(audioConfigModule.getInputVolume()); useEffect(() => { const listener = () => setInputVolume(audioConfigModule.getInputVolume()); FluxDispatcher.subscribe("AUDIO_SET_INPUT_VOLUME", listener); }); return ( <> {Settings.plugins.VCPanelSettings.showInputVolumeHeader && Input volume - {Math.floor(inputVolume)}%} { FluxDispatcher.dispatch({ type: "AUDIO_SET_INPUT_VOLUME", volume }); }} /> ); } function OutputDeviceComponent() { const [outputDevice, setOutputDevice] = useState(audioConfigModule.getOutputDeviceId()); useEffect(() => { const listener = () => setOutputDevice(audioConfigModule.getOutputDeviceId()); FluxDispatcher.subscribe("AUDIO_SET_OUTPUT_DEVICE", listener); }); return ( <> {Settings.plugins.VCPanelSettings.showOutputDeviceHeader && Output device} ); } function InputDeviceComponent() { const [inputDevice, setInputDevice] = useState(audioConfigModule.getInputDeviceId()); useEffect(() => { const listener = () => setInputDevice(audioConfigModule.getInputDeviceId()); FluxDispatcher.subscribe("AUDIO_SET_INPUT_DEVICE", listener); }); return (
{Settings.plugins.VCPanelSettings.showInputDeviceHeader && Input device}
); } function VoiceSettings() { return
{Settings.plugins.VCPanelSettings.outputVolume && } {Settings.plugins.VCPanelSettings.inputVolume && } {Settings.plugins.VCPanelSettings.outputDevice && } {Settings.plugins.VCPanelSettings.inputDevice && }
; } export default definePlugin({ name: "VCPanelSettings", description: "Control voice settings right from the voice panel", authors: [Devs.nin0dev], settings: definePluginSettings({ showOutputVolumeHeader: { type: OptionType.BOOLEAN, default: true, description: "Show header above output volume slider" }, outputVolume: { type: OptionType.BOOLEAN, default: true, description: "Show an output volume slider" }, showInputVolumeHeader: { type: OptionType.BOOLEAN, default: true, description: "Show header above input volume slider" }, inputVolume: { type: OptionType.BOOLEAN, default: true, description: "Show an input volume slider" }, showOutputDeviceHeader: { type: OptionType.BOOLEAN, default: false, description: "Show header above output device slider" }, outputDevice: { type: OptionType.BOOLEAN, default: true, description: "Show an output device selector" }, showInputDeviceHeader: { type: OptionType.BOOLEAN, default: false, description: "Show header above input device slider" }, inputDevice: { type: OptionType.BOOLEAN, default: true, description: "Show an input device selector" } }), renderVoiceSettings() { return ; }, patches: [ { find: "this.renderChannelButtons()", replacement: { match: /this.renderChannelButtons\(\)/, replace: "this.renderChannelButtons(), $self.renderVoiceSettings()" } } ] });