From f245b61ab3005e6c6360e12bdae6322c02a48b93 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Fri, 2 Jan 2026 00:43:28 +0100 Subject: [PATCH] Handle React cleanup --- packages/example/src/TestUi1.ts | 4 --- packages/react-godot-renderer/src/Renderer.ts | 27 ++++++++++++++----- 2 files changed, 21 insertions(+), 10 deletions(-) diff --git a/packages/example/src/TestUi1.ts b/packages/example/src/TestUi1.ts index c637de1..bbb4586 100644 --- a/packages/example/src/TestUi1.ts +++ b/packages/example/src/TestUi1.ts @@ -8,8 +8,4 @@ export default class TestUi1 extends Control { _ready(): void { Renderer.renderComponent(this, TestUi1Component) } - - _exit_tree(): void { - console.log("exit tree") - } } diff --git a/packages/react-godot-renderer/src/Renderer.ts b/packages/react-godot-renderer/src/Renderer.ts index 76248f4..cc221e5 100644 --- a/packages/react-godot-renderer/src/Renderer.ts +++ b/packages/react-godot-renderer/src/Renderer.ts @@ -1,5 +1,5 @@ /** biome-ignore-all lint/complexity/noBannedTypes: {} is the "empty props" type in React */ -import type { Node, NodePathMap } from "godot" +import { Callable, type Node, type NodePathMap } from "godot" import * as React from "react" import * as Reconciler from "./Reconciler.js" @@ -21,10 +21,11 @@ export const renderComponent: { component: React.FC<{}>, props?: Record, ): void => { - const reconciler = Reconciler.make() + if (!(container as any)._reactReconciler) + (container as any)._reactReconciler = Reconciler.make() - if (!(container as any)._rootContainer) - (container as any)._rootContainer = (reconciler as any).createContainer( + if (!(container as any)._reactContainer) { + (container as any)._reactContainer = (container as any)._reactReconciler.createContainer( container, ConcurrentRoot, null, @@ -34,9 +35,23 @@ export const renderComponent: { console.error, ) - reconciler.updateContainer( + const cleanup = Callable.create(container, function(this) { + (container as any)._reactReconciler.updateContainer( + null, + (container as any)._reactContainer, + null, + ) + delete (container as any)._reactReconciler + delete (container as any)._reactContainer + + container.tree_exiting.disconnect(cleanup) + }) + container.tree_exiting.connect(cleanup) + } + + (container as any)._reactReconciler.updateContainer( React.createElement(component, props), - (container as any)._rootContainer, + (container as any)._reactContainer, null, ) }