feat(app): draggable tabs (#31364)

Co-authored-by: LukeParkerDev <10430890+Hona@users.noreply.github.com>
This commit is contained in:
Aarav Sareen 2026-06-25 10:36:49 +05:30 committed by GitHub
commit d5aa5ff8fb
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
12 changed files with 1504 additions and 384 deletions

View file

@ -1,8 +1,38 @@
import { describe, expect, test } from "bun:test"
import { ServerConnection } from "@/context/server"
import { legacySessionHref, requireServerKey, rootSession, selectSessionLineage, sessionHref } from "./session-route"
import {
legacySessionHref,
legacySessionServer,
requireServerKey,
rootSession,
selectSessionLineage,
sessionHref,
} from "./session-route"
describe("session routes", () => {
test("uses the unique persisted server for a legacy session route", () => {
expect(
legacySessionServer(
[{ type: "session", server: ServerConnection.Key.make("server-b"), sessionId: "session-1" }],
"session-1",
ServerConnection.Key.make("server-a"),
),
).toBe(ServerConnection.Key.make("server-b"))
})
test("prefers the active server when a legacy session ID is ambiguous", () => {
expect(
legacySessionServer(
[
{ type: "session", server: ServerConnection.Key.make("server-a"), sessionId: "session-1" },
{ type: "session", server: ServerConnection.Key.make("server-b"), sessionId: "session-1" },
],
"session-1",
ServerConnection.Key.make("server-b"),
),
).toBe(ServerConnection.Key.make("server-b"))
})
test("builds and decodes a server-keyed session route", () => {
const server = ServerConnection.Key.make("https://example.com:4096")
const href = sessionHref(server, "session-1")

View file

@ -16,6 +16,15 @@ export function requireServerKey(segment: string | undefined) {
return ServerConnection.Key.make(key)
}
export function legacySessionServer(
tabs: readonly { type: "session"; server: ServerConnection.Key; sessionId: string }[],
sessionID: string,
active: ServerConnection.Key,
) {
const matches = tabs.filter((tab) => tab.sessionId === sessionID)
return matches.find((tab) => tab.server === active)?.server ?? (matches.length === 1 ? matches[0]?.server : active)
}
type SessionParent = { id: string; parentID?: string }
export function selectSessionLineage<T extends { session: { id: string } }>(