import type { EnvironmentId, PreviewOpenInput, PreviewSessionSnapshot, ScopedThreadRef, } from "@t3tools/contracts"; import type { AtomCommandResult } from "@t3tools/client-runtime/state/runtime"; import type { PreviewStateStoreState } from "~/previewStateStore"; interface OpenPreviewSessionInput { openPreview: (input: { readonly environmentId: EnvironmentId; readonly input: PreviewOpenInput; }) => Promise>; threadRef: ScopedThreadRef; url: string; applyServerSnapshot: PreviewStateStoreState["applyServerSnapshot"]; rememberUrl: PreviewStateStoreState["rememberUrl"]; } export async function openPreviewSession( input: OpenPreviewSessionInput, ): Promise> { const result = await input.openPreview({ environmentId: input.threadRef.environmentId, input: { threadId: input.threadRef.threadId, url: input.url, }, }); if (result._tag === "Failure") { return result; } const snapshot = result.value; input.applyServerSnapshot(input.threadRef, snapshot); input.rememberUrl( input.threadRef, snapshot.navStatus._tag === "Idle" ? input.url : snapshot.navStatus.url, ); return result; }