mod bridge;
pub mod commands;
mod config;
pub mod defaults;
mod opener;
mod state;
mod tray;
pub use commands::CommandError;
pub use config::HostConfig;
pub use opener::TauriOpener;
pub use state::OriginState;
pub use tray::TauriTrayService;
pub use origin_notifications_tauri::TauriNotificationService;
use origin_app::Application;
use tauri::{AppHandle, Manager, Runtime, Wry};
use tokio_util::sync::CancellationToken;
pub fn builder(config: &HostConfig) -> tauri::Builder<Wry> {
let mut builder = tauri::Builder::default();
if config.single_instance {
builder = builder.plugin(tauri_plugin_single_instance::init(|app, _args, _cwd| {
focus_main_window(app);
}));
}
builder = builder
.plugin(tauri_plugin_notification::init())
.plugin(tauri_plugin_opener::init());
if config.window_state {
builder = builder.plugin(tauri_plugin_window_state::Builder::default().build());
}
builder
}
pub fn attach(app: &AppHandle, application: Application, config: &HostConfig) -> tauri::Result<()> {
let scheduler = CancellationToken::new();
let state = OriginState::new(application, config.clone(), scheduler.clone());
let engine = state.application().platform().sync.clone();
tauri::async_runtime::spawn(async move { engine.run(scheduler).await });
bridge::forward_platform_events(app, state.application());
if config.tray {
tray::install(app, config, state.application().platform().events.clone())?;
}
app.manage(state);
tracing::info!(app_id = %config.app_id, "origin host attached");
Ok(())
}
pub fn focus_main_window<R: Runtime>(app: &AppHandle<R>) {
if let Some(window) = app.get_webview_window("main") {
let _ = window.show();
let _ = window.unminimize();
let _ = window.set_focus();
}
}
#[macro_export]
macro_rules! origin_handler {
($($command:path),* $(,)?) => {
::tauri::generate_handler![
$crate::commands::origin_app_info,
$crate::commands::origin_setting_get,
$crate::commands::origin_setting_set,
$crate::commands::origin_settings_customised,
$crate::commands::origin_open_url,
$crate::commands::origin_accounts,
$crate::commands::origin_account_disconnect,
$crate::commands::origin_connectors,
$crate::commands::origin_jobs,
$crate::commands::origin_job_cancel,
$crate::commands::origin_sync_status,
$crate::commands::origin_sync_now,
$crate::commands::origin_health,
$($command),*
]
};
}