asdf98 commited on
Commit
9483d1d
·
verified ·
1 Parent(s): b264787

fix: muse-action board handler emits board://image_added for React canvas bridge

Browse files
Files changed (1) hide show
  1. 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" => { let url = params.get("url").cloned().unwrap_or_default(); if !url.is_empty() { let source = params.get("source").cloned(); let title = params.get("title").cloned(); tauri::async_runtime::spawn(async move { let _ = crate::library::library_add_item(app, url, source, title).await; }); } }
38
- "board" => { let url = params.get("url").cloned().unwrap_or_default(); if !url.is_empty() { let source = params.get("source").cloned(); let title = params.get("title").cloned(); tauri::async_runtime::spawn(async move { if let Ok(item) = crate::library::library_add_item(app.clone(), url, source, title).await { let _ = crate::board::board_add_image(app, Some(item.id), item.data_url, 120.0, 120.0, 300.0, 200.0); } }); } }
39
- "vault" => { let va = params.get("action").cloned().unwrap_or_default(); match va.as_str() { "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()})); } "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()})); } _ => {} } }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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::tab_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,