let cachedPlatform: string | null = null; /** * Gets the current platform from Electron */ const getPlatform = async (): Promise => { if (cachedPlatform) return cachedPlatform; try { const platform = await window.electronAPI.getPlatform(); cachedPlatform = platform; return platform; } catch (error) { console.warn('Failed to get platform from Electron, falling back to navigator:', error); // Fallback for development/testing let fallbackPlatform = 'win32'; if (typeof navigator !== 'undefined' && /Mac|iPhone|iPad|iPod/.test(navigator.platform)) { fallbackPlatform = 'darwin'; } cachedPlatform = fallbackPlatform; return fallbackPlatform; } }; /** * Detects if the current platform is macOS */ export const isMac = async (): Promise => { const platform = await getPlatform(); return platform === 'darwin'; }; /** * Gets the modifier key symbol based on the platform */ export const getModifierKey = async (): Promise => { return (await isMac()) ? '⌘' : 'Ctrl'; }; /** * Gets the shift key symbol based on the platform */ export const getShiftKey = async (): Promise => { return (await isMac()) ? '⇧' : 'Shift'; }; /** * Formats a keyboard shortcut for display based on the platform * @param keys Array of key combinations (e.g., ['mod', 'D'] or ['shift', 'mod', 'Scroll']) */ export const formatShortcut = async (keys: string[]): Promise => { const isMacPlatform = await isMac(); return keys .map(key => { if (key.toLowerCase() === 'mod') return isMacPlatform ? '⌘' : 'Ctrl'; if (key.toLowerCase() === 'shift') return isMacPlatform ? '⇧' : 'Shift'; return key; }) .join(' + '); };