import { resolveMediaSource } from "@t3tools/client-runtime/media-source";import type { EnvironmentId, ThreadId } from "@t3tools/contracts";import { normalizeNativeMarkdownUrl } from "@t3tools/mobile-markdown-text/links"; import type { FilePreviewSource } from "../components/FilePreviewModal";import type { MediaVideoPreviewSource } from "./videoPreviewSource";import type { MediaActionsSource } from "./mediaActions"; /** Resolves only explicit media references. Ordinary links keep their existing navigation. */export function resolveMarkdownMediaPreview( href: string, input: { readonly environmentId: EnvironmentId; readonly threadId: ThreadId; readonly workspaceRoot: string | null | undefined; /** Image syntax can target an endpoint without a recognizable extension. */ readonly imageEmbed?: boolean; },): | { readonly kind: "image"; readonly source: FilePreviewSource } | { readonly kind: "video"; readonly source: MediaVideoPreviewSource } | null { const media = resolveMediaSource(href, input); if (media === null || media.access === "unavailable") return null; const { kind, name, mimeType, reference, srcFragment } = media; const target = media.access === "direct" ? { uri: normalizeNativeMarkdownUrl(media.uri) } : { environmentId: input.environmentId, resource: media.resource, ...(srcFragment ? { srcFragment } : {}), }; const actionsSource: MediaActionsSource = media.access === "direct" ? { reference, uri: media.uri, name, mimeType } : { reference, environmentId: input.environmentId, threadId: input.threadId, resource: media.resource, name, mimeType, }; return kind === "video" ? { kind, source: { type: "media", name, mimeType, ...target, actionsSource } } : { kind, source: { kind, name, ...target, actionsSource } };}
import { resolveMediaSource } from "@t3tools/client-runtime/media-source";
import type { EnvironmentId, ThreadId } from "@t3tools/contracts";
import { normalizeNativeMarkdownUrl } from "@t3tools/mobile-markdown-text/links";
import type { FilePreviewSource } from "../components/FilePreviewModal";
import type { MediaVideoPreviewSource } from "./videoPreviewSource";
import type { MediaActionsSource } from "./mediaActions";
/** Resolves only explicit media references. Ordinary links keep their existing navigation. */
export function resolveMarkdownMediaPreview(
href: string,
input: {
readonly environmentId: EnvironmentId;
readonly threadId: ThreadId;
readonly workspaceRoot: string | null | undefined;
/** Image syntax can target an endpoint without a recognizable extension. */
readonly imageEmbed?: boolean;
},
):
| { readonly kind: "image"; readonly source: FilePreviewSource }
| { readonly kind: "video"; readonly source: MediaVideoPreviewSource }
| null {
const media = resolveMediaSource(href, input);
if (media === null || media.access === "unavailable") return null;
const { kind, name, mimeType, reference, srcFragment } = media;
const target =
media.access === "direct"
? { uri: normalizeNativeMarkdownUrl(media.uri) }
: {
environmentId: input.environmentId,
resource: media.resource,
...(srcFragment ? { srcFragment } : {}),
};
const actionsSource: MediaActionsSource =
media.access === "direct"
? { reference, uri: media.uri, name, mimeType }
: {
reference,
environmentId: input.environmentId,
threadId: input.threadId,
resource: media.resource,
name,
mimeType,
};
return kind === "video"
? { kind, source: { type: "media", name, mimeType, ...target, actionsSource } }
: { kind, source: { kind, name, ...target, actionsSource } };
}