89 lines
3.1 KiB
TypeScript
89 lines
3.1 KiB
TypeScript
// =====================================================================
|
||
// 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<T>(cmd: string, args?: Record<string, unknown>): Promise<T> {
|
||
const { invoke } = await import('@tauri-apps/api/core')
|
||
return invoke<T>(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<InstallerStatus>('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<string> {
|
||
return invoke<string>('installer_install', { desktopShortcut })
|
||
}
|
||
|
||
/** Démarre la version installée et ferme le processus courant. */
|
||
export function launchInstalled(): Promise<void> {
|
||
return invoke<void>('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<void> {
|
||
if (!isDesktop()) return
|
||
const { getCurrentWindow } = await import('@tauri-apps/api/window')
|
||
await getCurrentWindow().close()
|
||
}
|
||
|
||
export async function minimizeWindow(): Promise<void> {
|
||
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<void> {
|
||
if (!isDesktop()) return
|
||
try {
|
||
const { getCurrentWindow } = await import('@tauri-apps/api/window')
|
||
await getCurrentWindow().startDragging()
|
||
} catch {
|
||
/* sans conséquence */
|
||
}
|
||
}
|