fix: muse-action board handler emits board://image_added for React canvas bridge
Browse files- src-tauri/src/lib.rs +48 -5
src-tauri/src/lib.rs
CHANGED
|
@@ -30,13 +30,56 @@ pub fn run() {
|
|
| 30 |
.register_uri_scheme_protocol("muse-action", |ctx, request| {
|
| 31 |
let uri = request.uri().to_string();
|
| 32 |
let app = ctx.app_handle().clone();
|
| 33 |
-
let action = uri.split("://").nth(1).unwrap_or("").split('?').next().unwrap_or("").to_string();
|
| 34 |
let query = uri.split('?').nth(1).unwrap_or("");
|
| 35 |
let params: std::collections::HashMap<String, String> = query.split('&').filter_map(|pair| { let (k, v) = pair.split_once('=')?; Some((percent_decode(k), percent_decode(v))) }).collect();
|
| 36 |
match action.as_str() {
|
| 37 |
-
"library" => {
|
| 38 |
-
|
| 39 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 40 |
_ => {}
|
| 41 |
}
|
| 42 |
tauri::http::Response::builder().status(200).header("Access-Control-Allow-Origin", "*").body(Vec::new()).unwrap()
|
|
@@ -53,7 +96,7 @@ pub fn run() {
|
|
| 53 |
refs_format::refs_export, refs_format::refs_import,
|
| 54 |
projects::projects_list, projects::projects_get_active_id, projects::project_create, projects::project_save, projects::project_load, projects::project_delete, projects::project_rename,
|
| 55 |
browser::capture::browser_capture_viewport, browser::capture::browser_capture_clip, browser::capture::browser_capture_full_page,
|
| 56 |
-
browser::autofill::
|
| 57 |
browser::commands::browser_init, browser::commands::browser_set_visible, browser::commands::browser_hide_all, browser::commands::tab_create, browser::commands::tab_activate, browser::commands::tab_close, browser::commands::tab_restore, browser::commands::tab_navigate, browser::commands::tab_reload, browser::commands::tab_back, browser::commands::tab_forward, browser::commands::tab_zoom, browser::commands::tab_resize, browser::commands::tab_get_all, browser::commands::tab_pin, browser::commands::tab_find, browser::commands::tab_find_clear,
|
| 58 |
browser::context_menu::browser_context_menu,
|
| 59 |
adblock::commands::shield_get_report, adblock::commands::shield_check_url, adblock::commands::shield_cosmetic_css, adblock::commands::shield_toggle_domain, adblock::commands::shield_is_allowed, adblock::commands::shield_update_lists, adblock::commands::shield_add_user_rule, adblock::commands::shield_list_subscriptions,
|
|
|
|
| 30 |
.register_uri_scheme_protocol("muse-action", |ctx, request| {
|
| 31 |
let uri = request.uri().to_string();
|
| 32 |
let app = ctx.app_handle().clone();
|
| 33 |
+
let action = uri.split("://").nth(1).unwrap_or("").split('?').next().unwrap_or("").trim_end_matches('/').to_string();
|
| 34 |
let query = uri.split('?').nth(1).unwrap_or("");
|
| 35 |
let params: std::collections::HashMap<String, String> = query.split('&').filter_map(|pair| { let (k, v) = pair.split_once('=')?; Some((percent_decode(k), percent_decode(v))) }).collect();
|
| 36 |
match action.as_str() {
|
| 37 |
+
"library" => {
|
| 38 |
+
let url = params.get("url").cloned().unwrap_or_default();
|
| 39 |
+
if !url.is_empty() {
|
| 40 |
+
let source = params.get("source").cloned();
|
| 41 |
+
let title = params.get("title").cloned();
|
| 42 |
+
tauri::async_runtime::spawn(async move {
|
| 43 |
+
let _ = crate::library::library_add_item(app, url, source, title).await;
|
| 44 |
+
});
|
| 45 |
+
}
|
| 46 |
+
}
|
| 47 |
+
"board" => {
|
| 48 |
+
let url = params.get("url").cloned().unwrap_or_default();
|
| 49 |
+
if !url.is_empty() {
|
| 50 |
+
let source = params.get("source").cloned();
|
| 51 |
+
let title = params.get("title").cloned();
|
| 52 |
+
tauri::async_runtime::spawn(async move {
|
| 53 |
+
match crate::library::library_add_item(app.clone(), url.clone(), source.clone(), title.clone()).await {
|
| 54 |
+
Ok(item) => {
|
| 55 |
+
let _ = crate::board::board_add_image(app.clone(), Some(item.id.clone()), item.data_url.clone(), 120.0, 120.0, 300.0, 200.0);
|
| 56 |
+
// CRITICAL: bridge native child-webview capture into the active React canvas state.
|
| 57 |
+
let _ = app.emit("board://image_added", serde_json::json!({
|
| 58 |
+
"libraryId": item.id,
|
| 59 |
+
"dataUrl": item.data_url,
|
| 60 |
+
"url": item.url,
|
| 61 |
+
"sourceUrl": item.source_url,
|
| 62 |
+
"title": item.title,
|
| 63 |
+
"width": item.width,
|
| 64 |
+
"height": item.height,
|
| 65 |
+
"colors": item.colors
|
| 66 |
+
}));
|
| 67 |
+
}
|
| 68 |
+
Err(e) => {
|
| 69 |
+
let _ = app.emit("board://image_add_failed", serde_json::json!({ "url": url, "error": e }));
|
| 70 |
+
}
|
| 71 |
+
}
|
| 72 |
+
});
|
| 73 |
+
}
|
| 74 |
+
}
|
| 75 |
+
"vault" => {
|
| 76 |
+
let va = params.get("action").cloned().unwrap_or_default();
|
| 77 |
+
match va.as_str() {
|
| 78 |
+
"save-prompt" => { let _ = app.emit("vault://save-prompt", serde_json::json!({"origin": params.get("origin").cloned().unwrap_or_default(), "username": params.get("username").cloned().unwrap_or_default(), "password": params.get("password").cloned().unwrap_or_default()})); }
|
| 79 |
+
"has-login-form" => { let _ = app.emit("vault://login-detected", serde_json::json!({"origin": params.get("origin").cloned().unwrap_or_default(), "fields": params.get("fields").cloned().unwrap_or_default()})); }
|
| 80 |
+
_ => {}
|
| 81 |
+
}
|
| 82 |
+
}
|
| 83 |
_ => {}
|
| 84 |
}
|
| 85 |
tauri::http::Response::builder().status(200).header("Access-Control-Allow-Origin", "*").body(Vec::new()).unwrap()
|
|
|
|
| 96 |
refs_format::refs_export, refs_format::refs_import,
|
| 97 |
projects::projects_list, projects::projects_get_active_id, projects::project_create, projects::project_save, projects::project_load, projects::project_delete, projects::project_rename,
|
| 98 |
browser::capture::browser_capture_viewport, browser::capture::browser_capture_clip, browser::capture::browser_capture_full_page,
|
| 99 |
+
browser::autofill::tab_autoffill,
|
| 100 |
browser::commands::browser_init, browser::commands::browser_set_visible, browser::commands::browser_hide_all, browser::commands::tab_create, browser::commands::tab_activate, browser::commands::tab_close, browser::commands::tab_restore, browser::commands::tab_navigate, browser::commands::tab_reload, browser::commands::tab_back, browser::commands::tab_forward, browser::commands::tab_zoom, browser::commands::tab_resize, browser::commands::tab_get_all, browser::commands::tab_pin, browser::commands::tab_find, browser::commands::tab_find_clear,
|
| 101 |
browser::context_menu::browser_context_menu,
|
| 102 |
adblock::commands::shield_get_report, adblock::commands::shield_check_url, adblock::commands::shield_cosmetic_css, adblock::commands::shield_toggle_domain, adblock::commands::shield_is_allowed, adblock::commands::shield_update_lists, adblock::commands::shield_add_user_rule, adblock::commands::shield_list_subscriptions,
|