'use client' import type { FC } from 'react' import { useMemo } from 'react' import CodeEditor from '@/app/components/workflow/nodes/_base/components/editor/code-editor' import { CodeLanguage } from '@/app/components/workflow/nodes/code/types' import { Markdown } from '@/app/components/base/markdown' import LoadingAnim from '@/app/components/base/chat/chat/loading-anim' import { FileList } from '@/app/components/base/file-uploader' import StatusContainer from '@/app/components/workflow/run/status-container' import { getProcessedFilesFromResponse } from '@/app/components/base/file-uploader/utils' type OutputPanelProps = { isRunning?: boolean outputs?: any error?: string height?: number } const OutputPanel: FC = ({ isRunning, outputs, error, height, }) => { const isTextOutput = useMemo(() => { if (!outputs || typeof outputs !== 'object') return false const keys = Object.keys(outputs) const value = outputs[keys[0]] return keys.length === 1 && ( typeof value === 'string' || (Array.isArray(value) && value.every(item => typeof item === 'string')) ) }, [outputs]) const fileList = useMemo(() => { const fileList: any[] = [] if (!outputs) return fileList if (Object.keys(outputs).length > 1) return fileList for (const key in outputs) { if (Array.isArray(outputs[key])) { outputs[key].map((output: any) => { if (output?.dify_model_identity === '__dify__file__') fileList.push(output) return null }) } else if (outputs[key]?.dify_model_identity === '__dify__file__') { fileList.push(outputs[key]) } } return getProcessedFilesFromResponse(fileList) }, [outputs]) return (
{isRunning && (
)} {!isRunning && error && (
{error}
)} {!isRunning && !outputs && (
)} {isTextOutput && (
)} {fileList.length > 0 && (
)} {!isTextOutput && outputs && Object.keys(outputs).length > 0 && height! > 0 && (
Output
} language={CodeLanguage.json} value={JSON.stringify(outputs, null, 2)} isJSONStringifyBeauty height={height ? (height - 16) / 2 : undefined} />
)} ) } export default OutputPanel