Request root sessions before applying the session list limit so child sessions cannot crowd roots out of the switcher. Keep the synchronized cache available while requests are pending or fail, reconcile results with live updates, and retain current and pinned sessions. Preserve selection by session ID when asynchronous results reorder the list. Closes #16270 Closes #32725
67 lines
2.4 KiB
TypeScript
67 lines
2.4 KiB
TypeScript
/** @jsxImportSource @opentui/solid */
|
|
import { testRender } from "@opentui/solid"
|
|
import { onMount } from "solid-js"
|
|
import { ArgsProvider } from "../../../../src/context/args"
|
|
import { KVProvider, useKV } from "../../../../src/context/kv"
|
|
import { ProjectProvider, useProject } from "../../../../src/context/project"
|
|
import { SDKProvider } from "../../../../src/context/sdk"
|
|
import { SyncProvider, useSync } from "../../../../src/context/sync"
|
|
import { ExitProvider } from "../../../../src/context/exit"
|
|
import { createEventSource, createFetch, type FetchHandler, directory } from "../../../fixture/tui-sdk"
|
|
import { TestTuiContexts } from "../../../fixture/tui-environment"
|
|
export { createEventSource, createFetch, directory, eventSource, json, worktree } from "../../../fixture/tui-sdk"
|
|
|
|
export async function wait(fn: () => boolean, timeout = 2000) {
|
|
const start = Date.now()
|
|
while (!fn()) {
|
|
if (Date.now() - start > timeout) throw new Error("timed out waiting for condition")
|
|
await Bun.sleep(10)
|
|
}
|
|
}
|
|
|
|
type Ctx = { kv: ReturnType<typeof useKV>; project: ReturnType<typeof useProject>; sync: ReturnType<typeof useSync> }
|
|
|
|
export async function mount(override?: FetchHandler, state?: string) {
|
|
const calls = createFetch(override)
|
|
const events = createEventSource()
|
|
let sync!: ReturnType<typeof useSync>
|
|
let project!: ReturnType<typeof useProject>
|
|
let kv!: ReturnType<typeof useKV>
|
|
let done!: () => void
|
|
const ready = new Promise<void>((resolve) => {
|
|
done = resolve
|
|
})
|
|
|
|
function Probe() {
|
|
const ctx: Ctx = { kv: useKV(), project: useProject(), sync: useSync() }
|
|
onMount(() => {
|
|
sync = ctx.sync
|
|
project = ctx.project
|
|
kv = ctx.kv
|
|
done()
|
|
})
|
|
return <box />
|
|
}
|
|
|
|
const app = await testRender(() => (
|
|
<TestTuiContexts paths={state ? { state } : undefined}>
|
|
<ArgsProvider>
|
|
<KVProvider>
|
|
<SDKProvider url="http://test" directory={directory} fetch={calls.fetch} events={events.source}>
|
|
<ProjectProvider>
|
|
<ExitProvider exit={() => {}}>
|
|
<SyncProvider>
|
|
<Probe />
|
|
</SyncProvider>
|
|
</ExitProvider>
|
|
</ProjectProvider>
|
|
</SDKProvider>
|
|
</KVProvider>
|
|
</ArgsProvider>
|
|
</TestTuiContexts>
|
|
))
|
|
|
|
await ready
|
|
await wait(() => sync.status === "complete")
|
|
return { app, emit: events.emit, kv, project, sync, session: calls.session }
|
|
}
|