dioxus_oauth/
component.rs

1#![allow(non_snake_case)]
2use dioxus::prelude::*;
3
4#[component]
5pub fn OAuthPopup() -> Element {
6    #[cfg(feature = "web")]
7    {
8        use url::Url;
9        let window = match web_sys::window() {
10            Some(window) => window,
11            None => {
12                tracing::error!("Window not found");
13                return rsx! {
14                    div { "Window not found" }
15                };
16            }
17        };
18        let url = window.location().href().unwrap_or_default();
19        tracing::debug!("url={:?}", url);
20        let opener: web_sys::Window = match window.opener() {
21            Ok(opener) => opener.into(),
22            Err(e) => {
23                tracing::debug!("e={e:?}");
24                return rsx! {
25                    div { "opener not found" }
26                };
27            }
28        };
29        let url = Url::parse(&url).expect("Failed to parse URL");
30        if let Some(code) = url.query_pairs().find(|(key, _)| key == "code") {
31            tracing::debug!("Code query parameter: {}", code.1);
32
33            if let Err(e) = opener.post_message(
34                &wasm_bindgen::JsValue::from_str(&format!("code={}", code.1)),
35                "*",
36            ) {
37                tracing::error!("");
38                return rsx! { "{e:?}" };
39            } else {
40                let _ = window.close();
41            };
42        }
43    }
44
45    rsx! {
46        div { "" }
47    }
48}