'use client' import type { FC } from 'react' import type { PromptConfig } from '@/models/debug' import type { SiteInfo } from '@/models/share' import type { AppSourceType } from '@/service/share' import type { VisionFile, VisionSettings } from '@/types/app' import { t } from 'i18next' import * as React from 'react' import TextGenerationRes from '@/app/components/app/text-generate/item' import Button from '@/app/components/base/button' import Loading from '@/app/components/base/loading' import Toast from '@/app/components/base/toast' import NoData from '@/app/components/share/text-generation/no-data' import { useResultRunState } from './hooks/use-result-run-state' import { useResultSender } from './hooks/use-result-sender' export type IResultProps = { isWorkflow: boolean isCallBatchAPI: boolean isPC: boolean isMobile: boolean appSourceType: AppSourceType appId?: string isError: boolean isShowTextToSpeech: boolean promptConfig: PromptConfig | null moreLikeThisEnabled: boolean inputs: Record controlSend?: number controlRetry?: number controlStopResponding?: number onShowRes: () => void handleSaveMessage: (messageId: string) => void taskId?: number onCompleted: (completionRes: string, taskId?: number, success?: boolean) => void visionConfig: VisionSettings completionFiles: VisionFile[] siteInfo: SiteInfo | null onRunStart: () => void onRunControlChange?: (control: { onStop: () => Promise | void, isStopping: boolean } | null) => void hideInlineStopButton?: boolean } const Result: FC = ({ isWorkflow, isCallBatchAPI, isPC, isMobile, appSourceType, appId, isError, isShowTextToSpeech, promptConfig, moreLikeThisEnabled, inputs, controlSend, controlRetry, controlStopResponding, onShowRes, handleSaveMessage, taskId, onCompleted, visionConfig, completionFiles, siteInfo, onRunStart, onRunControlChange, hideInlineStopButton = false, }) => { const { notify } = Toast const runState = useResultRunState({ appId, appSourceType, controlStopResponding, isWorkflow, notify, onRunControlChange, }) const { handleSend } = useResultSender({ appId, appSourceType, completionFiles, controlRetry, controlSend, inputs, isCallBatchAPI, isPC, isWorkflow, notify, onCompleted, onRunStart, onShowRes, promptConfig, runState, t, taskId, visionConfig, }) const isNoData = !runState.completionRes const renderTextGenerationRes = () => ( <> {!hideInlineStopButton && runState.isResponding && runState.currentTaskId && (
)} ) return ( <> {!isCallBatchAPI && !isWorkflow && ( (runState.isResponding && !runState.completionRes) ? (
) : ( <> {(isNoData) ? : renderTextGenerationRes()} ) )} {!isCallBatchAPI && isWorkflow && ( (runState.isResponding && !runState.workflowProcessData) ? (
) : !runState.workflowProcessData ? : renderTextGenerationRes() )} {isCallBatchAPI && renderTextGenerationRes()} ) } export default React.memo(Result)