Mountain/RPC/CocoonService/Window/
CreateWebviewPanel.rs1
2use std::time::{SystemTime, UNIX_EPOCH};
9
10use serde_json::json;
11use tauri::Emitter;
12use tonic::{Response, Status};
13use CommonLibrary::Webview::WebviewProvider::WebviewProvider;
14
15use crate::{
16 RPC::CocoonService::CocoonServiceImpl,
17 Vine::Generated::{CreateWebviewPanelRequest, CreateWebviewPanelResponse},
18 dev_log,
19};
20
21pub async fn Fn(
22 Service:&CocoonServiceImpl,
23
24 Request:CreateWebviewPanelRequest,
25) -> Result<Response<CreateWebviewPanelResponse>, Status> {
26 dev_log!(
27 "cocoon",
28 "[CocoonService] create_webview_panel: view_type={} title={}",
29 Request.view_type,
30 Request.title
31 );
32
33 let Handle = match Service
34 .environment
35 .CreateWebviewPanel(
36 json!({}),
37 Request.view_type.clone(),
38 Request.title.clone(),
39 json!({ "viewColumn": Request.view_column, "preserveFocus": Request.preserve_focus }),
40 json!({}),
41 json!({}),
42 )
43 .await
44 {
45 Ok(H) => H,
46
47 Err(Error) => {
48 dev_log!("cocoon", "warn: [CocoonService] create_webview_panel trait failed: {}", Error);
49
50 let Fallback = SystemTime::now()
51 .duration_since(UNIX_EPOCH)
52 .map(|D| D.as_millis() as u32)
53 .unwrap_or(0);
54
55 let _ = Service.environment.ApplicationHandle.emit(
56 "sky://webview/create",
57 json!({
58 "handle": Fallback,
59 "viewType": Request.view_type,
60 "title": Request.title,
61 "viewColumn": Request.view_column,
62 "preserveFocus": Request.preserve_focus,
63 "iconPath": Request.icon_path,
64 }),
65 );
66
67 return Ok(Response::new(CreateWebviewPanelResponse { handle:Fallback }));
68 },
69 };
70
71 let HandleU32 = Handle
72 .parse::<u32>()
73 .unwrap_or_else(|_| Handle.chars().map(|C| C as u32).fold(0u32, |Acc, Char| Acc.wrapping_add(Char)));
74
75 Ok(Response::new(CreateWebviewPanelResponse { handle:HandleU32 }))
76}