flams_router_vscode/
lib.rs1#![cfg_attr(docsrs, feature(doc_cfg))]
2#![allow(clippy::must_use_candidate)]
3
4#[cfg(any(
5 all(feature = "ssr", feature = "hydrate", not(feature = "docs-only")),
6 not(any(feature = "ssr", feature = "hydrate"))
7))]
8compile_error!("exactly one of the features \"ssr\" or \"hydrate\" must be enabled");
9
10use ftml_dom::utils::css::inject_css;
11pub use leptos::prelude::*;
12pub mod components;
13use flams_utils::unwrap;
14
15#[server]
16#[allow(clippy::unused_async)]
17async fn is_lsp() -> Result<bool, ServerFnError> {
18 Ok(flams_system::settings::Settings::get().lsp)
19}
20
21#[derive(Clone)]
22pub struct VSCode {
23 origin: String,
24}
25impl VSCode {
26 #[must_use]
27 pub fn get() -> Option<Self> {
28 use_context()
29 }
30 pub fn post_message<T: leptos::server_fn::serde::Serialize + std::fmt::Debug>(
32 &self,
33 t: T,
34 ) -> Result<(), String> {
35 #[cfg(feature = "hydrate")]
36 {
37 let e = serde_wasm_bindgen::to_value(&t).map_err(|e| e.to_string())?;
38 let parent = unwrap!(unwrap!(unwrap!(leptos::web_sys::window()).parent().ok()));
39 unwrap!(parent.post_message(&e, &self.origin).ok());
40 }
41 Ok(())
42 }
43}
44
45#[component(transparent)]
46pub fn VSCodeWrap() -> impl IntoView {
47 use flams_router_login::components::LoginProvider;
48 use leptos::either::EitherOf3;
49 ftml_dom::global_setup(|| {
50 flams_router_content::Views::top_safe(|| {
51 inject_css("flams-vscode", include_str!("vscode.css"));
52 let lsp = Resource::new(|| (), |()| is_lsp());
53 if let Some(origin) =
54 leptos_router::hooks::use_query_map().with_untracked(|q| q.get("origin"))
55 {
56 provide_context(VSCode { origin });
57 }
58 view!(
59 <LoginProvider><Suspense>{move ||
60 match lsp.get() {
61 Some(Ok(true)) => EitherOf3::A(view!(
62 <div class="flams-vscode">
63 <leptos_router::components::Outlet/>
64 </div>
65 )),
66 Some(_) => EitherOf3::B("ERROR"),
67 None => EitherOf3::C(view!(<flams_web_utils::components::Spinner/>)),
68 }
69 }
70 </Suspense></LoginProvider>
71 )
72 })
73 })
74}