diff --git a/bun.lock b/bun.lock index 91868f64b65c..b2310667f97b 100644 --- a/bun.lock +++ b/bun.lock @@ -61,7 +61,6 @@ "@corvu/drawer": "catalog:", "@dnd-kit/abstract": "0.5.0", "@dnd-kit/dom": "0.5.0", - "@dnd-kit/helpers": "0.5.0", "@dnd-kit/solid": "0.5.0", "@ibm/plex": "6.4.1", "@kobalte/core": "catalog:", @@ -1595,8 +1594,6 @@ "@dnd-kit/geometry": ["@dnd-kit/geometry@0.5.0", "", { "dependencies": { "@dnd-kit/state": "^0.5.0", "tslib": "^2.6.2" } }, "sha512-ubHQS1CiSDH8ssYH2xG5BnpwPSFP1tStXXjug7/Ba6qnQdu/EUH47l6QXKIksQnnanfVfDf0aGeevRxgZlj28A=="], - "@dnd-kit/helpers": ["@dnd-kit/helpers@0.5.0", "", { "dependencies": { "@dnd-kit/abstract": "^0.5.0", "tslib": "^2.6.2" } }, "sha512-i4y+51/icSw+OHMr/su19qhnmNhAzh8PnBwXvapFYTd+64oodIyJRiRkB+hhfxAfnur7RYSW8qacDTrXjg2XOg=="], - "@dnd-kit/solid": ["@dnd-kit/solid@0.5.0", "", { "dependencies": { "@dnd-kit/abstract": "^0.5.0", "@dnd-kit/dom": "^0.5.0", "@dnd-kit/state": "^0.5.0", "tslib": "^2.6.2" }, "peerDependencies": { "solid-js": "^1.8.0" } }, "sha512-IKDqVZICS0jEeUzpJMIIF61w0WA4zisyx9U7K7Skbmkb/kQSDa3lB0cOc0947RwSO+ALoxytRNOuoNfyOIm3lQ=="], "@dnd-kit/state": ["@dnd-kit/state@0.5.0", "", { "dependencies": { "@preact/signals-core": "^1.10.0", "tslib": "^2.6.2" } }, "sha512-y7XbabQqjF58Lk8YmDQuR8l6QjN+Kh4qlGEjUvHuIeasLk1QP+9L5diXS98VMxQIivyMmUtX2//f+3N7qPJX4w=="], diff --git a/packages/app/package.json b/packages/app/package.json index 3d95de2ed348..33cd5a18c6ca 100644 --- a/packages/app/package.json +++ b/packages/app/package.json @@ -58,7 +58,6 @@ "@corvu/drawer": "catalog:", "@dnd-kit/abstract": "0.5.0", "@dnd-kit/dom": "0.5.0", - "@dnd-kit/helpers": "0.5.0", "@dnd-kit/solid": "0.5.0", "@ibm/plex": "6.4.1", "@kobalte/core": "catalog:", diff --git a/packages/app/src/runtime/array-move.test.ts b/packages/app/src/runtime/array-move.test.ts new file mode 100644 index 000000000000..2a69351aae68 --- /dev/null +++ b/packages/app/src/runtime/array-move.test.ts @@ -0,0 +1,19 @@ +import { expect, test } from "bun:test" +import { arrayMove } from "./array-move" + +test("moves an item forward and backward", () => { + expect(arrayMove(["a", "b", "c", "d"], 0, 2)).toEqual(["b", "c", "a", "d"]) + expect(arrayMove(["a", "b", "c", "d"], 3, 1)).toEqual(["a", "d", "b", "c"]) + expect(arrayMove(["a", "b", "c"], 0, 2)).toEqual(["b", "c", "a"]) +}) + +test("does not mutate the input", () => { + const items = ["a", "b", "c"] + arrayMove(items, 0, 2) + expect(items).toEqual(["a", "b", "c"]) +}) + +test("returns the same array when nothing moves", () => { + const items = ["a", "b"] + expect(arrayMove(items, 1, 1)).toBe(items) +}) diff --git a/packages/app/src/runtime/array-move.ts b/packages/app/src/runtime/array-move.ts new file mode 100644 index 000000000000..2765e338c207 --- /dev/null +++ b/packages/app/src/runtime/array-move.ts @@ -0,0 +1,8 @@ +export function arrayMove(items: T[], from: number, to: number) { + if (from === to) return items + + const next = items.slice() + next.splice(to, 0, ...next.splice(from, 1)) + + return next +} diff --git a/packages/app/src/session/composer/queue-panel.tsx b/packages/app/src/session/composer/queue-panel.tsx index 650fdde5dff4..24e58e441eab 100644 --- a/packages/app/src/session/composer/queue-panel.tsx +++ b/packages/app/src/session/composer/queue-panel.tsx @@ -4,7 +4,7 @@ import { isSortable, useSortable } from "@dnd-kit/solid/sortable" import { AutoScroller, Feedback, PointerActivationConstraints } from "@dnd-kit/dom" import { RestrictToVerticalAxis } from "@dnd-kit/abstract/modifiers" import { RestrictToElement } from "@dnd-kit/dom/modifiers" -import { arrayMove } from "@dnd-kit/helpers" +import { arrayMove } from "@/runtime/array-move" import { Button } from "@opencode/ui/button" import { Icon } from "@opencode/ui/icon" import { IconButton } from "@opencode/ui/icon-button" diff --git a/packages/app/src/shell/titlebar/tab-strip.tsx b/packages/app/src/shell/titlebar/tab-strip.tsx index 11a08b6e2299..e7597e5eeb53 100644 --- a/packages/app/src/shell/titlebar/tab-strip.tsx +++ b/packages/app/src/shell/titlebar/tab-strip.tsx @@ -5,7 +5,7 @@ import { isSortable, useSortable } from "@dnd-kit/solid/sortable" import { Accessibility, AutoScroller, Feedback, PointerActivationConstraints } from "@dnd-kit/dom" import { RestrictToHorizontalAxis, RestrictToVerticalAxis } from "@dnd-kit/abstract/modifiers" import { RestrictToElement } from "@dnd-kit/dom/modifiers" -import { arrayMove } from "@dnd-kit/helpers" +import { arrayMove } from "@/runtime/array-move" import { tabHref, tabKey, type SessionTab, type Tab } from "@/shell/tabs/tabs" import { ServerConnection } from "@/runtime/server/registry" import { DraftTabItem, TabNavItem } from "@/shell/titlebar/tab-nav"