summaryrefslogtreecommitdiffhomepage
path: root/packages/ui/src/pierre
diff options
context:
space:
mode:
authorBrendan Allan <[email protected]>2026-04-02 17:40:03 +0800
committerGitHub <[email protected]>2026-04-02 09:40:03 +0000
commit69d047ae7dd84d4c4de41e09b1ecee88e3fdc3d3 (patch)
tree832dc97a20d9e1ee0ac4fba7b9daa689691a18c3 /packages/ui/src/pierre
parent327f62526a7f60c1c67ae017d1b105466bb730e9 (diff)
downloadopencode-69d047ae7dd84d4c4de41e09b1ecee88e3fdc3d3.tar.gz
opencode-69d047ae7dd84d4c4de41e09b1ecee88e3fdc3d3.zip
cleanup event listeners with solid-primitives/event-listener (#20619)
Diffstat (limited to 'packages/ui/src/pierre')
-rw-r--r--packages/ui/src/pierre/file-find.ts24
1 files changed, 12 insertions, 12 deletions
diff --git a/packages/ui/src/pierre/file-find.ts b/packages/ui/src/pierre/file-find.ts
index 841b57edc..d1cf6dd30 100644
--- a/packages/ui/src/pierre/file-find.ts
+++ b/packages/ui/src/pierre/file-find.ts
@@ -1,4 +1,5 @@
-import { createEffect, onCleanup, onMount } from "solid-js"
+import { createEffect, createSignal, onCleanup, onMount } from "solid-js"
+import { makeEventListener } from "@solid-primitives/event-listener"
import { createResizeObserver } from "@solid-primitives/resize-observer"
import { createStore } from "solid-js/store"
@@ -105,9 +106,9 @@ type CreateFileFindOptions = {
export function createFileFind(opts: CreateFileFindOptions) {
let input: HTMLInputElement | undefined
let overlayFrame: number | undefined
- let overlayScroll: HTMLElement[] = []
let mode: "highlights" | "overlay" = "overlay"
let hits: Range[] = []
+ const [overlayScroll, setOverlayScroll] = createSignal<HTMLElement[]>([])
const [state, setState] = createStore({
open: false,
@@ -123,8 +124,7 @@ export function createFileFind(opts: CreateFileFindOptions) {
const pos = () => state.pos
const clearOverlayScroll = () => {
- for (const el of overlayScroll) el.removeEventListener("scroll", scheduleOverlay)
- overlayScroll = []
+ setOverlayScroll([])
}
const clearOverlay = () => {
@@ -197,11 +197,11 @@ export function createFileFind(opts: CreateFileFindOptions) {
(node): node is HTMLElement => node instanceof HTMLElement,
)
: []
- if (next.length === overlayScroll.length && next.every((el, i) => el === overlayScroll[i])) return
+ const current = overlayScroll()
+ if (next.length === current.length && next.every((el, i) => el === current[i])) return
clearOverlayScroll()
- overlayScroll = next
- for (const el of overlayScroll) el.addEventListener("scroll", scheduleOverlay, { passive: true })
+ setOverlayScroll(next)
}
const clearFind = () => {
@@ -404,6 +404,10 @@ export function createFileFind(opts: CreateFileFindOptions) {
close,
}
+ createEffect(() => {
+ for (const el of overlayScroll()) makeEventListener(el, "scroll", scheduleOverlay, { passive: true })
+ })
+
onMount(() => {
mode = supportsHighlights() ? "highlights" : "overlay"
installShortcuts()
@@ -425,16 +429,12 @@ export function createFileFind(opts: CreateFileFindOptions) {
const update = () => positionBar()
requestAnimationFrame(update)
- window.addEventListener("resize", update, { passive: true })
+ makeEventListener(window, "resize", update, { passive: true })
const wrapper = opts.wrapper()
if (!wrapper) return
const root = scrollParent(wrapper) ?? wrapper
createResizeObserver(root, update)
-
- onCleanup(() => {
- window.removeEventListener("resize", update)
- })
})
onCleanup(() => {