Files
cinny/src/app/state/hooks/callPreferences.ts
T
root a23851d4a6 feat(call): PTT, deafen label, camera default off, screenshare confirm, noise suppression setting
- Push to Talk: keydown/keyup binds mic to configurable key (default Space)
  with visual PTT indicator and key-binding UI in Settings > General > Calls
- Camera always defaults OFF on join; cameraOnJoin setting for explicit opt-in
- Deafen button tooltip corrected to Deafen/Undeafen instead of Turn Off/On Sound
- Screenshare confirmation dialog before broadcasting to call participants
- Noise suppression toggle wired from settings through CallEmbed URL params
- CallControl.setMicrophone() public method for programmatic mic control
- Calls settings section added to General settings page

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-14 11:14:04 -04:00

66 lines
1.7 KiB
TypeScript

import { createContext, useCallback, useContext } from 'react';
import { useAtom } from 'jotai';
import { CallPreferences, CallPreferencesAtom } from '../callPreferences';
import { useSetting } from './settings';
import { settingsAtom } from '../settings';
const CallPreferencesAtomContext = createContext<CallPreferencesAtom | null>(null);
export const CallPreferencesProvider = CallPreferencesAtomContext.Provider;
export const useCallPreferencesAtom = (): CallPreferencesAtom => {
const atom = useContext(CallPreferencesAtomContext);
if (!atom) {
throw new Error('CallPreferencesAtom not provided!');
}
return atom;
};
export const useCallPreferences = (): CallPreferences & {
toggleMicrophone: () => void;
toggleVideo: () => void;
toggleSound: () => void;
} => {
const callPrefAtom = useCallPreferencesAtom();
const [pref, setPref] = useAtom(callPrefAtom);
const [cameraOnJoin] = useSetting(settingsAtom, 'cameraOnJoin');
const toggleMicrophone = useCallback(() => {
const microphone = !pref.microphone;
setPref({
microphone,
video: pref.video,
sound: !pref.sound && microphone ? true : pref.sound,
});
}, [setPref, pref]);
const toggleVideo = useCallback(() => {
const video = !pref.video;
setPref({
microphone: pref.microphone,
video,
sound: pref.sound,
});
}, [setPref, pref]);
const toggleSound = useCallback(() => {
const sound = !pref.sound;
setPref({
microphone: !sound ? false : pref.microphone,
video: pref.video,
sound,
});
}, [setPref, pref]);
return {
...pref,
video: cameraOnJoin ? pref.video : false,
toggleMicrophone,
toggleVideo,
toggleSound,
};
};