flams_router_vscode/
lib.rs

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