import { useAtomValue } from "@effect/atom-react"; import { useId, useMemo, useState } from "react"; import { ActivityIndicator, Image, Pressable, View } from "react-native"; import { AsyncResult } from "effect/unstable/reactivity"; import { AppText as Text } from "../../components/AppText"; import { EmptyState } from "../../components/EmptyState"; import { workspaceFileImageAtom } from "./workspace-file-image-cache"; import { FilePreviewModal, type FilePreviewSource } from "../../components/FilePreviewModal"; import { PresentationSource } from "../../components/NativePresentation"; function ResolvedWorkspaceFileImagePreview(props: { readonly accessibilityLabel: string; readonly uri: string; }) { const [loadError, setLoadError] = useState(null); const [preview, setPreview] = useState(null); const sourceIdentifier = useId(); const imageSource = useMemo( () => ({ uri: props.uri, cache: "force-cache" as const }), [props.uri], ); return ( setPreview({ kind: "image", uri: props.uri, name: props.accessibilityLabel, sourceIdentifier, }) } > setLoadError(null)} onError={(event) => { setLoadError(event.nativeEvent.error || "The image could not be rendered."); }} /> {loadError !== null ? ( ) : null} setPreview(null)} /> ); } function CachedWorkspaceFileImagePreview(props: { readonly accessibilityLabel: string; readonly uri: string; }) { const imageAtom = useMemo(() => workspaceFileImageAtom(props.uri), [props.uri]); const imageResult = useAtomValue(imageAtom); if (AsyncResult.isFailure(imageResult)) { return ( ); } if (!AsyncResult.isSuccess(imageResult)) { return ( Loading image... ); } return ( ); } export function WorkspaceFileImagePreview(props: { readonly accessibilityLabel: string; readonly uri: string | null; }) { if (props.uri === null) { return ( Preparing image preview... ); } return ( ); }