diff options
| author | Brendan Allan <[email protected]> | 2026-04-02 17:40:03 +0800 |
|---|---|---|
| committer | GitHub <[email protected]> | 2026-04-02 09:40:03 +0000 |
| commit | 69d047ae7dd84d4c4de41e09b1ecee88e3fdc3d3 (patch) | |
| tree | 832dc97a20d9e1ee0ac4fba7b9daa689691a18c3 /packages/ui/src/pierre | |
| parent | 327f62526a7f60c1c67ae017d1b105466bb730e9 (diff) | |
| download | opencode-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.ts | 24 |
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(() => { |
