@@ -17,7 +17,7 @@ import * as Schema from "effect/Schema";
1717import { useCallback , useEffect , useMemo , useRef , useState } from "react" ;
1818
1919import { isBrowserPreviewFile , openFileInPreview } from "~/browser/openFileInPreview" ;
20- import { useAssetUrl } from "~/assets/assetUrls" ;
20+ import { useAssetUrlState } from "~/assets/assetUrls" ;
2121import ChatMarkdown from "~/components/ChatMarkdown" ;
2222import { OpenInPicker } from "~/components/chat/OpenInPicker" ;
2323import { useClientSettings } from "~/hooks/useSettings" ;
@@ -121,15 +121,29 @@ function WorkspaceImagePreview(props: {
121121 readonly absolutePath : string ;
122122 readonly alt : string ;
123123} ) {
124- const src = useAssetUrl ( props . environmentId , {
124+ const assetUrl = useAssetUrlState ( props . environmentId , {
125125 _tag : "workspace-file" ,
126126 threadId : props . threadRef . threadId ,
127127 path : props . absolutePath ,
128128 } ) ;
129+ const [ failedUrl , setFailedUrl ] = useState < string | null > ( null ) ;
129130
130- return src ? (
131+ if ( assetUrl . _tag === "Failure" || ( assetUrl . _tag === "Success" && failedUrl === assetUrl . url ) ) {
132+ return (
133+ < div className = "flex min-h-0 flex-1 items-center justify-center px-6 text-center text-xs leading-relaxed text-destructive" >
134+ Unable to load workspace image.
135+ </ div >
136+ ) ;
137+ }
138+
139+ return assetUrl . _tag === "Success" ? (
131140 < div className = "flex min-h-0 flex-1 items-center justify-center overflow-auto p-4" >
132- < img className = "max-h-full max-w-full object-contain" src = { src } alt = { props . alt } />
141+ < img
142+ className = "max-h-full max-w-full object-contain"
143+ src = { assetUrl . url }
144+ alt = { props . alt }
145+ onError = { ( ) => setFailedUrl ( assetUrl . url ) }
146+ />
133147 </ div >
134148 ) : (
135149 < div className = "flex min-h-0 flex-1 items-center justify-center text-muted-foreground" >
0 commit comments