From 40140b40c4473fc62c844cf3d9347498f270ecb1 Mon Sep 17 00:00:00 2001 From: ryan Date: Mon, 30 Dec 2024 14:20:50 +0300 Subject: [PATCH] feat(EditableCell): add signal disposal handling and logging - Introduced `is_disposed` signal to track component disposal state. - Added `on_cleanup` hook to set disposal flag and log when the component is disposed. - Enhanced signal access with `log_signal_get` to prevent usage after disposal. - Improved input, focus, and blur handlers to respect disposal state. - Ensured robust handling of signals during the component's lifecycle. This improves resilience and debugging for EditableCell, especially in dynamic UI contexts. --- src/components/editable_cell.rs | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/src/components/editable_cell.rs b/src/components/editable_cell.rs index 2604931..b282038 100644 --- a/src/components/editable_cell.rs +++ b/src/components/editable_cell.rs @@ -1,5 +1,5 @@ use leptos::*; - +use leptos::logging::log; #[component] pub fn EditableCell( value: String, @@ -9,17 +9,41 @@ pub fn EditableCell( let (input_value, set_input_value) = create_signal(value.clone()); let (has_focus, set_has_focus) = create_signal(false); // Track focus state locally + let (is_disposed, set_disposed) = create_signal(false); // Track disposal state + + // Ensure signals aren't updated after disposal + on_cleanup(move || { + log!("Component disposed"); + set_disposed.set(true); + }); + + let log_signal_get = move |signal_name: &str| { + if is_disposed.get() { + panic!("Attempted to get disposed signal: {}", signal_name); + } + }; + let handle_input = move |e: web_sys::Event| { + log_signal_get("input_value"); + if is_disposed.get_untracked() { + return; + } let new_value = event_target_value(&e); set_input_value.set(new_value.clone()); on_input(new_value); }; let handle_focus = move |_: web_sys::FocusEvent| { + if is_disposed.get() { + return; + } set_has_focus.set(true); }; let handle_blur = move |_: web_sys::FocusEvent| { + if is_disposed.get() { + return; + } set_has_focus.set(false); };