import { useEffect } from 'react'; import { useAtomValue } from 'jotai'; import { callEmbedAtom } from '../state/callEmbed'; import { useCallControlState } from '../plugins/call'; import { invokeTauri, useTauriEvent } from './useTauri'; /** * P5-43 — expose the active call to the Windows System Media Transport Controls * (the volume-flyout / media overlay). Mirrors the call-embed atom (undefined = * no active call) and the current mic state onto the native * `set_smtc_call_state` command, and translates SMTC button presses back into * call actions: * - Play/Pause (`smtc-action` → `mute`) toggles the microphone. * - Stop (`smtc-action` → `end`) hangs up the call. * No-op in the browser (the native command and events only fire under Tauri). */ type SmtcAction = { action: 'mute' | 'end' }; export function useTauriSmtc(): void { const callEmbed = useAtomValue(callEmbedAtom); // `microphone` reflects mic-enabled; muted is its inverse while in a call. const { microphone } = useCallControlState(callEmbed?.control); const active = callEmbed !== undefined; const muted = active && !microphone; useEffect(() => { invokeTauri('set_smtc_call_state', { active, muted }); }, [active, muted]); useTauriEvent('smtc-action', ({ action }) => { if (!callEmbed) return; if (action === 'mute') { callEmbed.control.toggleMicrophone().catch(() => undefined); } else if (action === 'end') { callEmbed.hangup().catch(() => undefined); } }); }