import { scopeThreadRef } from "@t3tools/client-runtime/environment"; import type { EnvironmentId, ScopedThreadRef, ThreadId } from "@t3tools/contracts"; import type { DraftId } from "./composerDraftStore"; export type ThreadRouteTarget = | { kind: "server"; threadRef: ScopedThreadRef; } | { kind: "draft"; draftId: DraftId; }; type DraftThreadRouteState = { environmentId: EnvironmentId; threadId: ThreadId; promotedTo?: ScopedThreadRef | null; }; export type ThreadRouteRenderState = "loading" | "ready" | "missing"; export function resolveThreadRouteRenderState(input: { bootstrapComplete: boolean; serverThreadShellExists: boolean; serverThreadDetailExists: boolean; serverThreadDetailDeleted: boolean; draftThreadExists: boolean; }): ThreadRouteRenderState { if (!input.bootstrapComplete) { return "loading"; } if (input.serverThreadDetailExists || input.draftThreadExists) { return "ready"; } if (input.serverThreadDetailDeleted) { return "missing"; } return input.serverThreadShellExists ? "loading" : "missing"; } export function buildThreadRouteParams(ref: ScopedThreadRef): { environmentId: EnvironmentId; threadId: ThreadId; } { return { environmentId: ref.environmentId, threadId: ref.threadId, }; } export function buildDraftThreadRouteParams(draftId: DraftId): { draftId: DraftId; } { return { draftId }; } export function resolveThreadRouteRef( params: Partial>, ): ScopedThreadRef | null { if (!params.environmentId || !params.threadId) { return null; } return scopeThreadRef(params.environmentId as EnvironmentId, params.threadId as ThreadId); } export function resolveThreadRouteTarget( params: Partial>, ): ThreadRouteTarget | null { if (params.environmentId && params.threadId) { return { kind: "server", threadRef: scopeThreadRef(params.environmentId as EnvironmentId, params.threadId as ThreadId), }; } if (!params.draftId) { return null; } return { kind: "draft", draftId: params.draftId as DraftId, }; } /** * Resolves the thread represented by either a canonical thread route or a * draft route whose promotion to a server thread has been recorded. */ export function resolveActiveThreadRouteRef( target: ThreadRouteTarget | null, draftThread: DraftThreadRouteState | null, ): ScopedThreadRef | null { if (target?.kind === "server") { return target.threadRef; } if (target?.kind !== "draft" || !draftThread?.promotedTo) { return null; } return draftThread.promotedTo; }