| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112 | 
							- '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<OutputPanelProps> = ({
 
-   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 (
 
-     <div className='p-2'>
 
-       {isRunning && (
 
-         <div className='pl-[26px] pt-4'>
 
-           <LoadingAnim type='text' />
 
-         </div>
 
-       )}
 
-       {!isRunning && error && (
 
-         <div className='px-4'>
 
-           <StatusContainer status='failed'>{error}</StatusContainer>
 
-         </div>
 
-       )}
 
-       {!isRunning && !outputs && (
 
-         <div className='px-4 py-2'>
 
-           <Markdown content='No Output' />
 
-         </div>
 
-       )}
 
-       {isTextOutput && (
 
-         <div className='px-4 py-2'>
 
-           <Markdown
 
-             content={
 
-               Array.isArray(outputs[Object.keys(outputs)[0]])
 
-                 ? outputs[Object.keys(outputs)[0]].join('\n')
 
-                 : (outputs[Object.keys(outputs)[0]] || '')
 
-             }
 
-           />
 
-         </div>
 
-       )}
 
-       {fileList.length > 0 && (
 
-         <div className='px-4 py-2'>
 
-           <FileList
 
-             files={fileList}
 
-             showDeleteAction={false}
 
-             showDownloadAction
 
-             canPreview
 
-           />
 
-         </div>
 
-       )}
 
-       {!isTextOutput && outputs && Object.keys(outputs).length > 0 && height! > 0 && (
 
-         <div className='flex flex-col gap-2'>
 
-           <CodeEditor
 
-             showFileList
 
-             readOnly
 
-             title={<div tabIndex={0}>Output</div>}
 
-             language={CodeLanguage.json}
 
-             value={JSON.stringify(outputs, null, 2)}
 
-             isJSONStringifyBeauty
 
-             height={height ? (height - 16) / 2 : undefined}
 
-           />
 
-         </div>
 
-       )}
 
-     </div>
 
-   )
 
- }
 
- export default OutputPanel
 
 
  |