接入 ESLint 并清理未使用代码

- 前后端接入 ESLint 10 扁平配置(typescript-eslint 类型感知检查 + react-hooks/react-refresh),新增 lint / lint:check / lint:fix 脚本并纳入 check 链路
- 清理全部 no-unused-vars 与 no-useless-assignment 警告,修复 floating promises、正则转义等问题
- 删除确认无引用的死代码(markKuaishouCloudBindUrlRefreshFailed、未使用 helper 等)
This commit is contained in:
yml2213
2026-08-16 18:04:55 +08:00
parent 5c7c3e14e3
commit 81ae04dae0
55 changed files with 3031 additions and 628 deletions
+66
View File
@@ -0,0 +1,66 @@
import eslint from '@eslint/js'
import reactHooks from 'eslint-plugin-react-hooks'
import reactRefresh from 'eslint-plugin-react-refresh'
import globals from 'globals'
import tseslint from 'typescript-eslint'
export default tseslint.config(
{
ignores: ['dist/**', 'node_modules/**'],
},
{
files: ['src/**/*.{ts,tsx}', 'tests/**/*.{ts,tsx}', 'vite.config.ts'],
extends: [
eslint.configs.recommended,
...tseslint.configs.recommended,
reactHooks.configs.flat.recommended,
reactRefresh.configs.vite,
],
languageOptions: {
globals: {
...globals.browser,
...globals.node,
},
parserOptions: {
project: './tsconfig.eslint.json',
tsconfigRootDir: import.meta.dirname,
},
},
rules: {
'@typescript-eslint/no-explicit-any': 'off',
'@typescript-eslint/no-floating-promises': [
'error',
{
ignoreIIFE: true,
ignoreVoid: true,
},
],
'@typescript-eslint/no-misused-promises': [
'error',
{
checksVoidReturn: {
attributes: false,
},
},
],
'@typescript-eslint/no-unused-vars': [
'warn',
{
argsIgnorePattern: '^_',
caughtErrorsIgnorePattern: '^_',
destructuredArrayIgnorePattern: '^_',
varsIgnorePattern: '^_',
},
],
'react-hooks/refs': 'warn',
'react-hooks/set-state-in-effect': 'warn',
'react-refresh/only-export-components': 'warn',
},
},
{
files: ['src/**/*.test.{ts,tsx}', 'tests/**/*.{ts,tsx}'],
rules: {
'@typescript-eslint/no-floating-promises': 'off',
},
},
)
+1714
View File
File diff suppressed because it is too large Load Diff
+12 -3
View File
@@ -6,11 +6,14 @@
"scripts": {
"dev": "vite",
"build": "tsc -b && vite build",
"format": "prettier --config ../../.prettierrc.json --ignore-path ../../.prettierignore --write \"src/**/*.{ts,tsx,js,jsx,json,css}\" \"tests/**/*.{ts,tsx,js,jsx}\" package.json tsconfig.json vite.config.ts index.html",
"format:check": "prettier --config ../../.prettierrc.json --ignore-path ../../.prettierignore --check \"src/**/*.{ts,tsx,js,jsx,json,css}\" \"tests/**/*.{ts,tsx,js,jsx}\" package.json tsconfig.json vite.config.ts index.html",
"format": "prettier --config ../../.prettierrc.json --ignore-path ../../.prettierignore --write \"src/**/*.{ts,tsx,js,jsx,json,css}\" \"tests/**/*.{ts,tsx,js,jsx}\" eslint.config.js package.json tsconfig.json tsconfig.eslint.json vite.config.ts index.html",
"format:check": "prettier --config ../../.prettierrc.json --ignore-path ../../.prettierignore --check \"src/**/*.{ts,tsx,js,jsx,json,css}\" \"tests/**/*.{ts,tsx,js,jsx}\" eslint.config.js package.json tsconfig.json tsconfig.eslint.json vite.config.ts index.html",
"lint": "eslint \"src/**/*.{ts,tsx}\" \"tests/**/*.{ts,tsx}\" vite.config.ts",
"lint:check": "npm run lint -- --quiet",
"lint:fix": "npm run lint -- --fix",
"test": "node --experimental-strip-types --test tests/*.test.ts",
"typecheck": "tsc -b --noEmit",
"check": "npm run format:check && npm run typecheck && npm test && npm run build",
"check": "npm run format:check && npm run lint:check && npm run typecheck && npm test && npm run build",
"preview": "vite preview"
},
"dependencies": {
@@ -25,13 +28,19 @@
"react-router": "^7.10.1"
},
"devDependencies": {
"@eslint/js": "10.0.1",
"@types/node": "^25.6.0",
"@types/qrcode": "^1.5.6",
"@types/react": "^19.2.7",
"@types/react-dom": "^19.2.3",
"@vitejs/plugin-react": "^6.0.1",
"eslint": "10.8.1",
"eslint-plugin-react-hooks": "7.1.1",
"eslint-plugin-react-refresh": "0.5.4",
"globals": "17.11.0",
"prettier": "3.8.3",
"typescript": "~6.0.2",
"typescript-eslint": "8.67.0",
"vite": "^8.0.7"
}
}
@@ -3,7 +3,7 @@ import { useEffect, useState } from 'react'
export function DeadlineCountdown({
deadlineAt,
showExpired = false,
showExpired: _showExpired = false,
}: {
deadlineAt: string
showExpired?: boolean
@@ -169,15 +169,17 @@ export default function ImageUpload({
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [captureGlobalPaste])
function handleWrapperFocus(event: FocusEvent<HTMLDivElement>) {
function handleWrapperFocus(_event: FocusEvent<HTMLDivElement>) {
if (captureGlobalPaste) activateGlobalPasteTarget()
}
function handleWrapperClick(event: MouseEvent<HTMLDivElement>) {
function handleWrapperClick(_event: MouseEvent<HTMLDivElement>) {
if (captureGlobalPaste) activateGlobalPasteTarget()
}
const customRequest: UploadProps['customRequest'] = async (options) => {
async function uploadFromRequest(
options: Parameters<NonNullable<UploadProps['customRequest']>>[0],
) {
try {
const uploaded = await uploadFile(options.file as File, scene, scope)
// 多文件选择会并发执行 customRequest,必须以 ref 中的最新列表累加,避免后完成的上传覆盖前面的图片。
@@ -191,6 +193,10 @@ export default function ImageUpload({
}
}
const customRequest: UploadProps['customRequest'] = (options) => {
void uploadFromRequest(options)
}
return (
<div
className={`image-upload-droppable ${isDragging ? 'is-dragging' : ''}`}
+4 -2
View File
@@ -111,7 +111,7 @@ export default function AdminLayout() {
} finally {
clearAdminSession()
message.success('已退出后台')
navigate('/admin/login', { replace: true })
void navigate('/admin/login', { replace: true })
}
}
@@ -185,7 +185,9 @@ export default function AdminLayout() {
<Dropdown
menu={{
items: [{ key: 'logout', label: '退出登录' }],
onClick: submitLogout,
onClick: () => {
void submitLogout()
},
}}
placement="bottomRight"
>
+1 -1
View File
@@ -41,7 +41,7 @@ export default function WorkerLayout() {
} finally {
clearWorkerSession()
message.success('已退出登录')
navigate('/', { replace: true })
void navigate('/', { replace: true })
}
}
@@ -918,7 +918,9 @@ export default function AdminKuaishouIndustryPage() {
current: voucherFilters.page,
pageSize: voucherFilters.pageSize,
total: voucherTotal,
onChange: (page, pageSize) => loadVouchers({ page, pageSize }),
onChange: (page, pageSize) => {
void loadVouchers({ page, pageSize })
},
})}
/>
)
@@ -50,7 +50,7 @@ export default function AdminLoginPage() {
})
setAdminSession(response.data.token, response.data.expiresAt, response.data.user)
message.success('登录成功')
navigate('/admin/dashboard', { replace: true })
void navigate('/admin/dashboard', { replace: true })
} catch (error) {
message.error(error instanceof Error ? error.message : '后台登录失败')
} finally {
@@ -69,7 +69,6 @@ type ManualDispatchForm = {
}
export default function AdminTaskDetailPage() {
const navigate = useNavigate()
const { taskId = '' } = useParams()
const { message, modal } = App.useApp()
const [actionLoadingKey, setActionLoadingKey] = useState('')
@@ -8,7 +8,6 @@ import {
Empty,
Form,
Input,
Modal,
Result,
Select,
Space,
@@ -1,82 +1,9 @@
import {
CheckOutlined,
FormOutlined,
PlusOutlined,
ReloadOutlined,
SendOutlined,
SyncOutlined,
TeamOutlined,
WarningOutlined,
} from '@ant-design/icons'
import { useQuery, useQueryClient } from '@tanstack/react-query'
import {
App,
Button,
Card,
Descriptions,
Drawer,
Form,
Input,
InputNumber,
Modal,
Select,
Space,
Switch,
Table,
Tabs,
Tag,
Typography,
} from 'antd'
import type { TableColumnsType } from 'antd'
import { useEffect, useState } from 'react'
import { useNavigate } from 'react-router'
import { useQuery } from '@tanstack/react-query'
import { Card, Space, Tabs } from 'antd'
import { useState } from 'react'
import JsonPreview from '@/components/admin/JsonPreview'
import ImageUpload from '@/components/files/ImageUpload'
import ImagePreviewList from '@/components/files/ImagePreviewList'
import PageHeader from '@/components/admin/PageHeader'
import {
acceptAdminWorkOrder,
createAdminMockWorkOrder,
creditAdminWorkerWallet,
deleteAdminWorkCategory,
deleteAdminWorkerLevel,
fetchAdminWorkerFinanceConfig,
fetchAdminWorkerFinanceRequests,
fetchAdminWorkCategories,
fetchAdminWorkOrderSharing,
fetchAdminWorkProductRules,
fetchAdminWorkerLevels,
fetchAdminWorkerPlatformSummary,
fetchAdminWorkerUsers,
fetchAdminWorkOrders,
markAdminWorkOrderProblem,
publishAdminWorkOrder,
reviewAdminWorkerFinanceRequest,
resolveAdminProblemWorkOrder,
reviewAdminWorkerUser,
saveAdminWorkerFinanceConfig,
saveAdminWorkCategory,
saveAdminWorkProductRule,
saveAdminWorkerLevel,
submitAdminWorkOrderMaterial,
unpublishAdminWorkOrder,
updateAdminWorkOrderSharing,
} from '@/services/admin'
import type {
CollectField,
UploadedFile,
WorkCategory,
WorkOrder,
WorkOrderShare,
WorkProductRule,
WorkerFinanceConfig,
WorkerFinanceRequest,
WorkerLevel,
WorkerUser,
} from '@/types/worker-platform'
import { ADMIN_DEFAULT_PAGE_SIZE, buildAdminTablePagination } from '@/utils/admin-pagination'
import { formatAdminDateTime } from '@/utils/admin-time'
import { fetchAdminWorkerPlatformSummary } from '@/services/admin'
import CategoriesPanel from './panels/CategoriesPanel'
import FinancePanel from './panels/FinancePanel'
import LevelsPanel from './panels/LevelsPanel'
@@ -1,87 +1,30 @@
import {
CheckOutlined,
FormOutlined,
PlusOutlined,
ReloadOutlined,
SendOutlined,
SyncOutlined,
TeamOutlined,
WarningOutlined,
} from '@ant-design/icons'
import { useQuery, useQueryClient } from '@tanstack/react-query'
import { useQuery } from '@tanstack/react-query'
import {
App,
Button,
Card,
Descriptions,
Drawer,
Form,
Input,
InputNumber,
Modal,
Select,
Space,
Statistic,
Switch,
Table,
Tabs,
Tag,
Typography,
} from 'antd'
import type { TableColumnsType } from 'antd'
import { useEffect, useState } from 'react'
import { useNavigate } from 'react-router'
import { useState } from 'react'
import JsonPreview from '@/components/admin/JsonPreview'
import ImageUpload from '@/components/files/ImageUpload'
import ImagePreviewList from '@/components/files/ImagePreviewList'
import PageHeader from '@/components/admin/PageHeader'
import {
acceptAdminWorkOrder,
createAdminMockWorkOrder,
creditAdminWorkerWallet,
deleteAdminWorkCategory,
deleteAdminWorkerLevel,
fetchAdminWorkerFinanceConfig,
fetchAdminWorkerFinanceRequests,
fetchAdminWorkCategories,
fetchAdminWorkOrderSharing,
fetchAdminWorkProductRules,
fetchAdminWorkerLevels,
fetchAdminWorkerPlatformSummary,
fetchAdminWorkerUsers,
fetchAdminWorkOrders,
markAdminWorkOrderProblem,
publishAdminWorkOrder,
reviewAdminWorkerFinanceRequest,
resolveAdminProblemWorkOrder,
reviewAdminWorkerUser,
saveAdminWorkerFinanceConfig,
saveAdminWorkCategory,
saveAdminWorkProductRule,
saveAdminWorkerLevel,
submitAdminWorkOrderMaterial,
unpublishAdminWorkOrder,
updateAdminWorkOrderSharing,
} from '@/services/admin'
import type {
CollectField,
UploadedFile,
WorkCategory,
WorkOrder,
WorkOrderShare,
WorkProductRule,
WorkerFinanceConfig,
WorkerFinanceRequest,
WorkerLevel,
WorkerUser,
} from '@/types/worker-platform'
import { ADMIN_DEFAULT_PAGE_SIZE, buildAdminTablePagination } from '@/utils/admin-pagination'
import { formatAdminDateTime } from '@/utils/admin-time'
import type { WorkCategory } from '@/types/worker-platform'
export default function CategoriesPanel() {
const { message } = App.useApp()
const queryClient = useQueryClient()
const [form] = Form.useForm()
const [editingCategory, setEditingCategory] = useState<WorkCategory | null>(null)
const [deletingCategory, setDeletingCategory] = useState<WorkCategory | null>(null)
@@ -1,89 +1,40 @@
import {
CheckOutlined,
FormOutlined,
PlusOutlined,
ReloadOutlined,
SendOutlined,
SyncOutlined,
TeamOutlined,
WarningOutlined,
} from '@ant-design/icons'
import { ReloadOutlined } from '@ant-design/icons'
import { useQuery, useQueryClient } from '@tanstack/react-query'
import {
App,
Button,
Card,
Descriptions,
Drawer,
Form,
Input,
InputNumber,
Modal,
Select,
Space,
Statistic,
Switch,
Table,
Tabs,
Tag,
Typography,
} from 'antd'
import type { TableColumnsType } from 'antd'
import { useEffect, useState } from 'react'
import { useNavigate } from 'react-router'
import JsonPreview from '@/components/admin/JsonPreview'
import ImageUpload from '@/components/files/ImageUpload'
import ImagePreviewList from '@/components/files/ImagePreviewList'
import PageHeader from '@/components/admin/PageHeader'
import {
acceptAdminWorkOrder,
createAdminMockWorkOrder,
creditAdminWorkerWallet,
deleteAdminWorkCategory,
deleteAdminWorkerLevel,
fetchAdminWorkerFinanceConfig,
fetchAdminWorkerFinanceRequests,
fetchAdminWorkCategories,
fetchAdminWorkOrderSharing,
fetchAdminWorkProductRules,
fetchAdminWorkerLevels,
fetchAdminWorkerPlatformSummary,
fetchAdminWorkerUsers,
fetchAdminWorkOrders,
markAdminWorkOrderProblem,
publishAdminWorkOrder,
reviewAdminWorkerFinanceRequest,
resolveAdminProblemWorkOrder,
reviewAdminWorkerUser,
saveAdminWorkerFinanceConfig,
saveAdminWorkCategory,
saveAdminWorkProductRule,
saveAdminWorkerLevel,
submitAdminWorkOrderMaterial,
unpublishAdminWorkOrder,
updateAdminWorkOrderSharing,
} from '@/services/admin'
import type {
CollectField,
UploadedFile,
WorkCategory,
WorkOrder,
WorkOrderShare,
WorkProductRule,
WorkerFinanceConfig,
WorkerFinanceRequest,
WorkerLevel,
WorkerUser,
} from '@/types/worker-platform'
import { ADMIN_DEFAULT_PAGE_SIZE, buildAdminTablePagination } from '@/utils/admin-pagination'
import { formatAdminDateTime } from '@/utils/admin-time'
import {
asRecord,
formatMoney,
formatSharingShareStatus,
resolveSharingShareStatusColor,
} from './shared'
import { asRecord, formatMoney } from './shared'
type FinanceConfigFormValues = {
depositUnfreezeDays?: number
recharge?: {
@@ -1,83 +1,26 @@
import {
CheckOutlined,
FormOutlined,
PlusOutlined,
ReloadOutlined,
SendOutlined,
SyncOutlined,
TeamOutlined,
WarningOutlined,
} from '@ant-design/icons'
import { useQuery, useQueryClient } from '@tanstack/react-query'
import {
App,
Button,
Card,
Descriptions,
Drawer,
Form,
Input,
InputNumber,
Modal,
Select,
Space,
Statistic,
Switch,
Table,
Tabs,
Tag,
Typography,
} from 'antd'
import type { TableColumnsType } from 'antd'
import { useEffect, useState } from 'react'
import { useNavigate } from 'react-router'
import { useState } from 'react'
import JsonPreview from '@/components/admin/JsonPreview'
import ImageUpload from '@/components/files/ImageUpload'
import ImagePreviewList from '@/components/files/ImagePreviewList'
import PageHeader from '@/components/admin/PageHeader'
import {
acceptAdminWorkOrder,
createAdminMockWorkOrder,
creditAdminWorkerWallet,
deleteAdminWorkCategory,
deleteAdminWorkerLevel,
fetchAdminWorkerFinanceConfig,
fetchAdminWorkerFinanceRequests,
fetchAdminWorkCategories,
fetchAdminWorkOrderSharing,
fetchAdminWorkProductRules,
fetchAdminWorkerLevels,
fetchAdminWorkerPlatformSummary,
fetchAdminWorkerUsers,
fetchAdminWorkOrders,
markAdminWorkOrderProblem,
publishAdminWorkOrder,
reviewAdminWorkerFinanceRequest,
resolveAdminProblemWorkOrder,
reviewAdminWorkerUser,
saveAdminWorkerFinanceConfig,
saveAdminWorkCategory,
saveAdminWorkProductRule,
saveAdminWorkerLevel,
submitAdminWorkOrderMaterial,
unpublishAdminWorkOrder,
updateAdminWorkOrderSharing,
} from '@/services/admin'
import type {
CollectField,
UploadedFile,
WorkCategory,
WorkOrder,
WorkOrderShare,
WorkProductRule,
WorkerFinanceConfig,
WorkerFinanceRequest,
WorkerLevel,
WorkerUser,
} from '@/types/worker-platform'
import { ADMIN_DEFAULT_PAGE_SIZE, buildAdminTablePagination } from '@/utils/admin-pagination'
import { formatAdminDateTime } from '@/utils/admin-time'
import type { WorkerLevel } from '@/types/worker-platform'
import { formatMoney } from './shared'
export default function LevelsPanel() {
@@ -29,7 +29,6 @@ import {
Radio,
Select,
Space,
Statistic,
Switch,
Table,
Tabs,
@@ -43,54 +42,28 @@ import { useNavigate } from 'react-router'
import JsonPreview from '@/components/admin/JsonPreview'
import ImageUpload from '@/components/files/ImageUpload'
import ImagePreviewList from '@/components/files/ImagePreviewList'
import PageHeader from '@/components/admin/PageHeader'
import {
acceptAdminWorkOrder,
acceptAdminWorkOrders,
assignAdminWorkOrderToWorker,
cancelAdminWorkOrder,
createAdminMockWorkOrder,
creditAdminWorkerWallet,
deductAdminWorkOrderPendingDeposit,
deleteAdminWorkCategory,
deleteAdminWorkOrder,
deleteAdminWorkerLevel,
fetchAdminWorkerFinanceConfig,
fetchAdminWorkerFinanceRequests,
fetchAdminWorkCategories,
fetchAdminWorkOrderSharing,
fetchAdminWorkProductRules,
fetchAdminWorkerLevels,
fetchAdminWorkerPlatformSummary,
fetchAdminWorkerUsers,
fetchAdminWorkOrders,
markAdminWorkOrderProblem,
pinAdminWorkOrder,
publishAdminWorkOrder,
reviewAdminWorkerFinanceRequest,
resolveAdminProblemWorkOrder,
reviewAdminWorkerUser,
saveAdminWorkerFinanceConfig,
saveAdminWorkCategory,
saveAdminWorkProductRule,
saveAdminWorkerLevel,
submitAdminWorkOrderMaterial,
unpublishAdminWorkOrder,
updateAdminWorkOrder,
updateAdminWorkOrderSharing,
} from '@/services/admin'
import type {
CollectField,
UploadedFile,
WorkCategory,
WorkOrder,
WorkOrderShare,
WorkProductRule,
WorkerFinanceConfig,
WorkerFinanceRequest,
WorkerLevel,
WorkerUser,
} from '@/types/worker-platform'
import type { CollectField, UploadedFile, WorkOrder, WorkOrderShare } from '@/types/worker-platform'
import { ADMIN_DEFAULT_PAGE_SIZE, buildAdminTablePagination } from '@/utils/admin-pagination'
import { hasAdminRole } from '@/utils/admin-auth'
import { formatAdminDateTime } from '@/utils/admin-time'
@@ -112,7 +85,6 @@ import {
formatStatus,
resolveSharingShareStatusColor,
resolveStatusColor,
type DetailFieldItem,
} from './shared'
const FILTERABLE_WORK_ORDER_STATUSES = [
@@ -1003,7 +975,7 @@ export default function WorkOrdersPanel() {
onClick={() => {
const orderId = detailOrder.orderId
setDetailOrder(null)
navigate(`/admin/orders/${orderId}`)
void navigate(`/admin/orders/${orderId}`)
}}
>
@@ -1,83 +1,30 @@
import {
CheckOutlined,
FormOutlined,
PlusOutlined,
ReloadOutlined,
SendOutlined,
SyncOutlined,
TeamOutlined,
WarningOutlined,
} from '@ant-design/icons'
import { ReloadOutlined } from '@ant-design/icons'
import { useQuery, useQueryClient } from '@tanstack/react-query'
import {
App,
Button,
Card,
Descriptions,
Drawer,
Form,
Input,
InputNumber,
Modal,
Select,
Space,
Statistic,
Switch,
Table,
Tabs,
Tag,
Typography,
} from 'antd'
import type { TableColumnsType } from 'antd'
import { useEffect, useState } from 'react'
import { useNavigate } from 'react-router'
import { useState } from 'react'
import JsonPreview from '@/components/admin/JsonPreview'
import ImageUpload from '@/components/files/ImageUpload'
import ImagePreviewList from '@/components/files/ImagePreviewList'
import PageHeader from '@/components/admin/PageHeader'
import {
acceptAdminWorkOrder,
createAdminMockWorkOrder,
creditAdminWorkerWallet,
deleteAdminWorkCategory,
deleteAdminWorkerLevel,
fetchAdminWorkerFinanceConfig,
fetchAdminWorkerFinanceRequests,
fetchAdminWorkCategories,
fetchAdminWorkOrderSharing,
fetchAdminWorkProductRules,
fetchAdminWorkerLevels,
fetchAdminWorkerPlatformSummary,
fetchAdminWorkerUsers,
fetchAdminWorkOrders,
markAdminWorkOrderProblem,
publishAdminWorkOrder,
reviewAdminWorkerFinanceRequest,
resolveAdminProblemWorkOrder,
reviewAdminWorkerUser,
saveAdminWorkerFinanceConfig,
saveAdminWorkCategory,
saveAdminWorkProductRule,
saveAdminWorkerLevel,
submitAdminWorkOrderMaterial,
unpublishAdminWorkOrder,
updateAdminWorkOrderSharing,
} from '@/services/admin'
import type {
CollectField,
UploadedFile,
WorkCategory,
WorkOrder,
WorkOrderShare,
WorkProductRule,
WorkerFinanceConfig,
WorkerFinanceRequest,
WorkerLevel,
WorkerUser,
} from '@/types/worker-platform'
import type { WorkerUser } from '@/types/worker-platform'
import { ADMIN_DEFAULT_PAGE_SIZE, buildAdminTablePagination } from '@/utils/admin-pagination'
import { formatAdminDateTime } from '@/utils/admin-time'
import { formatMoney, formatWorkerStatus } from './shared'
export default function WorkersPanel() {
@@ -1,8 +1,7 @@
import { Descriptions, Space, Tag, Typography } from 'antd'
import ImagePreviewList from '@/components/files/ImagePreviewList'
import { DeadlineCountdown, formatTimeoutPolicyLabel } from '@/components/DeadlineCountdown'
import type { CollectField, UploadedFile, WorkOrder, WorkOrderShare } from '@/types/worker-platform'
import { formatAdminDateTime } from '@/utils/admin-time'
import type { CollectField, UploadedFile, WorkOrder } from '@/types/worker-platform'
export { DeadlineCountdown, formatTimeoutPolicyLabel }
@@ -1368,7 +1368,7 @@ function resolveDefaultSourceKey(sourceRows: SourceRow[], selectedSourceKey: str
function normalizeMatchName(value: unknown) {
return String(value || '')
.toLowerCase()
.replace(/[【】\[\]()()]/g, ' ')
.replace(/[【】[\]()()]/g, ' ')
.replace(/(自动发货|秒发|极速发货|官方直充|官方充值)/gi, ' ')
.replace(/[^\p{L}\p{N}]+/gu, ' ')
.replace(/\s+/g, ' ')
@@ -17,7 +17,6 @@ import {
Input,
InputNumber,
Popconfirm,
Select,
Space,
Spin,
Switch,
@@ -134,7 +133,7 @@ export default function AdminPlatformShopsPage() {
const [feifeiConfig, setFeifeiConfig] = useState<AdminKuaishouFeifeiConfigResponse | null>(null)
const [cloudtentaclesConfig, setCloudtentaclesConfig] =
useState<AdminCloudtentaclesSourceConfigResponse | null>(null)
const [affiliateDashConfig, setAffiliateDashConfig] =
const [_affiliateDashConfig, setAffiliateDashConfig] =
useState<AdminAffiliateDashConfigResponse | null>(null)
useEffect(() => {
@@ -2930,7 +2929,9 @@ function AffiliateDashPlatformPanel() {
current: productPage,
pageSize: 20,
total: productTotal,
onChange: (page) => loadProducts(page),
onChange: (page) => {
void loadProducts(page)
},
})}
/>
</Space>
@@ -63,7 +63,7 @@ export default function WorkerHallPage() {
useEffect(() => {
if (!autoRefresh) return
const timer = window.setInterval(() => {
refreshAll()
void refreshAll()
}, 5000)
return () => window.clearInterval(timer)
}, [autoRefresh])
@@ -57,7 +57,7 @@ export default function WorkerLoginPage() {
const response = await loginWorker(values)
setWorkerSession(response.data.token, response.data.expiresAt, response.data.worker)
message.success('登录成功')
navigate('/hall', { replace: true })
void navigate('/hall', { replace: true })
} catch (error) {
message.error(error instanceof Error ? error.message : '登录失败')
} finally {
@@ -8,9 +8,7 @@ import {
} from '@ant-design/icons'
import { useQuery, useQueryClient } from '@tanstack/react-query'
import {
AutoComplete,
App,
Alert,
Button,
Card,
Descriptions,
@@ -29,7 +27,7 @@ import {
Typography,
} from 'antd'
import type { TableColumnsType } from 'antd'
import { useEffect, useState } from 'react'
import { useState } from 'react'
import { DeadlineCountdown } from '@/components/DeadlineCountdown'
import ImagePreviewList from '@/components/files/ImagePreviewList'
@@ -652,7 +650,7 @@ export default function WorkerOrdersPage() {
)
const screenshots = getMaterialScreenshots(order)
const canCopyInfo = getCopyOrderInfoItems(order).length > 0
const submittedAt = getAcceptanceSubmittedAt(order)
const _submittedAt = getAcceptanceSubmittedAt(order)
const acceptanceFiles = getUniqueAcceptanceFiles(getWorkerAcceptance(order))
const hasAcceptance = acceptanceFiles.length > 0
const draftFiles = getUniqueAcceptanceFiles(getWorkerDraft(order))
@@ -1409,28 +1407,6 @@ function getUniqueAcceptanceFiles(source?: WorkerAcceptance | null): UploadedFil
})
}
function getAcceptanceFiles(row: WorkOrder): UploadedFile[] {
return getAcceptanceFilesFromSource(getWorkerAcceptance(row))
}
function getAcceptanceImageUrls(row: WorkOrder): string[] {
const imageUrls = getWorkerAcceptance(row)?.imageUrls
return Array.isArray(imageUrls)
? imageUrls.map((item) => String(item || '').trim()).filter(Boolean)
: []
}
function getDraftFiles(row: WorkOrder): UploadedFile[] {
return getAcceptanceFilesFromSource(getWorkerDraft(row))
}
function getDraftImageUrls(row: WorkOrder): string[] {
const imageUrls = getWorkerDraft(row)?.imageUrls
return Array.isArray(imageUrls)
? imageUrls.map((item) => String(item || '').trim()).filter(Boolean)
: []
}
function getAcceptanceSubmittedAt(order: WorkOrder): string | null {
if (order.myShare) return order.myShare.submittedAt
const acceptanceSubmittedAt =
@@ -166,7 +166,7 @@ export default function WorkerProfilePage() {
} finally {
clearWorkerSession()
message.success('已退出登录')
navigate('/', { replace: true })
void navigate('/', { replace: true })
}
}
@@ -250,7 +250,7 @@ export default function WorkerProfilePage() {
})
message.success('密码已修改,请重新登录')
clearWorkerSession()
navigate('/', { replace: true })
void navigate('/', { replace: true })
} catch (error) {
message.error(error instanceof Error ? error.message : '修改密码失败')
} finally {
+9
View File
@@ -0,0 +1,9 @@
{
"extends": "./tsconfig.app.json",
"compilerOptions": {
"noEmit": true,
"types": ["node"]
},
"include": ["src", "tests", "vite.config.ts"],
"exclude": ["node_modules", "dist"]
}