chore: clean up lint warnings

This commit is contained in:
Simon
2025-10-12 00:34:17 +08:00
parent f923e8a6db
commit 8ac868ebe2
6 changed files with 573 additions and 458 deletions

View File

@@ -1,4 +1,4 @@
import { useState, useEffect } from 'react'
import { useEffect, useState } from 'react'
import { Link } from 'wouter'
interface UploadProgress {
@@ -33,7 +33,7 @@ export default function AsyncTestPage() {
isRunning: false,
progress: 0,
currentStep: '',
logs: []
logs: [],
})
// 模拟实时数据更新
@@ -42,7 +42,7 @@ export default function AsyncTestPage() {
if (isRealTimeActive) {
interval = setInterval(() => {
const newData = `数据更新 ${new Date().toLocaleTimeString()}: ${Math.floor(Math.random() * 1000)}`
setRealTimeData(prev => [newData, ...prev.slice(0, 9)]) // 保持最新10条
setRealTimeData((prev) => [newData, ...prev.slice(0, 9)]) // 保持最新10条
}, 2000)
}
return () => {
@@ -59,50 +59,53 @@ export default function AsyncTestPage() {
progress: 0,
status: 'uploading',
speed: '0 KB/s',
timeRemaining: '计算中...'
timeRemaining: '计算中...',
}
setUploads(prev => [...prev, newUpload])
setUploads((prev) => [...prev, newUpload])
// 模拟上传进度
const interval = setInterval(() => {
setUploads(prev => prev.map(upload => {
if (upload.id === uploadId) {
const newProgress = Math.min(upload.progress + Math.random() * 15, 100)
const speed = `${(Math.random() * 500 + 100).toFixed(0)} KB/s`
const timeRemaining = newProgress >= 100 ? '完成' : `${Math.ceil((100 - newProgress) / 10)}`
// 模拟随机失败
if (newProgress > 50 && Math.random() < 0.1) {
clearInterval(interval)
return {
...upload,
status: 'error' as const,
speed: '0 KB/s',
timeRemaining: '失败'
}
}
setUploads((prev) =>
prev.map((upload) => {
if (upload.id === uploadId) {
const newProgress = Math.min(upload.progress + Math.random() * 15, 100)
const speed = `${(Math.random() * 500 + 100).toFixed(0)} KB/s`
const timeRemaining =
newProgress >= 100 ? '完成' : `${Math.ceil((100 - newProgress) / 10)}`
// 模拟随机失败
if (newProgress > 50 && Math.random() < 0.1) {
clearInterval(interval)
return {
...upload,
status: 'error' as const,
speed: '0 KB/s',
timeRemaining: '失败',
}
}
if (newProgress >= 100) {
clearInterval(interval)
return {
...upload,
progress: 100,
status: 'completed' as const,
speed,
timeRemaining,
}
}
if (newProgress >= 100) {
clearInterval(interval)
return {
...upload,
progress: 100,
status: 'completed' as const,
progress: newProgress,
speed,
timeRemaining
timeRemaining,
}
}
return {
...upload,
progress: newProgress,
speed,
timeRemaining
}
}
return upload
}))
return upload
})
)
}, 500)
}
@@ -117,36 +120,38 @@ export default function AsyncTestPage() {
title: '',
content: '',
timestamp: '',
status: 'loading'
status: 'loading',
}))
setDataItems(skeletonItems)
// 逐个加载数据项
for (let i = 0; i < 6; i++) {
await new Promise(resolve => setTimeout(resolve, 800 + Math.random() * 1000))
setDataItems(prev => prev.map(item => {
if (item.id === i) {
// 模拟随机加载失败
if (Math.random() < 0.15) {
await new Promise((resolve) => setTimeout(resolve, 800 + Math.random() * 1000))
setDataItems((prev) =>
prev.map((item) => {
if (item.id === i) {
// 模拟随机加载失败
if (Math.random() < 0.15) {
return {
...item,
status: 'error',
title: '加载失败',
content: '数据加载失败,请重试',
}
}
return {
...item,
status: 'error',
title: '加载失败',
content: '数据加载失败,请重试'
status: 'loaded',
title: `数据项 ${i + 1}`,
content: `这是第 ${i + 1} 个数据项的内容,包含了一些示例文本用于展示加载效果。`,
timestamp: new Date().toLocaleString(),
}
}
return {
...item,
status: 'loaded',
title: `数据项 ${i + 1}`,
content: `这是第 ${i + 1} 个数据项的内容,包含了一些示例文本用于展示加载效果。`,
timestamp: new Date().toLocaleString()
}
}
return item
}))
return item
})
)
}
setIsLoadingData(false)
@@ -158,7 +163,7 @@ export default function AsyncTestPage() {
isRunning: true,
progress: 0,
currentStep: '初始化任务...',
logs: ['任务开始']
logs: ['任务开始'],
})
const steps = [
@@ -169,55 +174,55 @@ export default function AsyncTestPage() {
{ name: '处理数据...', duration: 2500 },
{ name: '生成报告...', duration: 2000 },
{ name: '保存结果...', duration: 1000 },
{ name: '清理资源...', duration: 500 }
{ name: '清理资源...', duration: 500 },
]
for (let i = 0; i < steps.length; i++) {
const step = steps[i]
setLongRunningTask(prev => ({
setLongRunningTask((prev) => ({
...prev,
currentStep: step.name,
logs: [...prev.logs, `开始: ${step.name}`]
logs: [...prev.logs, `开始: ${step.name}`],
}))
// 模拟步骤执行时间
const startTime = Date.now()
while (Date.now() - startTime < step.duration) {
await new Promise(resolve => setTimeout(resolve, 100))
await new Promise((resolve) => setTimeout(resolve, 100))
const elapsed = Date.now() - startTime
const stepProgress = Math.min((elapsed / step.duration) * 100, 100)
const totalProgress = ((i + stepProgress / 100) / steps.length) * 100
setLongRunningTask(prev => ({
setLongRunningTask((prev) => ({
...prev,
progress: totalProgress
progress: totalProgress,
}))
}
setLongRunningTask(prev => ({
setLongRunningTask((prev) => ({
...prev,
logs: [...prev.logs, `完成: ${step.name}`]
logs: [...prev.logs, `完成: ${step.name}`],
}))
// 模拟随机失败
if (i === 3 && Math.random() < 0.2) {
setLongRunningTask(prev => ({
setLongRunningTask((prev) => ({
...prev,
isRunning: false,
currentStep: '任务失败',
logs: [...prev.logs, '错误: 数据下载失败,请重试']
logs: [...prev.logs, '错误: 数据下载失败,请重试'],
}))
return
}
}
setLongRunningTask(prev => ({
setLongRunningTask((prev) => ({
...prev,
isRunning: false,
progress: 100,
currentStep: '任务完成',
logs: [...prev.logs, '任务成功完成!']
logs: [...prev.logs, '任务成功完成!'],
}))
}
@@ -226,34 +231,38 @@ export default function AsyncTestPage() {
}
const retryFailedUpload = (uploadId: string) => {
const failedUpload = uploads.find(u => u.id === uploadId)
const failedUpload = uploads.find((u) => u.id === uploadId)
if (failedUpload) {
setUploads(prev => prev.filter(u => u.id !== uploadId))
setUploads((prev) => prev.filter((u) => u.id !== uploadId))
simulateFileUpload(failedUpload.name)
}
}
const retryDataLoad = (itemId: number) => {
setDataItems(prev => prev.map(item => {
if (item.id === itemId) {
return { ...item, status: 'loading', title: '', content: '', timestamp: '' }
}
return item
}))
setTimeout(() => {
setDataItems(prev => prev.map(item => {
setDataItems((prev) =>
prev.map((item) => {
if (item.id === itemId) {
return {
...item,
status: 'loaded',
title: `数据项 ${itemId + 1}`,
content: `这是重新加载的第 ${itemId + 1} 个数据项的内容。`,
timestamp: new Date().toLocaleString()
}
return { ...item, status: 'loading', title: '', content: '', timestamp: '' }
}
return item
}))
})
)
setTimeout(() => {
setDataItems((prev) =>
prev.map((item) => {
if (item.id === itemId) {
return {
...item,
status: 'loaded',
title: `数据项 ${itemId + 1}`,
content: `这是重新加载的第 ${itemId + 1} 个数据项的内容。`,
timestamp: new Date().toLocaleString(),
}
}
return item
})
)
}, 1000)
}
@@ -261,9 +270,7 @@ export default function AsyncTestPage() {
<div className="min-h-screen bg-gray-50 dark:bg-gray-900 py-8">
<div className="max-w-6xl mx-auto px-4">
<div className="mb-8">
<h1 className="text-3xl font-bold text-gray-900 dark:text-white mb-2">
</h1>
<h1 className="text-3xl font-bold text-gray-900 dark:text-white mb-2"></h1>
<p className="text-gray-600 dark:text-gray-300">
</p>
@@ -301,34 +308,45 @@ export default function AsyncTestPage() {
"开始上传"
</div>
) : (
uploads.map(upload => (
<div key={upload.id} className="border border-gray-200 dark:border-gray-600 rounded-lg p-4">
uploads.map((upload) => (
<div
key={upload.id}
className="border border-gray-200 dark:border-gray-600 rounded-lg p-4"
>
<div className="flex justify-between items-center mb-2">
<span className="font-medium text-gray-900 dark:text-white">
{upload.name}
</span>
<span className={`text-sm ${
upload.status === 'completed' ? 'text-green-600 dark:text-green-400' :
upload.status === 'error' ? 'text-red-600 dark:text-red-400' :
'text-blue-600 dark:text-blue-400'
}`}>
{upload.status === 'completed' ? '✓ 完成' :
upload.status === 'error' ? '✗ 失败' :
'上传中...'}
<span
className={`text-sm ${
upload.status === 'completed'
? 'text-green-600 dark:text-green-400'
: upload.status === 'error'
? 'text-red-600 dark:text-red-400'
: 'text-blue-600 dark:text-blue-400'
}`}
>
{upload.status === 'completed'
? '✓ 完成'
: upload.status === 'error'
? '✗ 失败'
: '上传中...'}
</span>
</div>
<div className="w-full bg-gray-200 dark:bg-gray-700 rounded-full h-2 mb-2">
<div
className={`h-2 rounded-full transition-all duration-300 ${
upload.status === 'completed' ? 'bg-green-500' :
upload.status === 'error' ? 'bg-red-500' :
'bg-blue-500'
upload.status === 'completed'
? 'bg-green-500'
: upload.status === 'error'
? 'bg-red-500'
: 'bg-blue-500'
}`}
style={{ width: `${upload.progress}%` }}
/>
</div>
<div className="flex justify-between text-sm text-gray-600 dark:text-gray-300">
<span>{upload.progress.toFixed(1)}%</span>
<span>{upload.speed}</span>
@@ -375,18 +393,16 @@ export default function AsyncTestPage() {
"开始更新"
</div>
) : (
realTimeData.map((data, index) => (
realTimeData.map((data) => (
<div
key={index}
key={data}
className={`p-3 rounded-lg border transition-all duration-300 ${
index === 0
data === realTimeData[0]
? 'bg-blue-50 dark:bg-blue-900 border-blue-200 dark:border-blue-700'
: 'bg-gray-50 dark:bg-gray-700 border-gray-200 dark:border-gray-600'
}`}
>
<span className="text-sm text-gray-900 dark:text-white">
{data}
</span>
<span className="text-sm text-gray-900 dark:text-white">{data}</span>
</div>
))
)}
@@ -413,8 +429,11 @@ export default function AsyncTestPage() {
</div>
<div className="grid grid-cols-1 md:grid-cols-2 gap-4">
{dataItems.map(item => (
<div key={item.id} className="border border-gray-200 dark:border-gray-600 rounded-lg p-4">
{dataItems.map((item) => (
<div
key={item.id}
className="border border-gray-200 dark:border-gray-600 rounded-lg p-4"
>
{item.status === 'loading' ? (
<div className="animate-pulse">
<div className="h-4 bg-gray-300 dark:bg-gray-600 rounded w-3/4 mb-2"></div>
@@ -458,9 +477,7 @@ export default function AsyncTestPage() {
{/* 长时间运行任务 */}
<div className="bg-white dark:bg-gray-800 rounded-lg shadow p-6">
<div className="flex justify-between items-center mb-4">
<h2 className="text-xl font-semibold text-gray-900 dark:text-white">
</h2>
<h2 className="text-xl font-semibold text-gray-900 dark:text-white"></h2>
<button
type="button"
onClick={startLongRunningTask}
@@ -496,11 +513,17 @@ export default function AsyncTestPage() {
:
</h4>
<div className="space-y-1">
{longRunningTask.logs.map((log, index) => (
<div key={index} className="text-sm text-gray-600 dark:text-gray-300 font-mono">
{log}
</div>
))}
{longRunningTask.logs.map((log, logIdx) => {
const logKey = `${logIdx + 1}-${log.substring(0, 30)}`
return (
<div
key={logKey}
className="text-sm text-gray-600 dark:text-gray-300 font-mono"
>
{log}
</div>
)
})}
</div>
</div>
)}