From 40140b40c4473fc62c844cf3d9347498f270ecb1 Mon Sep 17 00:00:00 2001
From: ryan <ryannganga13325@gmail.com>
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);
     };