diff --git a/web/app/components/workflow/skill/editor/skill-editor/plugins/file-reference-block/file-preview-panel.tsx b/web/app/components/workflow/skill/editor/skill-editor/plugins/file-reference-block/file-preview-panel.tsx index 0a4f2f6e9d..1d56d9120b 100644 --- a/web/app/components/workflow/skill/editor/skill-editor/plugins/file-reference-block/file-preview-panel.tsx +++ b/web/app/components/workflow/skill/editor/skill-editor/plugins/file-reference-block/file-preview-panel.tsx @@ -8,10 +8,9 @@ import { useStore as useAppStore } from '@/app/components/app/store' import FileTypeIcon from '@/app/components/base/file-uploader/file-type-icon' import Loading from '@/app/components/base/loading' import Tooltip from '@/app/components/base/tooltip' -import SkillEditor from '@/app/components/workflow/skill/editor/skill-editor' -import { useFileTypeInfo } from '@/app/components/workflow/skill/hooks/use-file-type-info' import { getFileIconType } from '@/app/components/workflow/skill/utils/file-utils' -import { useGetAppAssetFileContent } from '@/service/use-app-asset' +import ReadOnlyFilePreview from '@/app/components/workflow/skill/viewer/read-only-file-preview' +import { useGetAppAssetFileDownloadUrl } from '@/service/use-app-asset' import { cn } from '@/utils/classnames' type FilePreviewPanelProps = { @@ -27,21 +26,11 @@ const FilePreviewPanel = ({ resourceId, currentNode, className, style, onClose } const appId = useAppStore(s => s.appDetail?.id || '') const isFolder = currentNode?.node_type === 'folder' - const fileTypeInfo = useFileTypeInfo(isFolder ? undefined : currentNode) - const canPreviewText = !isFolder && fileTypeInfo.isEditable - - const { data: fileContent, isLoading, error } = useGetAppAssetFileContent(appId, resourceId, { - enabled: canPreviewText, + const isPreviewEnabled = !isFolder && Boolean(appId && resourceId) + const { data: downloadUrlData, isLoading, error } = useGetAppAssetFileDownloadUrl(appId, resourceId, { + enabled: isPreviewEnabled, }) - const content = useMemo(() => { - if (!canPreviewText || !fileContent) - return '' - if (typeof fileContent?.content === 'string') - return fileContent.content - return JSON.stringify(fileContent, null, 2) - }, [canPreviewText, fileContent]) - const pathSegments = useMemo( () => (currentNode?.path ?? '').split('/').filter(Boolean), [currentNode?.path], @@ -57,6 +46,8 @@ const FilePreviewPanel = ({ resourceId, currentNode, className, style, onClose } ? getFileIconType(currentNode.name, currentNode.extension) : null + const downloadUrl = downloadUrlData?.download_url || '' + const displayFileName = fileName ?? currentNode?.name ?? resourceId const canOpenInEditor = Boolean(resourceId && !isFolder && typeof window !== 'undefined') const handleOpenInEditor = useCallback(() => { @@ -134,31 +125,29 @@ const FilePreviewPanel = ({ resourceId, currentNode, className, style, onClose } {t('skillEditor.previewUnavailable')} )} - {!isFolder && !fileTypeInfo.isEditable && ( -
- {t('skillEditor.unsupportedPreview')} -
- )} - {canPreviewText && isLoading && ( + {isPreviewEnabled && isLoading && (
)} - {canPreviewText && error && ( + {isPreviewEnabled && error && (
{t('skillSidebar.loadError')}
)} - {canPreviewText && !isLoading && !error && ( - )} + {isPreviewEnabled && !isLoading && !error && !downloadUrl && ( +
+ {t('skillSidebar.loadError')} +
+ )} )