use wasm_bindgen::__rt::IntoJsResult;
use wasm_bindgen::JsValue;
use wasm_bindgen_futures::future_to_promise;
use yew::prelude::*;
#[hook]
pub fn use_async_callback<IN, OUT, F, D>(deps: D, f: F) -> Callback<IN, ()>
where
IN: Clone + 'static,
OUT: IntoJsResult + 'static,
F: AsyncFn(IN, &D) -> OUT + 'static,
D: Clone + PartialEq + 'static,
{
use std::rc::Rc;
let deps = Rc::new(deps);
let f = Rc::new(f);
(*use_memo(deps, move |deps| {
let deps = deps.clone();
let ff = move |value: IN| {
perspective_client::clone!(value, f, deps);
let _ = future_to_promise(async move {
f(value, &deps).await.into_js_result()?;
Ok(JsValue::UNDEFINED)
});
};
Callback::from(ff)
}))
.clone()
}