import React, { useContext, useEffect, useState, useCallback } from 'react'; import Channels, { DEFAULT_APP_PRESET, Dimensions } from '../electron/constants'; interface IElectronProvider { // pass handlers and current dimensions? desktopMode: DesktopMode; handleToggleDesktopMode?: () => void; isWindowFocused: boolean; } type DesktopMode = 'overlayOnly' | 'mainApp'; const ElectronContext = React.createContext({ desktopMode: 'mainApp', isWindowFocused: false, }); export function ElectronProvider({ children }: { children: React.ReactNode }) { const [desktopMode, setDesktopMode] = useState('mainApp'); const [isWindowFocused, setIsWindowFocused] = useState(false); // handle all window resizing logic useEffect(() => { // add dimensions if it's not overlay only mode let finalDimensions: Dimensions = { height: 0, width: 0 }; let finalPosition: 'center' | 'topRight'; let stayOnTop: boolean; if (desktopMode === 'mainApp') { stayOnTop = false; finalDimensions = DEFAULT_APP_PRESET; // finalPosition = 'center'; } else if (desktopMode === 'overlayOnly') { stayOnTop = true; finalDimensions = { height: 273, width: 350, }; finalPosition = 'topRight'; } // send the final dimensions to main process window.electronAPI.window.resizeWindow({ setAlwaysOnTop: stayOnTop, dimensions: { height: finalDimensions.height, width: finalDimensions.width, }, setPosition: finalPosition, addDimensions: false, }); }, [desktopMode]); // handle window focus and unfocus useEffect(() => { const blurListener = window.electronAPI.on(Channels.ON_WINDOW_BLUR, () => { console.log( 'window blurring now, should be always on top and then ill tell main process to change dimensions', ); setIsWindowFocused(false); // TODO: testing mode... uncomment both instructions below // setDesktopMode('overlayOnly'); }); const focusListener = window.electronAPI.on(Channels.ON_WINDOW_FOCUS, () => { console.log('window focusing now'); setIsWindowFocused(true); }); return () => { // window.removeEventListener(Channels.ON_WINDOW_BLUR, blurListener); blurListener(); focusListener(); }; }, [setDesktopMode, setIsWindowFocused]); const handleToggleDesktopMode = useCallback(() => { setDesktopMode((prevMode) => (prevMode === 'mainApp' ? 'overlayOnly' : 'mainApp')); }, [setDesktopMode]); return ( {children} ); } export default function useElectron() { return useContext(ElectronContext); }