flams_router_vscode/
lib.rs

1#![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    /// # Errors
31    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}