1mod bridge;
25pub mod commands;
26mod config;
27pub mod defaults;
28mod opener;
29mod state;
30mod tray;
31
32pub use commands::CommandError;
33pub use config::HostConfig;
34pub use opener::TauriOpener;
35pub use state::OriginState;
36pub use tray::TauriTrayService;
37
38pub use origin_notifications_tauri::TauriNotificationService;
39
40use origin_app::Application;
41use tauri::{AppHandle, Manager, Runtime, Wry};
42use tokio_util::sync::CancellationToken;
43
44pub fn builder(config: &HostConfig) -> tauri::Builder<Wry> {
49 let mut builder = tauri::Builder::default();
50
51 if config.single_instance {
52 builder = builder.plugin(tauri_plugin_single_instance::init(|app, _args, _cwd| {
53 focus_main_window(app);
54 }));
55 }
56
57 builder = builder
58 .plugin(tauri_plugin_notification::init())
59 .plugin(tauri_plugin_opener::init());
60
61 if config.window_state {
62 builder = builder.plugin(tauri_plugin_window_state::Builder::default().build());
63 }
64
65 builder
66}
67
68pub fn attach(app: &AppHandle, application: Application, config: &HostConfig) -> tauri::Result<()> {
72 let scheduler = CancellationToken::new();
73 let state = OriginState::new(application, config.clone(), scheduler.clone());
74
75 let engine = state.application().platform().sync.clone();
78 tauri::async_runtime::spawn(async move { engine.run(scheduler).await });
79
80 bridge::forward_platform_events(app, state.application());
81
82 if config.tray {
83 tray::install(app, config, state.application().platform().events.clone())?;
84 }
85
86 app.manage(state);
87 tracing::info!(app_id = %config.app_id, "origin host attached");
88 Ok(())
89}
90
91pub fn focus_main_window<R: Runtime>(app: &AppHandle<R>) {
94 if let Some(window) = app.get_webview_window("main") {
95 let _ = window.show();
96 let _ = window.unminimize();
97 let _ = window.set_focus();
98 }
99}
100
101#[macro_export]
106macro_rules! origin_handler {
107 ($($command:path),* $(,)?) => {
108 ::tauri::generate_handler![
109 $crate::commands::origin_app_info,
110 $crate::commands::origin_setting_get,
111 $crate::commands::origin_setting_set,
112 $crate::commands::origin_settings_customised,
113 $crate::commands::origin_open_url,
114 $crate::commands::origin_accounts,
115 $crate::commands::origin_account_disconnect,
116 $crate::commands::origin_connectors,
117 $crate::commands::origin_jobs,
118 $crate::commands::origin_job_cancel,
119 $crate::commands::origin_sync_status,
120 $crate::commands::origin_sync_now,
121 $crate::commands::origin_health,
122 $($command),*
123 ]
124 };
125}