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 #[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}