BlueSky & more on desktop
lazurite.stormlightlabs.org/
tauri
rust
typescript
bluesky
appview
atproto
solid
1mod actors;
2mod auth;
3mod columns;
4mod commands;
5mod constellation;
6mod conversations;
7mod db;
8mod diagnostics;
9mod drafts;
10mod error;
11mod explorer;
12mod feed;
13mod media;
14mod moderation;
15mod notifications;
16mod search;
17mod settings;
18mod state;
19mod tray;
20
21use commands as cmd;
22use db::initialize_database;
23use state::AppState;
24use tauri::Manager;
25use tauri_plugin_deep_link::DeepLinkExt;
26use tauri_plugin_log::log;
27
28#[cfg_attr(mobile, tauri::mobile_entry_point)]
29pub fn run() {
30 tauri::Builder::default()
31 .setup(|app| {
32 let db_pool =
33 initialize_database(app.handle()).expect("database initialization should succeed during startup");
34 let app_state = tauri::async_runtime::block_on(AppState::bootstrap(db_pool))
35 .expect("application state should be bootstrapped from database");
36
37 app.manage(app_state);
38
39 AppState::spawn_token_refresh_task(app.handle().clone());
40 notifications::spawn_notification_poll_task(app.handle().clone());
41 search::spawn_search_sync_task(app.handle().clone());
42
43 let app_handle = app.handle().clone();
44 app.deep_link().on_open_url(move |event| {
45 for url in event.urls() {
46 let raw = url.to_string();
47 let handle = app_handle.clone();
48 tauri::async_runtime::spawn(async move {
49 if let Err(error) = explorer::emit_explorer_navigation(&handle, &raw).await {
50 log::error!("failed to resolve deep-link explorer target for {raw}: {error}");
51 }
52 });
53 }
54 });
55
56 if let Some(urls) = app.deep_link().get_current()? {
57 for url in urls {
58 let raw = url.to_string();
59 tauri::async_runtime::block_on(explorer::emit_explorer_navigation(app.handle(), &raw))?;
60 }
61 }
62
63 #[cfg(not(any(target_os = "android", target_os = "ios")))]
64 {
65 tray::setup_tray(app.handle())?;
66 tray::setup_global_shortcut(app.handle())?;
67 }
68
69 Ok(())
70 })
71 .plugin(tauri_plugin_notification::init())
72 .plugin(
73 tauri_plugin_log::Builder::new()
74 .level(tauri_plugin_log::log::LevelFilter::Info)
75 .build(),
76 )
77 .plugin(tauri_plugin_deep_link::init())
78 .plugin(tauri_plugin_dialog::init())
79 .plugin(tauri_plugin_fs::init())
80 .plugin(tauri_plugin_opener::init())
81 .plugin(tauri_plugin_global_shortcut::Builder::new().build())
82 .invoke_handler(tauri::generate_handler![
83 cmd::get_app_bootstrap,
84 cmd::list_accounts,
85 cmd::login,
86 cmd::logout,
87 cmd::switch_account,
88 cmd::set_active_account,
89 cmd::search_login_suggestions,
90 cmd::get_preferences,
91 cmd::get_profile,
92 cmd::get_feed_generators,
93 cmd::get_timeline,
94 cmd::get_feed,
95 cmd::get_list_feed,
96 cmd::get_post_thread,
97 cmd::get_author_feed,
98 cmd::get_actor_likes,
99 cmd::create_post,
100 cmd::like_post,
101 cmd::unlike_post,
102 cmd::repost,
103 cmd::unrepost,
104 cmd::bookmark_post,
105 cmd::remove_bookmark,
106 cmd::follow_actor,
107 cmd::block_actor,
108 cmd::unfollow_actor,
109 cmd::get_followers,
110 cmd::get_follows,
111 cmd::audit_follows,
112 cmd::batch_unfollow,
113 cmd::update_saved_feeds,
114 cmd::update_feed_view_pref,
115 cmd::list_notifications,
116 cmd::update_seen,
117 cmd::get_unread_count,
118 cmd::explorer::resolve_input,
119 cmd::explorer::describe_server,
120 cmd::explorer::describe_repo,
121 cmd::explorer::list_records,
122 cmd::explorer::get_record,
123 cmd::explorer::export_repo_car,
124 cmd::explorer::fetch_blob_to_temp_file,
125 cmd::explorer::delete_blob_temp_file,
126 cmd::explorer::query_labels,
127 cmd::explorer::get_lexicon_favicons,
128 cmd::explorer::clear_lexicon_favicon_cache,
129 cmd::search::search_posts_network,
130 cmd::search::search_posts,
131 cmd::search::search_actors,
132 cmd::search::search_starter_packs,
133 cmd::search::sync_posts,
134 cmd::search::get_sync_status,
135 cmd::search::list_saved_posts,
136 cmd::search::embed_pending_posts,
137 cmd::search::reindex_embeddings,
138 cmd::search::set_embeddings_enabled,
139 cmd::search::set_embeddings_preflight_seen,
140 cmd::search::get_embeddings_enabled,
141 cmd::search::get_embeddings_config,
142 cmd::search::prepare_embeddings_model,
143 cmd::settings::get_settings,
144 cmd::settings::get_constellation_url,
145 cmd::settings::update_setting,
146 cmd::settings::set_constellation_url,
147 cmd::settings::get_cache_size,
148 cmd::settings::clear_cache,
149 cmd::settings::export_data,
150 cmd::settings::reset_app,
151 cmd::settings::get_log_entries,
152 cmd::media::get_download_directory,
153 cmd::media::set_download_directory,
154 cmd::media::download_image,
155 cmd::media::download_video,
156 cmd::diagnostics::get_account_lists,
157 cmd::diagnostics::get_account_labels,
158 cmd::diagnostics::get_account_blocked_by,
159 cmd::diagnostics::get_account_blocking,
160 cmd::diagnostics::get_account_starter_packs,
161 cmd::diagnostics::get_record_backlinks,
162 cmd::columns::get_columns,
163 cmd::columns::add_column,
164 cmd::columns::remove_column,
165 cmd::columns::reorder_columns,
166 cmd::columns::update_column,
167 cmd::list_convos,
168 cmd::get_convo_for_members,
169 cmd::get_messages,
170 cmd::send_message,
171 cmd::update_read,
172 cmd::drafts::list_drafts,
173 cmd::drafts::get_draft,
174 cmd::drafts::save_draft,
175 cmd::drafts::delete_draft,
176 cmd::drafts::submit_draft,
177 cmd::moderation::get_moderation_prefs,
178 cmd::moderation::set_adult_content_enabled,
179 cmd::moderation::set_label_preference,
180 cmd::moderation::subscribe_labeler,
181 cmd::moderation::unsubscribe_labeler,
182 cmd::moderation::moderate_content,
183 cmd::moderation::get_labeler_policy_definitions,
184 cmd::moderation::create_report,
185 cmd::moderation::get_distribution_channel
186 ])
187 .run(tauri::generate_context!())
188 .expect("error while running tauri application");
189}