mirror of
https://github.com/zaphar/kitchen.git
synced 2025-07-22 19:40:14 -04:00
fix: Unsafe recursive object use
This commit is contained in:
parent
6f7d44ff83
commit
3e675b47f4
@ -56,6 +56,7 @@ features = [
|
|||||||
"Event",
|
"Event",
|
||||||
"InputEvent",
|
"InputEvent",
|
||||||
"CustomEvent",
|
"CustomEvent",
|
||||||
|
"CustomEventInit",
|
||||||
"EventTarget",
|
"EventTarget",
|
||||||
"History",
|
"History",
|
||||||
"HtmlAnchorElement",
|
"HtmlAnchorElement",
|
||||||
|
@ -14,9 +14,9 @@
|
|||||||
use maud::html;
|
use maud::html;
|
||||||
use sycamore::prelude::*;
|
use sycamore::prelude::*;
|
||||||
use tracing::{debug, error};
|
use tracing::{debug, error};
|
||||||
use wasm_bindgen::JsCast;
|
use wasm_bindgen::{JsCast, JsValue};
|
||||||
use wasm_web_component::{web_component, WebComponentBinding};
|
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;
|
use crate::js_lib::LogFailures;
|
||||||
|
|
||||||
@ -135,11 +135,10 @@ impl WebComponentBinding for NumberSpinner {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
let mut eventDict = CustomEventInit::new();
|
||||||
|
eventDict.detail(&JsValue::from_f64(self.value as f64));
|
||||||
element
|
element
|
||||||
.set_attribute("val", &format!("{}", self.value))
|
.dispatch_event(&CustomEvent::new_with_event_init_dict("updated", &eventDict).unwrap())
|
||||||
.swallow_and_log();
|
|
||||||
element
|
|
||||||
.dispatch_event(&CustomEvent::new("updated").unwrap())
|
|
||||||
.unwrap();
|
.unwrap();
|
||||||
debug!("Dispatched updated event");
|
debug!("Dispatched updated event");
|
||||||
}
|
}
|
||||||
@ -147,9 +146,9 @@ impl WebComponentBinding for NumberSpinner {
|
|||||||
fn attribute_changed_mut(
|
fn attribute_changed_mut(
|
||||||
&mut self,
|
&mut self,
|
||||||
_element: &web_sys::HtmlElement,
|
_element: &web_sys::HtmlElement,
|
||||||
name: wasm_bindgen::JsValue,
|
name: JsValue,
|
||||||
old_value: wasm_bindgen::JsValue,
|
old_value: JsValue,
|
||||||
new_value: wasm_bindgen::JsValue,
|
new_value: JsValue,
|
||||||
) {
|
) {
|
||||||
let nval_el = self.get_input_el();
|
let nval_el = self.get_input_el();
|
||||||
let name = name.as_string().unwrap();
|
let name = name.as_string().unwrap();
|
||||||
@ -213,7 +212,7 @@ impl WebComponentBinding for NumberSpinner {
|
|||||||
#[derive(Props)]
|
#[derive(Props)]
|
||||||
pub struct NumberProps<'ctx, F>
|
pub struct NumberProps<'ctx, F>
|
||||||
where
|
where
|
||||||
F: Fn(Event),
|
F: Fn(CustomEvent),
|
||||||
{
|
{
|
||||||
name: String,
|
name: String,
|
||||||
class: String,
|
class: String,
|
||||||
@ -225,7 +224,7 @@ where
|
|||||||
#[component]
|
#[component]
|
||||||
pub fn NumberField<'ctx, F, G: Html>(cx: Scope<'ctx>, props: NumberProps<'ctx, F>) -> View<G>
|
pub fn NumberField<'ctx, F, G: Html>(cx: Scope<'ctx>, props: NumberProps<'ctx, F>) -> View<G>
|
||||||
where
|
where
|
||||||
F: Fn(web_sys::Event) + 'ctx,
|
F: Fn(CustomEvent) + 'ctx,
|
||||||
{
|
{
|
||||||
let NumberProps {
|
let NumberProps {
|
||||||
name,
|
name,
|
||||||
@ -238,27 +237,13 @@ where
|
|||||||
// TODO(jwall): I'm pretty sure this triggers: https://github.com/sycamore-rs/sycamore/issues/602
|
// 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.
|
// Which means I probably have to wait till v0.9.0 drops or switch to leptos.
|
||||||
let id = name.clone();
|
let id = name.clone();
|
||||||
create_effect(cx, move || {
|
let initial_count = *counter.get();
|
||||||
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();
|
|
||||||
view! {cx,
|
view! {cx,
|
||||||
number-spinner(id=id, class=(class), val=*counter.get(), min=min, on:updated=move |evt: Event| {
|
number-spinner(id=id, class=(class), val=(initial_count), min=min, on:updated=move |evt: Event| {
|
||||||
let target: HtmlElement = evt.target().unwrap().dyn_into().unwrap();
|
let event = evt.unchecked_into::<CustomEvent>();
|
||||||
let val: f64 = target.get_attribute("val").unwrap().parse().unwrap();
|
let val: f64 = event.detail().as_f64().unwrap();
|
||||||
counter.set(val);
|
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");
|
debug!(counter=%(counter.get_untracked()), "set counter to new value");
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user