mirror of
https://github.com/anomalyco/opentui.git
synced 2026-09-19 01:26:03 +08:00
fix(solid): Call lifecycle dispose on renderer.destroy (#289)
This commit is contained in:
@@ -82,6 +82,7 @@ export interface CliRendererConfig {
|
||||
backgroundColor?: ColorInput
|
||||
openConsoleOnError?: boolean
|
||||
prependInputHandlers?: ((sequence: string) => boolean)[]
|
||||
onDestroy?: () => void
|
||||
}
|
||||
|
||||
export type PixelResolution = {
|
||||
@@ -334,6 +335,7 @@ export class CliRenderer extends EventEmitter implements RenderContext {
|
||||
private _paletteDetector: TerminalPaletteDetector | null = null
|
||||
private _cachedPalette: TerminalColors | null = null
|
||||
private _paletteDetectionPromise: Promise<TerminalColors> | null = null
|
||||
private _onDestroy?: () => void
|
||||
|
||||
private inputHandlers: ((sequence: string) => boolean)[] = []
|
||||
private prependedInputHandlers: ((sequence: string) => boolean)[] = []
|
||||
@@ -464,6 +466,7 @@ export class CliRenderer extends EventEmitter implements RenderContext {
|
||||
this._console = new TerminalConsole(this, config.consoleOptions)
|
||||
this.useConsole = config.useConsole ?? true
|
||||
this._openConsoleOnError = config.openConsoleOnError ?? process.env.NODE_ENV !== "production"
|
||||
this._onDestroy = config.onDestroy
|
||||
|
||||
global.requestAnimationFrame = (callback: FrameRequestCallback) => {
|
||||
const id = CliRenderer.animationFrameId++
|
||||
@@ -1384,6 +1387,14 @@ export class CliRenderer extends EventEmitter implements RenderContext {
|
||||
|
||||
this.lib.destroyRenderer(this.rendererPtr)
|
||||
rendererTracker.removeRenderer(this)
|
||||
|
||||
if (this._onDestroy) {
|
||||
try {
|
||||
this._onDestroy()
|
||||
} catch (e) {
|
||||
console.error("Error in onDestroy callback:", e instanceof Error ? e.stack : String(e))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private startRenderLoop(): void {
|
||||
|
||||
@@ -40,7 +40,7 @@ render(() => <text>Hello, World!</text>)
|
||||
5. To build use [Bun.build](https://bun.com/docs/bundler) ([source](https://github.com/sst/opentui/issues/122)):
|
||||
|
||||
```ts
|
||||
import solidPlugin from "./node_modules/@opentui/solid/scripts/solid-plugin";
|
||||
import solidPlugin from "./node_modules/@opentui/solid/scripts/solid-plugin"
|
||||
|
||||
await Bun.build({
|
||||
entrypoints: ["./index.tsx"],
|
||||
@@ -51,5 +51,5 @@ await Bun.build({
|
||||
target: "bun-darwin-arm64",
|
||||
outfile: "app-macos",
|
||||
},
|
||||
});
|
||||
})
|
||||
```
|
||||
|
||||
+16
-4
@@ -5,10 +5,16 @@ import { RendererContext } from "./src/elements"
|
||||
import { _render as renderInternal, createComponent } from "./src/reconciler"
|
||||
|
||||
export const render = async (node: () => JSX.Element, renderConfig: CliRendererConfig = {}) => {
|
||||
const renderer = await createCliRenderer(renderConfig)
|
||||
const renderer = await createCliRenderer({
|
||||
...renderConfig,
|
||||
onDestroy: () => {
|
||||
dispose()
|
||||
renderConfig.onDestroy?.()
|
||||
},
|
||||
})
|
||||
engine.attach(renderer)
|
||||
|
||||
renderInternal(
|
||||
const dispose = renderInternal(
|
||||
() =>
|
||||
createComponent(RendererContext.Provider, {
|
||||
get value() {
|
||||
@@ -23,10 +29,16 @@ export const render = async (node: () => JSX.Element, renderConfig: CliRendererC
|
||||
}
|
||||
|
||||
export const testRender = async (node: () => JSX.Element, renderConfig: TestRendererOptions = {}) => {
|
||||
const testSetup = await createTestRenderer(renderConfig)
|
||||
const testSetup = await createTestRenderer({
|
||||
...renderConfig,
|
||||
onDestroy: () => {
|
||||
dispose()
|
||||
renderConfig.onDestroy?.()
|
||||
},
|
||||
})
|
||||
engine.attach(testSetup.renderer)
|
||||
|
||||
renderInternal(
|
||||
const dispose = renderInternal(
|
||||
() =>
|
||||
createComponent(RendererContext.Provider, {
|
||||
get value() {
|
||||
|
||||
Reference in New Issue
Block a user