Skip to main content

app_lib/
lib.rs

1pub mod commands;
2
3use std::sync::atomic::AtomicBool;
4use std::sync::{Arc, Mutex};
5use tauri::Manager;
6
7#[cfg_attr(mobile, tauri::mobile_entry_point)]
8pub fn run() {
9    tauri::Builder::default()
10        .plugin(tauri_plugin_dialog::init())
11        .plugin(tauri_plugin_process::init())
12        .plugin(tauri_plugin_opener::init())
13        .manage(commands::DiscoveryState {
14            stop_flag: Mutex::new(Arc::new(AtomicBool::new(false))),
15            handle: Mutex::new(None),
16            peers: Arc::new(Mutex::new(Vec::new())),
17        })
18        .manage(commands::TransferState {
19            active: Arc::new(Mutex::new(std::collections::HashMap::new())),
20            decisions: Arc::new(toole_core::transfer::DecisionBoard::new()),
21        })
22        .invoke_handler(tauri::generate_handler![
23            commands::start_discovery,
24            commands::stop_discovery,
25            commands::add_peer,
26            commands::remove_peer,
27            commands::check_firewall,
28            commands::get_device_id,
29            commands::get_peers,
30            commands::send_files,
31            commands::cancel_transfer,
32            commands::respond_transfer,
33            commands::read_clipboard,
34            commands::get_file_infos,
35        ])
36        .setup(|app| {
37            // j'enregistre le plugin de mise à jour auto (desktop only) :
38            // il interroge latest.json sur GitHub et installe les updates signées
39            #[cfg(desktop)]
40            let _ = app
41                .handle()
42                .plugin(tauri_plugin_updater::Builder::new().build());
43
44            let window = match app.get_webview_window("main") {
45                Some(w) => w,
46                None => {
47                    eprintln!("Main window not found; aborting startup");
48                    return Ok(());
49                }
50            };
51            let stop = Arc::new(AtomicBool::new(false));
52
53            let dest_dir = dirs::download_dir()
54                .unwrap_or_else(std::env::temp_dir)
55                .join("Toolé");
56            let _ = std::fs::create_dir_all(&dest_dir);
57
58            let peers = Arc::new(Mutex::new(Vec::new()));
59            let ui: Arc<dyn toole_core::UI> = Arc::new(commands::AppUI { peers, window });
60
61            let transfer_state: tauri::State<'_, commands::TransferState> = app.state();
62            let decisions = transfer_state.decisions.clone();
63            let registry: Arc<dyn toole_core::TransferRegistry> =
64                Arc::new(commands::TransferRegistryHandle {
65                    active: transfer_state.active.clone(),
66                });
67
68            tauri::async_runtime::spawn(async move {
69                if let Err(e) = toole_core::receiver::start_receiver(
70                    ui,
71                    dest_dir,
72                    stop,
73                    decisions,
74                    registry,
75                )
76                .await
77                {
78                    eprintln!("Receiver error: {e}");
79                }
80            });
81
82            Ok(())
83        })
84        .run(tauri::generate_context!())
85        .unwrap_or_else(|e| { eprintln!("error while running tauri application: {e}"); });
86}