import { createContext, useContext, useMemo, type ReactNode } from "react"; export type DesktopScreenShareSource = { id: string; kind: "screen" | "window"; name: string; subtitle?: string | null; thumbnail?: string | null; }; export type DesktopScreenShareAudioOutput = { id: string; name: string; isDefault: boolean; }; export type DesktopScreenShareCapabilities = { runtime?: "electron" | "tauri"; platform: "linux" | "macos" | "windows" | "other"; showAudioOutputSelector: boolean; showAudioSwitch: boolean; hasReliableSystemAudio: boolean; }; type ElectronDesktopApi = { media?: { getScreenShareCapabilities?: () => Promise; listScreenShareSources?: () => Promise; listScreenShareAudioOutputs?: () => Promise< DesktopScreenShareAudioOutput[] >; selectScreenShareSource?: (sourceId: string) => Promise; }; call?: { setStatus?: (status: { inCall: boolean; speaking: boolean; iconDataUrl?: string; }) => Promise; }; secureStorage?: { getStatus?: () => Promise<{ available: boolean; backend: string | null }>; load?: (key: string) => Promise; save?: (key: string, value: string) => Promise; delete?: (key: string) => Promise; clear?: () => Promise; }; }; declare global { interface Window { tensaminDesktop?: ElectronDesktopApi; } } type DesktopMediaContextValue = { getScreenShareCapabilities: () => Promise; listScreenShareSources: () => Promise; listScreenShareAudioOutputs: () => Promise; }; const defaultCapabilities: DesktopScreenShareCapabilities = { runtime: undefined, platform: "other", showAudioOutputSelector: false, showAudioSwitch: false, hasReliableSystemAudio: false, }; const desktopMediaContext = createContext( undefined, ); async function listScreenShareSources(): Promise { if (window.tensaminDesktop?.media?.listScreenShareSources) { return window.tensaminDesktop.media.listScreenShareSources(); } return []; } async function listScreenShareAudioOutputs(): Promise< DesktopScreenShareAudioOutput[] > { if (window.tensaminDesktop?.media?.listScreenShareAudioOutputs) { return window.tensaminDesktop.media.listScreenShareAudioOutputs(); } return []; } async function getScreenShareCapabilities(): Promise { if (window.tensaminDesktop?.media?.getScreenShareCapabilities) { return window.tensaminDesktop.media.getScreenShareCapabilities(); } return defaultCapabilities; } export function useDesktopMedia() { const value = useContext(desktopMediaContext); if (!value) { throw new Error("useDesktopMedia must be used within the desktop provider"); } return value; } export default function DesktopMediaProvider({ children, }: { children: ReactNode; }) { const value = useMemo( () => ({ getScreenShareCapabilities, listScreenShareSources, listScreenShareAudioOutputs, }), [], ); return ( {children} ); }