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 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 Err(Error) => {
47 dev_log!("cocoon", "warn: [CocoonService] create_webview_panel trait failed: {}", Error);
48 let Fallback = SystemTime::now()
49 .duration_since(UNIX_EPOCH)
50 .map(|D| D.as_millis() as u32)
51 .unwrap_or(0);
52 let _ = Service.environment.ApplicationHandle.emit(
53 "sky://webview/create",
54 json!({
55 "handle": Fallback,
56 "viewType": Request.view_type,
57 "title": Request.title,
58 "viewColumn": Request.view_column,
59 "preserveFocus": Request.preserve_focus,
60 "iconPath": Request.icon_path,
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}