Merge branch 'dev' into extractor-page-refactoring-11498013679550826416

This commit is contained in:
Misaka
2026-03-04 21:03:21 +08:00
9 changed files with 251 additions and 54 deletions

View File

@@ -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[]

View File

@@ -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)
}
}

View 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)
}))