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