import * as React from 'react'; import SwipeableDrawer from '@mui/material/SwipeableDrawer'; import Typography from '@mui/material/Typography'; import { Button, Grid, Box } from '@mui/material'; import { useCallback, useEffect, useRef, useState } from "react"; import { useBrowserDimensionsStore } from "../../context/browserDimensions"; import Table from '@mui/material/Table'; import TableBody from '@mui/material/TableBody'; import TableCell from '@mui/material/TableCell'; import TableContainer from '@mui/material/TableContainer'; import TableHead from '@mui/material/TableHead'; import TableRow from '@mui/material/TableRow'; import Paper from '@mui/material/Paper'; import StorageIcon from '@mui/icons-material/Storage'; import ArrowUpwardIcon from '@mui/icons-material/ArrowUpward'; import { SidePanelHeader } from '../recorder/SidePanelHeader'; import { useGlobalInfoStore } from '../../context/globalInfo'; import { useThemeMode } from '../../context/theme-provider'; import { useTranslation } from 'react-i18next'; import { useBrowserSteps } from '../../context/browserSteps'; interface InterpretationLogProps { isOpen: boolean; setIsOpen: (isOpen: boolean) => void; } export const InterpretationLog: React.FC = ({ isOpen, setIsOpen }) => { const { t } = useTranslation(); const [captureListData, setCaptureListData] = useState([]); const [captureTextData, setCaptureTextData] = useState([]); const [screenshotData, setScreenshotData] = useState([]); const [captureListPage, setCaptureListPage] = useState(0); const [screenshotPage, setScreenshotPage] = useState(0); const [activeTab, setActiveTab] = useState(0); const logEndRef = useRef(null); const { browserSteps } = useBrowserSteps(); const { browserWidth, outputPreviewHeight, outputPreviewWidth } = useBrowserDimensionsStore(); const { currentWorkflowActionsState, shouldResetInterpretationLog } = useGlobalInfoStore(); const [showPreviewData, setShowPreviewData] = useState(false); const toggleDrawer = (newOpen: boolean) => (event: React.KeyboardEvent | React.MouseEvent) => { if ( event.type === 'keydown' && ((event as React.KeyboardEvent).key === 'Tab' || (event as React.KeyboardEvent).key === 'Shift') ) { return; } setIsOpen(newOpen); }; const updateActiveTab = useCallback(() => { const availableTabs = getAvailableTabs(); if (captureListData.length > 0 && availableTabs.findIndex(tab => tab.id === 'captureList') !== -1) { setActiveTab(availableTabs.findIndex(tab => tab.id === 'captureList')); } else if (captureTextData.length > 0 && availableTabs.findIndex(tab => tab.id === 'captureText') !== -1) { setActiveTab(availableTabs.findIndex(tab => tab.id === 'captureText')); } else if (screenshotData.length > 0 && availableTabs.findIndex(tab => tab.id === 'captureScreenshot') !== -1) { setActiveTab(availableTabs.findIndex(tab => tab.id === 'captureScreenshot')); } }, [captureListData.length, captureTextData.length, screenshotData.length]); useEffect(() => { const textSteps = browserSteps.filter(step => step.type === 'text'); if (textSteps.length > 0) { const textDataRow: Record = {}; textSteps.forEach(step => { textDataRow[step.label] = step.data; }); setCaptureTextData([textDataRow]); } const listSteps = browserSteps.filter(step => step.type === 'list'); if (listSteps.length > 0) { setCaptureListData(listSteps); } const screenshotSteps = browserSteps.filter(step => step.type === 'screenshot' ) as Array<{ type: 'screenshot'; id: number; fullPage: boolean; actionId?: string; screenshotData?: string }>; const screenshotsWithData = screenshotSteps.filter(step => step.screenshotData); if (screenshotsWithData.length > 0) { const screenshots = screenshotsWithData.map(step => step.screenshotData!); setScreenshotData(screenshots); } updateActiveTab(); }, [browserSteps, updateActiveTab]); useEffect(() => { if (shouldResetInterpretationLog) { setCaptureListData([]); setCaptureTextData([]); setScreenshotData([]); setActiveTab(0); setCaptureListPage(0); setScreenshotPage(0); setShowPreviewData(false); } }, [shouldResetInterpretationLog]); const getAvailableTabs = useCallback(() => { const tabs = []; if (captureListData.length > 0) { tabs.push({ id: 'captureList', label: 'Lists' }); } if (captureTextData.length > 0) { tabs.push({ id: 'captureText', label: 'Texts' }); } if (screenshotData.length > 0) { tabs.push({ id: 'captureScreenshot', label: 'Screenshots' }); } return tabs; }, [captureListData.length, captureTextData.length, screenshotData.length, showPreviewData]); const availableTabs = getAvailableTabs(); useEffect(() => { if (activeTab >= availableTabs.length && availableTabs.length > 0) { setActiveTab(0); } }, [activeTab, availableTabs.length]); const { hasScrapeListAction, hasScreenshotAction, hasScrapeSchemaAction } = currentWorkflowActionsState; useEffect(() => { if (hasScrapeListAction || hasScrapeSchemaAction || hasScreenshotAction) { setIsOpen(true); } }, [hasScrapeListAction, hasScrapeSchemaAction, hasScreenshotAction, setIsOpen]); const { darkMode } = useThemeMode(); const getCaptureTextColumns = captureTextData.length > 0 ? Object.keys(captureTextData[0]) : []; const shouldShowTabs = availableTabs.length > 1; const getSingleContentType = () => { if (availableTabs.length === 1) { return availableTabs[0].id; } return null; }; const singleContentType = getSingleContentType(); return (
{t('interpretation_log.titles.output_preview')} {showPreviewData && availableTabs.length > 0 ? ( <> {shouldShowTabs && ( {availableTabs.map((tab, index) => ( setActiveTab(index)} sx={{ px: 4, py: 2, cursor: 'pointer', borderBottom: activeTab === index ? '2px solid' : 'none', borderColor: activeTab === index ? (darkMode ? '#ff00c3' : '#ff00c3') : 'transparent', backgroundColor: activeTab === index ? (darkMode ? '#34404d' : '#e9ecef') : 'transparent', color: darkMode ? 'white' : 'black', fontWeight: activeTab === index ? 500 : 400, textAlign: 'center', position: 'relative', '&:hover': { backgroundColor: activeTab !== index ? (darkMode ? '#303b49' : '#e2e6ea') : undefined } }} > {tab.label} ))} )} {(activeTab === availableTabs.findIndex(tab => tab.id === 'captureList') || singleContentType === 'captureList') && captureListData.length > 0 && ( {`Table ${captureListPage + 1} of ${captureListData.length}`} {Object.values(captureListData[captureListPage]?.fields || {}).map((field: any, index) => ( {field.label} ))} {(captureListData[captureListPage]?.data || []) .slice(0, Math.min(captureListData[captureListPage]?.limit || 10, 5)) .map((row: any, rowIndex: any) => ( {Object.values(captureListData[captureListPage]?.fields || {}).map((field: any, colIndex) => ( {row[field.label]} ))} )) }
)} {(activeTab === availableTabs.findIndex(tab => tab.id === 'captureScreenshot') || singleContentType === 'captureScreenshot') && screenshotData.length > 0 && ( {screenshotData.length > 1 && ( {`Screenshot ${screenshotPage + 1} of ${screenshotData.length}`} )} {screenshotData.length > 0 && ( {t('interpretation_log.titles.screenshot')} {screenshotPage + 1} {`${t('interpretation_log.titles.screenshot')} )} )} {(activeTab === availableTabs.findIndex(tab => tab.id === 'captureText') || singleContentType === 'captureText') && captureTextData.length > 0 && ( {getCaptureTextColumns.map((column) => ( {column} ))} {captureTextData.map((row, idx) => ( {getCaptureTextColumns.map((column) => ( {row[column]} ))} ))}
)}
) : ( {hasScrapeListAction || hasScrapeSchemaAction || hasScreenshotAction ? ( <> {t('interpretation_log.messages.successful_training')} setShowPreviewData(true)} /> ) : ( {t('interpretation_log.messages.no_selection')} )} )}
); };