| ... | ... | @@ -106,6 +106,7 @@ import { |
| 106 | 106 | resolveFilePreviewPath, |
| 107 | 107 | setMarkdownTaskChecked, |
| 108 | 108 | shouldShowFileExplorer, |
| 109 | workspaceAssetResource, |
| 109 | 110 | } from "./filePreviewMode"; |
| 110 | 111 | import { useFileSaveCoordinator } from "./useFileSaveCoordinator"; |
| 111 | 112 | import { |
| ... | ... | @@ -147,18 +148,23 @@ type FilePostRender = <LAnnotation>( |
| 147 | 148 | function WorkspaceImagePreview(props: { |
| 148 | 149 | readonly environmentId: EnvironmentId; |
| 149 | 150 | readonly threadRef: ScopedThreadRef; |
| 151 | /** The thread is a draft the server does not know yet. */ |
| 152 | readonly draft: boolean; |
| 150 | 153 | readonly absolutePath: string; |
| 151 | 154 | readonly workspaceRoot: string; |
| 152 | 155 | readonly alt: string; |
| 153 | 156 | readonly workspaceMutationId: string | null; |
| 154 | 157 | }) { |
| 155 | 158 | const resource = useMemo( |
| 156 | | () => ({ |
| 157 | | _tag: "workspace-file" as const, |
| 158 | | threadId: props.threadRef.threadId, |
| 159 | | path: props.absolutePath, |
| 160 | | }), |
| 161 | | [props.threadRef.threadId, props.absolutePath], |
| 159 | () => |
| 160 | workspaceAssetResource({ |
| 161 | kind: "workspace-file", |
| 162 | threadRef: props.threadRef, |
| 163 | draft: props.draft, |
| 164 | workspaceRoot: props.workspaceRoot, |
| 165 | absolutePath: props.absolutePath, |
| 166 | }), |
| 167 | [props.threadRef, props.draft, props.workspaceRoot, props.absolutePath], |
| 162 | 168 | ); |
| 163 | 169 | const assetUrl = useAssetUrlState(props.environmentId, resource); |
| 164 | 170 | const [failedUrl, setFailedUrl] = useState<string | null>(null); |
| ... | ... | @@ -213,6 +219,8 @@ function WorkspaceImagePreview(props: { |
| 213 | 219 | function WorkspaceBrowserPreview(props: { |
| 214 | 220 | readonly environmentId: EnvironmentId; |
| 215 | 221 | readonly threadRef: ScopedThreadRef; |
| 222 | /** The thread is a draft the server does not know yet. */ |
| 223 | readonly draft: boolean; |
| 216 | 224 | readonly absolutePath: string; |
| 217 | 225 | readonly workspaceRoot: string; |
| 218 | 226 | readonly title: string; |
| ... | ... | @@ -221,12 +229,15 @@ function WorkspaceBrowserPreview(props: { |
| 221 | 229 | const insideWorkspace = |
| 222 | 230 | mediaFileReference(props.absolutePath, props.workspaceRoot).relativePath !== undefined; |
| 223 | 231 | const resource = useMemo( |
| 224 | | () => ({ |
| 225 | | _tag: insideWorkspace ? ("workspace-file" as const) : ("media-file" as const), |
| 226 | | threadId: props.threadRef.threadId, |
| 227 | | path: props.absolutePath, |
| 228 | | }), |
| 229 | | [insideWorkspace, props.threadRef.threadId, props.absolutePath], |
| 232 | () => |
| 233 | workspaceAssetResource({ |
| 234 | kind: insideWorkspace ? "workspace-file" : "media-file", |
| 235 | threadRef: props.threadRef, |
| 236 | draft: props.draft, |
| 237 | workspaceRoot: props.workspaceRoot, |
| 238 | absolutePath: props.absolutePath, |
| 239 | }), |
| 240 | [insideWorkspace, props.threadRef, props.draft, props.workspaceRoot, props.absolutePath], |
| 230 | 241 | ); |
| 231 | 242 | const assetUrl = useAssetUrlState(props.environmentId, resource); |
| 232 | 243 | const revisionSuffix = |
| ... | ... | @@ -260,18 +271,23 @@ function WorkspaceBrowserPreview(props: { |
| 260 | 271 | function WorkspaceVideoPreview(props: { |
| 261 | 272 | readonly environmentId: EnvironmentId; |
| 262 | 273 | readonly threadRef: ScopedThreadRef; |
| 274 | /** The thread is a draft the server does not know yet. */ |
| 275 | readonly draft: boolean; |
| 263 | 276 | readonly absolutePath: string; |
| 264 | 277 | readonly workspaceRoot: string; |
| 265 | 278 | readonly name: string; |
| 266 | 279 | readonly workspaceMutationId: string | null; |
| 267 | 280 | }) { |
| 268 | 281 | const resource = useMemo( |
| 269 | | () => ({ |
| 270 | | _tag: "media-file" as const, |
| 271 | | threadId: props.threadRef.threadId, |
| 272 | | path: props.absolutePath, |
| 273 | | }), |
| 274 | | [props.threadRef.threadId, props.absolutePath], |
| 282 | () => |
| 283 | workspaceAssetResource({ |
| 284 | kind: "media-file", |
| 285 | threadRef: props.threadRef, |
| 286 | draft: props.draft, |
| 287 | workspaceRoot: props.workspaceRoot, |
| 288 | absolutePath: props.absolutePath, |
| 289 | }), |
| 290 | [props.threadRef, props.draft, props.workspaceRoot, props.absolutePath], |
| 275 | 291 | ); |
| 276 | 292 | const assetUrl = useAssetUrlState(props.environmentId, resource); |
| 277 | 293 | const refreshAssetUrl = useAssetUrlRefresh(props.environmentId, resource); |
| ... | ... | @@ -314,17 +330,23 @@ function WorkspaceVideoPreview(props: { |
| 314 | 330 | function WorkspaceAudioPreview(props: { |
| 315 | 331 | readonly environmentId: EnvironmentId; |
| 316 | 332 | readonly threadRef: ScopedThreadRef; |
| 333 | /** The thread is a draft the server does not know yet. */ |
| 334 | readonly draft: boolean; |
| 317 | 335 | readonly absolutePath: string; |
| 336 | readonly workspaceRoot: string; |
| 318 | 337 | readonly name: string; |
| 319 | 338 | readonly workspaceMutationId: string | null; |
| 320 | 339 | }) { |
| 321 | 340 | const resource = useMemo( |
| 322 | | () => ({ |
| 323 | | _tag: "media-file" as const, |
| 324 | | threadId: props.threadRef.threadId, |
| 325 | | path: props.absolutePath, |
| 326 | | }), |
| 327 | | [props.threadRef.threadId, props.absolutePath], |
| 341 | () => |
| 342 | workspaceAssetResource({ |
| 343 | kind: "media-file", |
| 344 | threadRef: props.threadRef, |
| 345 | draft: props.draft, |
| 346 | workspaceRoot: props.workspaceRoot, |
| 347 | absolutePath: props.absolutePath, |
| 348 | }), |
| 349 | [props.threadRef, props.draft, props.workspaceRoot, props.absolutePath], |
| 328 | 350 | ); |
| 329 | 351 | const assetUrl = useAssetUrlState(props.environmentId, resource); |
| 330 | 352 | const refreshAssetUrl = useAssetUrlRefresh(props.environmentId, resource); |
| ... | ... | @@ -1022,6 +1044,8 @@ export default function FilePreviewPanel({ |
| 1022 | 1044 | }: FilePreviewPanelProps) { |
| 1023 | 1045 | const relativePath = |
| 1024 | 1046 | attachment === undefined ? resolveFilePreviewPath(requestedPath, cwd) : requestedPath; |
| 1047 | // A draft's composer target is its draft id; a thread the server knows is a ref. |
| 1048 | const draft = typeof composerDraftTarget === "string"; |
| 1025 | 1049 | const { resolvedTheme } = useTheme(); |
| 1026 | 1050 | const wordWrap = useClientSettings((settings) => settings.wordWrap); |
| 1027 | 1051 | const canOperatePreview = useEnvironmentScope(environmentId, AuthPreviewOperateScope); |
| ... | ... | @@ -1334,6 +1358,7 @@ export default function FilePreviewPanel({ |
| 1334 | 1358 | key={`${environmentId}:${threadRef.threadId}:${absolutePath}`} |
| 1335 | 1359 | environmentId={environmentId} |
| 1336 | 1360 | threadRef={threadRef} |
| 1361 | draft={draft} |
| 1337 | 1362 | absolutePath={absolutePath} |
| 1338 | 1363 | workspaceRoot={cwd} |
| 1339 | 1364 | name={relativePath} |
| ... | ... | @@ -1344,7 +1369,9 @@ export default function FilePreviewPanel({ |
| 1344 | 1369 | key={`${environmentId}:${threadRef.threadId}:${absolutePath}`} |
| 1345 | 1370 | environmentId={environmentId} |
| 1346 | 1371 | threadRef={threadRef} |
| 1372 | draft={draft} |
| 1347 | 1373 | absolutePath={absolutePath} |
| 1374 | workspaceRoot={cwd} |
| 1348 | 1375 | name={relativePath} |
| 1349 | 1376 | workspaceMutationId={workspaceMutationId} |
| 1350 | 1377 | /> |
| ... | ... | @@ -1353,6 +1380,7 @@ export default function FilePreviewPanel({ |
| 1353 | 1380 | key={absolutePath} |
| 1354 | 1381 | environmentId={environmentId} |
| 1355 | 1382 | threadRef={threadRef} |
| 1383 | draft={draft} |
| 1356 | 1384 | absolutePath={absolutePath} |
| 1357 | 1385 | workspaceRoot={cwd} |
| 1358 | 1386 | alt={relativePath} |
| ... | ... | @@ -1363,6 +1391,7 @@ export default function FilePreviewPanel({ |
| 1363 | 1391 | key={absolutePath} |
| 1364 | 1392 | environmentId={environmentId} |
| 1365 | 1393 | threadRef={threadRef} |
| 1394 | draft={draft} |
| 1366 | 1395 | absolutePath={absolutePath} |
| 1367 | 1396 | workspaceRoot={cwd} |
| 1368 | 1397 | title={relativePath} |