// ===================================================================== // Installeur intégré — côté front. // // Le .exe distribué EST l'application. Lancé depuis ailleurs que son // dossier d'installation, il affiche son propre écran d'installation // (src/pages/Installer.tsx) au lieu de démarrer l'app. // // Voir src-tauri/src/installer.rs pour la partie système. // ===================================================================== import { isDesktop } from './updater' export interface InstallerStatus { running_installed: boolean already_installed: boolean install_dir: string version: string product_name: string } export type StartupMode = 'installer' | 'app' async function invoke(cmd: string, args?: Record): Promise { const { invoke } = await import('@tauri-apps/api/core') return invoke(cmd, args) } /** * Décide, au démarrage, entre l'écran d'installation et l'application. * * En cas de doute on démarre l'APPLICATION : mieux vaut lancer l'app depuis * un dossier temporaire que bloquer quelqu'un sur un installeur inutile. */ export async function resolveStartupMode(): Promise<{ mode: StartupMode status: InstallerStatus | null }> { if (!isDesktop()) return { mode: 'app', status: null } try { const status = await invoke('installer_status') return { mode: status.running_installed ? 'app' : 'installer', status } } catch (e) { console.warn('Statut d’installation indisponible :', e) return { mode: 'app', status: null } } } /** Copie l'application, crée les raccourcis, l'enregistre auprès de Windows. */ export function install(desktopShortcut: boolean): Promise { return invoke('installer_install', { desktopShortcut }) } /** Démarre la version installée et ferme le processus courant. */ export function launchInstalled(): Promise { return invoke('installer_launch') } // --------------------------------------------------------------------- // Fenêtre // // Rien ici ne redimensionne ni n'affiche la fenêtre : elle est créée // directement à la bonne forme côté Rust (src-tauri/src/lib.rs). Ne // restent que les commandes de la barre de titre maison de l'installeur, // puisque la fenêtre y est sans décoration Windows. // --------------------------------------------------------------------- export async function closeWindow(): Promise { if (!isDesktop()) return const { getCurrentWindow } = await import('@tauri-apps/api/window') await getCurrentWindow().close() } export async function minimizeWindow(): Promise { if (!isDesktop()) return const { getCurrentWindow } = await import('@tauri-apps/api/window') await getCurrentWindow().minimize() } /** Permet de déplacer la fenêtre sans barre de titre, en tirant sur l'en-tête. */ export async function startDragging(): Promise { if (!isDesktop()) return try { const { getCurrentWindow } = await import('@tauri-apps/api/window') await getCurrentWindow().startDragging() } catch { /* sans conséquence */ } }