use crate::prelude::*;
use beet_core::prelude::*;
use bevy::reflect::DynamicStruct;
#[template]
pub fn Form(
#[field(default)]
#[cfg_attr(not(target_arch = "wasm32"), allow(unused_assignments))]
bubble_up: bool,
onsubmit_dyn: Box<dyn 'static + Send + Sync + Fn(DynamicStruct)>,
#[field(flatten)] attrs: BaseHtmlAttributes,
) -> impl Bundle {
#[cfg(target_arch = "wasm32")]
let onsubmit = move |ev: On<OnSubmit>| {
use beet_core::exports::js_sys;
use beet_core::exports::wasm_bindgen::JsCast;
use beet_core::exports::web_sys;
if !bubble_up {
ev.prevent_default();
}
let form = ev
.current_target()
.unwrap()
.dyn_into::<web_sys::HtmlFormElement>()
.unwrap();
let form_data = web_sys::FormData::new_with_form(&form).unwrap();
let mut dyn_struct = DynamicStruct::default();
let entries = js_sys::try_iter(&form_data).unwrap().unwrap();
for entry in entries {
let entry = entry.unwrap();
let arr = js_sys::Array::from(&entry);
let key = arr.get(0).as_string().unwrap();
let value = arr.get(1).as_string().unwrap_or_default();
dyn_struct.insert(key, value);
}
onsubmit_dyn(dyn_struct);
};
#[cfg(not(target_arch = "wasm32"))]
let onsubmit = |_: On<OnSubmit>| {};
rsx! {
<form {attrs} onsubmit=onsubmit>
<slot />
</form>
<style src="form.css" />
}
}
#[cfg(test)]
mod test {
use beet_core::prelude::*;
use bevy::reflect::DynamicStruct;
#[test]
fn works() {
#[derive(Reflect)]
struct MyStruct {
foo: i32,
}
let mut dynamic = DynamicStruct::default();
MyStruct::from_reflect(&dynamic).is_none().xpect_true();
dynamic.insert("foo", 3);
MyStruct::from_reflect(&dynamic).unwrap().foo.xpect_eq(3);
}
}