Skip to content

Commit 69d047a

Browse files
authored
cleanup event listeners with solid-primitives/event-listener (anomalyco#20619)
1 parent 327f625 commit 69d047a

22 files changed

Lines changed: 102 additions & 176 deletions

bun.lock

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

packages/app/src/components/debug-bar.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { useIsRouting, useLocation } from "@solidjs/router"
22
import { batch, createEffect, onCleanup, onMount } from "solid-js"
33
import { createStore } from "solid-js/store"
4+
import { makeEventListener } from "@solid-primitives/event-listener"
45
import { Tooltip } from "@opencode-ai/ui/tooltip"
56
import { useLanguage } from "@/context/language"
67

@@ -349,13 +350,12 @@ export function DebugBar() {
349350

350351
syncHeap()
351352
start()
352-
document.addEventListener("visibilitychange", vis)
353+
makeEventListener(document, "visibilitychange", vis)
353354

354355
onCleanup(() => {
355356
if (one !== 0) cancelAnimationFrame(one)
356357
if (two !== 0) cancelAnimationFrame(two)
357358
stop()
358-
document.removeEventListener("visibilitychange", vis)
359359
for (const ob of obs) ob.disconnect()
360360
})
361361
})

packages/app/src/components/prompt-input/attachments.ts

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
import { onCleanup, onMount } from "solid-js"
1+
import { onMount } from "solid-js"
2+
import { makeEventListener } from "@solid-primitives/event-listener"
23
import { showToast } from "@opencode-ai/ui/toast"
34
import { usePrompt, type ContentPart, type ImageAttachmentPart } from "@/context/prompt"
45
import { useLanguage } from "@/context/language"
@@ -181,15 +182,9 @@ export function createPromptAttachments(input: PromptAttachmentsInput) {
181182
}
182183

183184
onMount(() => {
184-
document.addEventListener("dragover", handleGlobalDragOver)
185-
document.addEventListener("dragleave", handleGlobalDragLeave)
186-
document.addEventListener("drop", handleGlobalDrop)
187-
})
188-
189-
onCleanup(() => {
190-
document.removeEventListener("dragover", handleGlobalDragOver)
191-
document.removeEventListener("dragleave", handleGlobalDragLeave)
192-
document.removeEventListener("drop", handleGlobalDrop)
185+
makeEventListener(document, "dragover", handleGlobalDragOver)
186+
makeEventListener(document, "dragleave", handleGlobalDragLeave)
187+
makeEventListener(document, "drop", handleGlobalDrop)
193188
})
194189

195190
return {

packages/app/src/components/settings-keybinds.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { Component, For, Show, createMemo, onCleanup, onMount } from "solid-js"
22
import { createStore } from "solid-js/store"
3+
import { makeEventListener } from "@solid-primitives/event-listener"
34
import { Button } from "@opencode-ai/ui/button"
45
import { Icon } from "@opencode-ai/ui/icon"
56
import { IconButton } from "@opencode-ai/ui/icon-button"
@@ -250,8 +251,7 @@ function useKeyCapture(input: {
250251
input.stop()
251252
}
252253

253-
document.addEventListener("keydown", handle, true)
254-
onCleanup(() => document.removeEventListener("keydown", handle, true))
254+
makeEventListener(document, "keydown", handle, { capture: true })
255255
})
256256
}
257257

packages/app/src/context/command.tsx

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import { createSimpleContext } from "@opencode-ai/ui/context"
22
import { useDialog } from "@opencode-ai/ui/context/dialog"
33
import { type Accessor, createEffect, createMemo, onCleanup, onMount } from "solid-js"
44
import { createStore } from "solid-js/store"
5+
import { makeEventListener } from "@solid-primitives/event-listener"
56
import { useLanguage } from "@/context/language"
67
import { useSettings } from "@/context/settings"
78
import { dict as en } from "@/i18n/en"
@@ -378,11 +379,7 @@ export const { use: useCommand, provider: CommandProvider } = createSimpleContex
378379
}
379380

380381
onMount(() => {
381-
document.addEventListener("keydown", handleKeyDown)
382-
})
383-
384-
onCleanup(() => {
385-
document.removeEventListener("keydown", handleKeyDown)
382+
makeEventListener(document, "keydown", handleKeyDown)
386383
})
387384

388385
function register(cb: () => CommandOption[]): void

packages/app/src/context/global-sdk.tsx

Lines changed: 10 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
import type { Event } from "@opencode-ai/sdk/v2/client"
22
import { createSimpleContext } from "@opencode-ai/ui/context"
33
import { createGlobalEmitter } from "@solid-primitives/event-bus"
4-
import { batch, onCleanup } from "solid-js"
4+
import { makeEventListener } from "@solid-primitives/event-listener"
5+
import { batch, onCleanup, onMount } from "solid-js"
56
import z from "zod"
67
import { createSdkForServer } from "@/utils/server"
78
import { useLanguage } from "./language"
@@ -206,21 +207,16 @@ export const { use: useGlobalSDK, provider: GlobalSDKProvider } = createSimpleCo
206207
clearHeartbeat()
207208
}
208209

209-
const onVisibility = () => {
210-
if (typeof document === "undefined") return
211-
if (document.visibilityState !== "visible") return
212-
if (!started) return
213-
if (Date.now() - lastEventAt < HEARTBEAT_TIMEOUT_MS) return
214-
attempt?.abort()
215-
}
216-
if (typeof document !== "undefined") {
217-
document.addEventListener("visibilitychange", onVisibility)
218-
}
210+
onMount(() => {
211+
makeEventListener(document, "visibilitychange", () => {
212+
if (document.visibilityState !== "visible") return
213+
if (!started) return
214+
if (Date.now() - lastEventAt < HEARTBEAT_TIMEOUT_MS) return
215+
attempt?.abort()
216+
})
217+
})
219218

