import { TimelineNode } from '@/components/originui/timeline'; import Spotlight from '@/components/spotlight'; import { cn } from '@/lib/utils'; import classNames from 'classnames'; import { useCallback, useEffect, useMemo, useState } from 'react'; import { useTranslation } from 'react-i18next'; import ChunkResultBar from './components/chunk-result-bar'; import CheckboxSets from './components/chunk-result-bar/checkbox-sets'; import FormatPreserEditor from './components/parse-editer'; import RerunButton from './components/rerun-button'; import { TimelineNodeType } from './constant'; import { useChangeChunkTextMode } from './hooks'; import { IChunk, IDslComponent } from './interface'; interface IProps { isReadonly: boolean; isChange: boolean; setIsChange: (isChange: boolean) => void; step?: TimelineNode; data: { value: IDslComponent; key: string }; reRunLoading: boolean; clickChunk: (chunk: IChunk) => void; summaryInfo: string; reRunFunc: (data: { value: IDslComponent; key: string }) => void; } const ParserContainer = (props: IProps) => { const { isChange, setIsChange, step, data, reRunFunc, reRunLoading, clickChunk, isReadonly, summaryInfo, } = props; const { t } = useTranslation(); const [selectedChunkIds, setSelectedChunkIds] = useState([]); const { changeChunkTextMode, textMode } = useChangeChunkTextMode(); const initialValue = useMemo(() => { const outputs = data?.value?.obj?.params?.outputs; const key = outputs?.output_format?.value; if (!outputs || !key) return { key: '', type: '', value: [] }; const value = outputs[key]?.value; const type = outputs[key]?.type; console.log('outputs-->', outputs, data, key, value); return { key, type, value, params: data?.value?.obj?.params, }; }, [data]); const [initialText, setInitialText] = useState(initialValue); useEffect(() => { setInitialText(initialValue); }, [initialValue]); const handleSave = (newContent: any) => { console.log('newContent-change-->', newContent, initialValue); if (JSON.stringify(newContent) !== JSON.stringify(initialValue)) { setIsChange(true); setInitialText(newContent); } else { setIsChange(false); } // Here, the API is called to send newContent to the backend }; const handleReRunFunc = useCallback(() => { const newData: { value: IDslComponent; key: string } = { ...data, value: { ...data.value, obj: { ...data.value.obj, params: { ...(data.value?.obj?.params || {}), outputs: { ...(data.value?.obj?.params?.outputs || {}), [initialText.key]: { type: initialText.type, value: initialText.value, }, }, }, }, }, }; reRunFunc(newData); setIsChange(false); }, [data, initialText, reRunFunc, setIsChange]); const handleRemoveChunk = useCallback(async () => { if (selectedChunkIds.length > 0) { initialText.value = initialText.value.filter( (item: any, index: number) => !selectedChunkIds.includes(index + ''), ); setIsChange(true); setSelectedChunkIds([]); } }, [selectedChunkIds, initialText, setIsChange]); const handleCheckboxClick = useCallback( (id: string | number, checked: boolean) => { setSelectedChunkIds((prev) => { if (checked) { return [...prev, id.toString()]; } else { return prev.filter((item) => item.toString() !== id.toString()); } }); }, [], ); const selectAllChunk = useCallback( (checked: boolean) => { setSelectedChunkIds( checked ? initialText.value.map((x, index: number) => index) : [], ); }, [initialText.value], ); const isChunck = step?.type === TimelineNodeType.characterSplitter || step?.type === TimelineNodeType.titleSplitter; const handleCreateChunk = useCallback( (text: string) => { const newText = [...initialText.value, { text: text || ' ' }]; setInitialText({ ...initialText, value: newText as any, }); }, [initialText], ); return ( <> {isChange && !isReadonly && (
)}
{/* */}
{!isChunck && (

{t('dataflowParser.parseSummary')}

{/* {t('dataflowParser.parseSummaryTip')} */} {summaryInfo}
)} {isChunck && (

{t('dataflowParser.result')}

{/* {t('chunk.chunkResultTip')} */}
)}
{isChunck && (
{!isReadonly && ( )}
)}
{initialText && ( )}
{/*
*/}
); }; export default ParserContainer;