Merge branch 'dev' into extractor-page-refactoring-11498013679550826416
This commit is contained in:
@@ -1,6 +1,6 @@
|
||||
import React, { useEffect, useRef } from 'react'
|
||||
import { Terminal } from 'lucide-react'
|
||||
import type { LogEntry, LogLevel, ExtractorProgress } from '../../hooks/useExtractor'
|
||||
import type { LogEntry, LogLevel, ExtractorProgress } from '../../stores/extractorStore'
|
||||
|
||||
interface LogPanelProps {
|
||||
logs: LogEntry[]
|
||||
|
||||
@@ -1,38 +1,34 @@
|
||||
import { useState, useEffect } from 'react'
|
||||
|
||||
export interface ExtractorProgress {
|
||||
message: string
|
||||
progress: number
|
||||
}
|
||||
|
||||
export type LogLevel = 'info' | 'success' | 'warning' | 'error' | 'system'
|
||||
|
||||
export interface LogEntry {
|
||||
timestamp: string
|
||||
level: LogLevel
|
||||
message: string
|
||||
}
|
||||
import { useEffect } from 'react'
|
||||
import { useExtractorStore } from '../stores/extractorStore'
|
||||
|
||||
export function useExtractor() {
|
||||
const [isRunning, setIsRunning] = useState(false)
|
||||
const [progress, setProgress] = useState<ExtractorProgress | null>(null)
|
||||
const [error, setError] = useState<string | null>(null)
|
||||
const [logs, setLogs] = useState<LogEntry[]>([])
|
||||
|
||||
const addLog = (level: LogLevel, message: string) => {
|
||||
const timestamp = new Date().toLocaleTimeString('zh-CN', { hour12: false })
|
||||
setLogs((prev) => [...prev, { timestamp, level, message }])
|
||||
}
|
||||
const {
|
||||
isRunning,
|
||||
progress,
|
||||
error,
|
||||
logs,
|
||||
setRunning,
|
||||
setProgress,
|
||||
setError,
|
||||
addLog,
|
||||
clearLogs,
|
||||
resetState
|
||||
} = useExtractorStore()
|
||||
|
||||
useEffect(() => {
|
||||
if (progress) {
|
||||
addLog('info', progress.message)
|
||||
}
|
||||
}, [progress])
|
||||
const unsubscribeProgress = window.electron.extractor.onProgress((data) => {
|
||||
setProgress({ message: data.message, progress: data.progress })
|
||||
})
|
||||
|
||||
const clearLogs = () => {
|
||||
setLogs([])
|
||||
}
|
||||
const unsubscribeLog = window.electron.extractor.onLog((data) => {
|
||||
addLog(data.level as any, data.message)
|
||||
})
|
||||
|
||||
return () => {
|
||||
unsubscribeProgress()
|
||||
unsubscribeLog()
|
||||
}
|
||||
}, [setProgress, addLog])
|
||||
|
||||
const startExtraction = async (orderNumbers: string) => {
|
||||
if (!orderNumbers.trim()) {
|
||||
@@ -40,11 +36,8 @@ export function useExtractor() {
|
||||
return
|
||||
}
|
||||
|
||||
setIsRunning(true)
|
||||
setProgress(null)
|
||||
setError(null)
|
||||
setLogs([])
|
||||
|
||||
resetState()
|
||||
setRunning(true)
|
||||
addLog('system', '提取引擎启动,准备执行...')
|
||||
|
||||
try {
|
||||
@@ -77,7 +70,7 @@ export function useExtractor() {
|
||||
setError(errMsg)
|
||||
addLog('error', errMsg)
|
||||
} finally {
|
||||
setIsRunning(false)
|
||||
setRunning(false)
|
||||
setProgress(null)
|
||||
}
|
||||
}
|
||||
|
||||
59
src/renderer/src/stores/extractorStore.ts
Normal file
59
src/renderer/src/stores/extractorStore.ts
Normal file
@@ -0,0 +1,59 @@
|
||||
import { create } from 'zustand'
|
||||
|
||||
export type LogLevel = 'info' | 'success' | 'warning' | 'error' | 'system'
|
||||
|
||||
export interface LogEntry {
|
||||
timestamp: string
|
||||
level: LogLevel
|
||||
message: string
|
||||
}
|
||||
|
||||
export interface ExtractorProgress {
|
||||
message: string
|
||||
progress: number
|
||||
}
|
||||
|
||||
export interface ExtractorState {
|
||||
isRunning: boolean
|
||||
progress: ExtractorProgress | null
|
||||
error: string | null
|
||||
logs: LogEntry[]
|
||||
}
|
||||
|
||||
export interface ExtractorActions {
|
||||
setRunning: (isRunning: boolean) => void
|
||||
setProgress: (progress: ExtractorProgress | null) => void
|
||||
setError: (error: string | null) => void
|
||||
addLog: (level: LogLevel, message: string) => void
|
||||
clearLogs: () => void
|
||||
resetState: () => void
|
||||
}
|
||||
|
||||
const initialState: ExtractorState = {
|
||||
isRunning: false,
|
||||
progress: null,
|
||||
error: null,
|
||||
logs: []
|
||||
}
|
||||
|
||||
export const useExtractorStore = create<ExtractorState & ExtractorActions>((set) => ({
|
||||
...initialState,
|
||||
|
||||
setRunning: (isRunning: boolean) => set({ isRunning }),
|
||||
|
||||
setProgress: (progress: ExtractorProgress | null) => set({ progress }),
|
||||
|
||||
setError: (error: string | null) => set({ error }),
|
||||
|
||||
addLog: (level: LogLevel, message: string) =>
|
||||
set((state) => {
|
||||
const timestamp = new Date().toLocaleTimeString('zh-CN', { hour12: false })
|
||||
return {
|
||||
logs: [...state.logs, { timestamp, level, message }]
|
||||
}
|
||||
}),
|
||||
|
||||
clearLogs: () => set({ logs: [] }),
|
||||
|
||||
resetState: () => set(initialState)
|
||||
}))
|
||||
Reference in New Issue
Block a user