'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(() => { return outputs && Object.keys(outputs).length === 1 && typeof outputs[Object.keys(outputs)[0]] === '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 && (
)} {outputs && Object.keys(outputs).length > 1 && height! > 0 && (
} language={CodeLanguage.json} value={outputs} isJSONStringifyBeauty height={height ? (height - 16) / 2 : undefined} />
)} ) } export default OutputPanel