flams_router_vscode/
lib.rs1#![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}