220219
onCleanup(() => {
221-
if (typeof document !== "undefined") {
222-
document.removeEventListener("visibilitychange", onVisibility)
223-
}
224220
stop()
225221
abort.abort()
226222
flush()

packages/app/src/context/layout.tsx

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { createStore, produce } from "solid-js/store"
22
import { batch, createEffect, createMemo, onCleanup, onMount, type Accessor } from "solid-js"
33
import { createSimpleContext } from "@opencode-ai/ui/context"
4+
import { makeEventListener } from "@solid-primitives/event-listener"
45
import { useGlobalSync } from "./global-sync"
56
import { useGlobalSDK } from "./global-sdk"
67
import { useServer } from "./server"
@@ -366,12 +367,10 @@ export const { use: useLayout, provider: LayoutProvider } = createSimpleContext(
366367
flush()
367368
}
368369

369-
window.addEventListener("pagehide", flush)
370-
document.addEventListener("visibilitychange", handleVisibility)
370+
makeEventListener(window, "pagehide", flush)
371+
makeEventListener(document, "visibilitychange", handleVisibility)
371372

372373
onCleanup(() => {
373-
window.removeEventListener("pagehide", flush)
374-
document.removeEventListener("visibilitychange", handleVisibility)
375374
scroll.dispose()
376375
})
377376
})

packages/app/src/pages/layout.tsx

Lines changed: 7 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import {
1212
untrack,
1313
type Accessor,
1414
} from "solid-js"
15+
import { makeEventListener } from "@solid-primitives/event-listener"
1516
import { useNavigate, useParams } from "@solidjs/router"
1617
import { useLayout, LocalProject } from "@/context/layout"
1718
import { useGlobalSync } from "@/context/global-sync"
@@ -215,18 +216,11 @@ export default function Layout(props: ParentProps) {
215216
if (document.visibilityState !== "hidden") return
216217
reset()
217218
}
218-
window.addEventListener("pointerup", stop)
219-
window.addEventListener("pointercancel", stop)
220-
window.addEventListener("blur", stop)
221-
window.addEventListener("blur", blur)
222-
document.addEventListener("visibilitychange", hide)
223-
onCleanup(() => {
224-
window.removeEventListener("pointerup", stop)
225-
window.removeEventListener("pointercancel", stop)
226-
window.removeEventListener("blur", stop)
227-
window.removeEventListener("blur", blur)
228-
document.removeEventListener("visibilitychange", hide)
229-
})
219+
makeEventListener(window, "pointerup", stop)
220+
makeEventListener(window, "pointercancel", stop)
221+
makeEventListener(window, "blur", stop)
222+
makeEventListener(window, "blur", blur)
223+
makeEventListener(document, "visibilitychange", hide)
230224
})
231225

232226
const sidebarHovering = createMemo(() => !layout.sidebar.opened() && state.hoverProject !== undefined)
@@ -1394,8 +1388,7 @@ export default function Layout(props: ParentProps) {
13941388
}
13951389

13961390
handleDeepLinks(drainPendingDeepLinks(window))
1397-
window.addEventListener(deepLinkEvent, handler as EventListener)
1398-
onCleanup(() => window.removeEventListener(deepLinkEvent, handler as EventListener))
1391+
makeEventListener(window, deepLinkEvent, handler as EventListener)
13991392
})
14001393

14011394
async function renameProject(project: LocalProject, next: string) {

packages/app/src/pages/session.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import {
1414
onMount,
1515
untrack,
1616
} from "solid-js"
17+
import { makeEventListener } from "@solid-primitives/event-listener"
1718
import { createMediaQuery } from "@solid-primitives/media"
1819
import { createResizeObserver } from "@solid-primitives/resize-observer"
1920
import { useLocal } from "@/context/local"
@@ -1687,11 +1688,10 @@ export default function Page() {
16871688
)
16881689

16891690
onMount(() => {
1690-
document.addEventListener("keydown", handleKeyDown)
1691+
makeEventListener(document, "keydown", handleKeyDown)
16911692
})
16921693

16931694
onCleanup(() => {
1694-
document.removeEventListener("keydown", handleKeyDown)
16951695
if (reviewFrame !== undefined) cancelAnimationFrame(reviewFrame)
16961696
if (refreshFrame !== undefined) cancelAnimationFrame(refreshFrame)
16971697
if (refreshTimer !== undefined) window.clearTimeout(refreshTimer)

packages/app/src/pages/session/composer/session-composer-state.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { createEffect, createMemo, on, onCleanup, onMount } from "solid-js"
22
import { createStore } from "solid-js/store"
3+
import { makeEventListener } from "@solid-primitives/event-listener"
34
import type { PermissionRequest, QuestionRequest, Todo } from "@opencode-ai/sdk/v2"
45
import { useParams } from "@solidjs/router"
56
import { showToast } from "@opencode-ai/ui/toast"
@@ -86,8 +87,7 @@ export function createSessionComposerState(options?: { closeMs?: number | (() =>
8687
pull()
8788
}
8889

89-
window.addEventListener(composerEvent, onEvent)
90-
onCleanup(() => window.removeEventListener(composerEvent, onEvent))
90+
makeEventListener(window, composerEvent, onEvent)
9191
})
9292

9393
const todos = createMemo((): Todo[] => {

0 commit comments

Comments
 (0)