49 lines · 1.9 KB · TypeScript
RawDownload
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 } };}