import './index.less'; import { ConfigProvider, message, Upload, Button } from 'antd'; import type { UploadProps } from 'antd'; import { useEffect, useRef, useState } from 'react'; import { Helmet } from '@modern-js/runtime/head'; import { Panel, PanelGroup, PanelResizeHandle } from 'react-resizable-panels'; import Timeline from './component/timeline'; import DetailPanel from './component/detail-panel'; import logo from './component/assets/logo-plain.svg'; import GlobalHoverPreview from './component/global-hover-preview'; import { useExecutionDump, useInsightDump } from '@/component/store'; import DetailSide from '@/component/detail-side'; import Sidebar from '@/component/sidebar'; const { Dragger } = Upload; const Index = (props: { hideLogo?: boolean }): JSX.Element => { const executionDump = useExecutionDump((store) => store.dump); const setGroupedDump = useExecutionDump((store) => store.setGroupedDump); const reset = useExecutionDump((store) => store.reset); const [mainLayoutChangeFlag, setMainLayoutChangeFlag] = useState(0); const mainLayoutChangedRef = useRef(false); useEffect(() => { return () => { reset(); }; }, []); useEffect(() => { const onResize = () => { setMainLayoutChangeFlag((prev) => prev + 1); }; window.addEventListener('resize', onResize); return () => { window.removeEventListener('resize', onResize); }; }, []); // TODO // const loadInsightDump = (dump: InsightDump) => { // console.log('will convert insight dump to execution dump'); // const data = insightDumpToExecutionDump(dump); // console.log(data); // setExecutionDump(data); // }; const uploadProps: UploadProps = { name: 'file', multiple: false, capture: false, customRequest: () => { // noop }, beforeUpload(file) { const ifValidFile = file.name.endsWith('web-dump.json'); // || file.name.endsWith('.insight.json'); // const ifActionFile = // file.name.endsWith('.actions.json') || /_force_regard_as_action_file/.test(location.href); if (!ifValidFile) { message.error('invalid file extension'); return false; } const reader = new FileReader(); reader.readAsText(file); reader.onload = (e) => { const result = e.target?.result; if (typeof result === 'string') { try { const data = JSON.parse(result); // setMainLayoutChangeFlag((prev) => prev + 1); setGroupedDump(data); // if (ifActionFile) { // } else { // loadInsightDump(data); // } } catch (e: any) { console.error(e); message.error('failed to parse dump data', e.message); } } else { message.error('Invalid dump file'); } }; return false; }, }; const loadTasksDemo = () => { // setExecutionDump(actionDemo); // message.info('Your are viewing the demo data.'); }; const loadInsightDemo = () => { // loadInsightDump(InsightDemo); // message.info('Your are viewing the demo data.'); }; let mainContent: JSX.Element; if (!executionDump) { mainContent = (
Click or drag the{' '} .web-dump.json {' '} {/* or{' '} .actions.json {' '} */} file into this area.
The latest dump file is usually placed in{' '} ./midscene_run/
All data will be processed locally by the browser. No data will be sent to the server.