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