use std::rc::Rc; use crate::query::Query; use crate::query::QueryError; use crate::use_window; use dioxus_core::ScopeState; use std::future::Future; use std::future::IntoFuture; use std::pin::Pin; /// A future that resolves to the result of a JavaScript evaluation. pub struct EvalResult { pub(crate) query: Query, } impl EvalResult { pub(crate) fn new(query: Query) -> Self { Self { query } } } impl IntoFuture for EvalResult { type Output = Result; type IntoFuture = Pin>>>; fn into_future(self) -> Self::IntoFuture { Box::pin(self.query.resolve()) as Pin>>> } } /// Get a closure that executes any JavaScript in the WebView context. pub fn use_eval(cx: &ScopeState) -> &Rc EvalResult> { let desktop = use_window(cx); &*cx.use_hook(|| { let desktop = desktop.clone(); Rc::new(move |script: String| desktop.eval(&script)) as Rc EvalResult> }) }