import { type EnvironmentConnectionPhase } from "@t3tools/client-runtime/connection"; export type ThreadContentPresentation = | { readonly kind: "ready" } | { readonly kind: "loading" } | { readonly kind: "unavailable"; readonly title: string; readonly detail: string; }; export function projectThreadContentPresentation(input: { readonly hasDetail: boolean; readonly detailError: string | null; readonly detailDeleted: boolean; readonly connectionState: EnvironmentConnectionPhase;}): ThreadContentPresentation { if (input.hasDetail) { return { kind: "ready" }; } if (input.detailDeleted) { return { kind: "unavailable", title: "Thread unavailable", detail: "This thread was deleted or is no longer available.", }; } if (input.detailError !== null) { return { kind: "unavailable", title: "Could not load conversation", detail: input.detailError, }; } if ( input.connectionState === "connected" || input.connectionState === "connecting" || input.connectionState === "reconnecting" ) { // Messages will arrive once the (re)connection completes — present as // loading; the composer's connection pill reports the connection phase. return { kind: "loading" }; } return { kind: "unavailable", title: "Messages not cached", detail: "Reconnect this environment to load the conversation.", };}
import { type EnvironmentConnectionPhase } from "@t3tools/client-runtime/connection";
export type ThreadContentPresentation =
| { readonly kind: "ready" }
| { readonly kind: "loading" }
| {
readonly kind: "unavailable";
readonly title: string;
readonly detail: string;
};
export function projectThreadContentPresentation(input: {
readonly hasDetail: boolean;
readonly detailError: string | null;
readonly detailDeleted: boolean;
readonly connectionState: EnvironmentConnectionPhase;
}): ThreadContentPresentation {
if (input.hasDetail) {
return { kind: "ready" };
}
if (input.detailDeleted) {
return {
kind: "unavailable",
title: "Thread unavailable",
detail: "This thread was deleted or is no longer available.",
};
}
if (input.detailError !== null) {
return {
kind: "unavailable",
title: "Could not load conversation",
detail: input.detailError,
};
}
if (
input.connectionState === "connected" ||
input.connectionState === "connecting" ||
input.connectionState === "reconnecting"
) {
// Messages will arrive once the (re)connection completes — present as
// loading; the composer's connection pill reports the connection phase.
return { kind: "loading" };
}
return {
kind: "unavailable",
title: "Messages not cached",
detail: "Reconnect this environment to load the conversation.",
};
}