1import { createContext, useContext } from "react";
2import { MediaVideoPlayer } from "../../components/MediaVideoPlayer";
3import { useAssetUrlState, useRefreshAssetUrl } from "../../state/assets";
4import {
5 mediaVideoPreviewUri,
6 mediaVideoThumbnailKey,
7 type MediaVideoPreviewSource,
8} from "../../lib/videoPreviewSource";
9
10export const ThreadMediaVisibleContext = createContext(false);
11
12export function ThreadMarkdownVideo(props: {
13 readonly source: MediaVideoPreviewSource;
14 readonly thumbnailVisible?: boolean;
15}) {
16 const { source } = props;
17 const feedVisible = useContext(ThreadMediaVisibleContext);
18 const visible = props.thumbnailVisible ?? feedVisible;
19 const thumbnailKey = mediaVideoThumbnailKey(source);
20 const asset = useAssetUrlState(
21 "environmentId" in source ? source.environmentId : null,
22 "resource" in source ? source.resource : null,
23 );
24 const refreshAssetUrl = useRefreshAssetUrl(
25 "environmentId" in source ? source.environmentId : null,
26 "resource" in source ? source.resource : null,
27 );
28 const uri = mediaVideoPreviewUri(source, asset._tag === "Success" ? asset.url : null);
29 return (
30 <MediaVideoPlayer
31 key={thumbnailKey}
32 uri={uri}
33 resolvePlaybackUri={
34 "resource" in source
35 ? async () => mediaVideoPreviewUri(source, await refreshAssetUrl())
36 : undefined
37 }
38 name={source.name}
39 thumbnailKey={thumbnailKey}
40 thumbnailVisible={visible}
41 unavailable={"resource" in source && asset._tag === "Failure"}
42 actionsSource={source.actionsSource}
43 />
44 );
45}