deft 0.15.0

Cross platform ui framework
use crate::base::EventContext;
use crate::js::js_value_util::EventResult;
use crate::js::{FromJsValue, ToJsValue};
use log::error;
use quick_js::JsValue;

pub fn create_event_handler<T: ToJsValue + Clone>(
    event_name: &str,
    callback: JsValue,
) -> Box<dyn Fn(&mut EventContext<T>, JsValue)> {
    let en = event_name.to_string();
    Box::new(move |ctx: &mut EventContext<T>, detail| {
        let target = match ctx.target.clone().to_js_value() {
            Ok(target) => target,
            Err(e) => {
                error!("failed to convert target to js value: {:?}", e);
                return;
            }
        };
        let callback_result =
            callback.call_as_function(vec![JsValue::String(en.clone()), detail, target]);
        if let Ok(cb_result) = callback_result {
            if let Ok(res) = EventResult::from_js_value(cb_result) {
                if res.propagation_cancelled {
                    ctx.propagation_cancelled = true;
                }
                if res.prevent_default {
                    ctx.prevent_default = true;
                }
            }
        }
    })
}