fix: Unsafe recursive object use

This commit is contained in:
Jeremy Wall 2024-02-20 15:48:51 -05:00
parent 6f7d44ff83
commit 3e675b47f4
2 changed files with 16 additions and 30 deletions

View File

@ -56,6 +56,7 @@ features = [
"Event",
"InputEvent",
"CustomEvent",
"CustomEventInit",
"EventTarget",
"History",
"HtmlAnchorElement",

View File

@ -14,9 +14,9 @@
use maud::html;
use sycamore::prelude::*;
use tracing::{debug, error};
use wasm_bindgen::JsCast;
use wasm_bindgen::{JsCast, JsValue};
use wasm_web_component::{web_component, WebComponentBinding};
use web_sys::{window, CustomEvent, Event, HtmlElement, InputEvent, ShadowRoot};
use web_sys::{window, CustomEvent, CustomEventInit, Event, HtmlElement, InputEvent, ShadowRoot};
use crate::js_lib::LogFailures;
@ -135,11 +135,10 @@ impl WebComponentBinding for NumberSpinner {
return;
}
};
let mut eventDict = CustomEventInit::new();
eventDict.detail(&JsValue::from_f64(self.value as f64));
element
.set_attribute("val", &format!("{}", self.value))
.swallow_and_log();
element
.dispatch_event(&CustomEvent::new("updated").unwrap())
.dispatch_event(&CustomEvent::new_with_event_init_dict("updated", &eventDict).unwrap())
.unwrap();
debug!("Dispatched updated event");
}
@ -147,9 +146,9 @@ impl WebComponentBinding for NumberSpinner {
fn attribute_changed_mut(
&mut self,
_element: &web_sys::HtmlElement,
name: wasm_bindgen::JsValue,
old_value: wasm_bindgen::JsValue,
new_value: wasm_bindgen::JsValue,
name: JsValue,
old_value: JsValue,
new_value: JsValue,
) {
let nval_el = self.get_input_el();
let name = name.as_string().unwrap();
@ -213,7 +212,7 @@ impl WebComponentBinding for NumberSpinner {
#[derive(Props)]
pub struct NumberProps<'ctx, F>
where
F: Fn(Event),
F: Fn(CustomEvent),
{
name: String,
class: String,
@ -225,7 +224,7 @@ where
#[component]
pub fn NumberField<'ctx, F, G: Html>(cx: Scope<'ctx>, props: NumberProps<'ctx, F>) -> View<G>
where
F: Fn(web_sys::Event) + 'ctx,
F: Fn(CustomEvent) + 'ctx,
{
let NumberProps {
name,
@ -238,27 +237,13 @@ where
// TODO(jwall): I'm pretty sure this triggers: https://github.com/sycamore-rs/sycamore/issues/602
// Which means I probably have to wait till v0.9.0 drops or switch to leptos.
let id = name.clone();
create_effect(cx, move || {
let new_count = *counter.get();
debug!(new_count, "COUNTS: Updating spinner with new value");
if let Some(el) = window()
.unwrap()
.document()
.unwrap()
.get_element_by_id(id.as_str())
{
debug!("COUNTS: found element");
el.set_attribute("val", new_count.to_string().as_str())
.unwrap();
}
});
let id = name.clone();
let initial_count = *counter.get();
view! {cx,
number-spinner(id=id, class=(class), val=*counter.get(), min=min, on:updated=move |evt: Event| {
let target: HtmlElement = evt.target().unwrap().dyn_into().unwrap();
let val: f64 = target.get_attribute("val").unwrap().parse().unwrap();
number-spinner(id=id, class=(class), val=(initial_count), min=min, on:updated=move |evt: Event| {
let event = evt.unchecked_into::<CustomEvent>();
let val: f64 = event.detail().as_f64().unwrap();
counter.set(val);
on_change.as_ref().map(|f| f(evt));
on_change.as_ref().map(|f| f(event));
debug!(counter=%(counter.get_untracked()), "set counter to new value");
})
}