清理前端Hook依赖告警

This commit is contained in:
WuYongJie 2026-05-28 19:34:17 +08:00
parent bad838fe8b
commit 09cab536a3
5 changed files with 56 additions and 43 deletions

View File

@ -337,7 +337,7 @@ export default function UsersTab({
.filter(Boolean) as string[]
}, [editingUserDepartment, users])
const renderStatusBadges = (user: User) => (
const renderStatusBadges = useCallback((user: User) => (
<>
<span
className={cn(
@ -360,7 +360,7 @@ export default function UsersTab({
{user.canDownload ? '可下载' : '禁止下载'}
</span>
</>
)
), [badgeActive, badgeInactive, badgeNoRole, badgeRole])
const renderActionButtons = useCallback((user: User, options?: { showRoleToggle?: boolean }) => {
const allowed = canManageUser(user)
@ -419,7 +419,20 @@ export default function UsersTab({
)}
</div>
)
}, [canManageUser, currentIsSuperAdmin, currentUserId, handleEditUser, onToggleActive, onToggleDownload, onSetRole])
}, [
canManageUser,
currentIsSuperAdmin,
currentUserId,
handleEditUser,
onToggleActive,
onToggleDownload,
onSetRole,
styles.buttonModifiers.compactXs,
styles.buttonStyles.danger,
styles.buttonStyles.secondary,
styles.buttonStyles.success,
textDesc,
])
const renderUserRow = useCallback(
(user: User, isManager = false) => (
@ -453,7 +466,7 @@ export default function UsersTab({
{renderActionButtons(user)}
</div>
),
[renderActionButtons],
[renderActionButtons, renderStatusBadges, styles.cardStyles.hover, textDesc, textNormal, textSuperAdmin],
)
const showSearchResults = Boolean(searchTerm.trim())

View File

@ -79,7 +79,7 @@ const departmentCollator = useMemo(() => getDepartmentCollator(), [])
router.push('/')
return
}
}, [status, session, router])
}, [status, router, sessionUser?.isSuperAdmin, sessionUser?.role])
const fetchData = useCallback(async () => {
const blockUI = !hasLoadedOnceRef.current

View File

@ -598,41 +598,6 @@ export default function Home() {
}
}, [])
const fetchMaterialTypes = useCallback(async () => {
try {
const response = await fetch('/api/material-types', {
cache: 'no-store',
})
if (response.ok) {
const data = await response.json()
console.log('[Home] Fetched material types from API:', data)
console.log('[Home] Data type:', typeof data, 'Is array:', Array.isArray(data), 'Length:', Array.isArray(data) ? data.length : 'N/A')
if (Array.isArray(data) && data.length > 0) {
console.log('[Home] Applying material type list:', data)
console.log('[Home] Custom types in list:', data.filter(t => t.startsWith('template:')))
applyMaterialTypeList(data)
// 获取每个类型的素材数量
fetchMaterialTypesCount(data)
return
}
if (Array.isArray(data?.types) && data.types.length > 0) {
console.log('[Home] Applying material type list (nested):', data.types)
applyMaterialTypeList(data.types)
fetchMaterialTypesCount(data.types)
return
}
}
// 接口返回异常或为空时使用兜底
console.warn('[Home] Material types API returned empty or invalid data, using fallback')
applyMaterialTypeList(FALLBACK_MATERIAL_TYPES)
fetchMaterialTypesCount(FALLBACK_MATERIAL_TYPES)
} catch (error) {
console.error('[Home] Error fetching material types:', error)
applyMaterialTypeList(FALLBACK_MATERIAL_TYPES)
fetchMaterialTypesCount(FALLBACK_MATERIAL_TYPES)
}
}, [applyMaterialTypeList])
const fetchMaterialTypesCount = useCallback(async (types: string[]) => {
try {
const counts: Record<string, number> = {}
@ -667,6 +632,41 @@ export default function Home() {
}
}, [])
const fetchMaterialTypes = useCallback(async () => {
try {
const response = await fetch('/api/material-types', {
cache: 'no-store',
})
if (response.ok) {
const data = await response.json()
console.log('[Home] Fetched material types from API:', data)
console.log('[Home] Data type:', typeof data, 'Is array:', Array.isArray(data), 'Length:', Array.isArray(data) ? data.length : 'N/A')
if (Array.isArray(data) && data.length > 0) {
console.log('[Home] Applying material type list:', data)
console.log('[Home] Custom types in list:', data.filter(t => t.startsWith('template:')))
applyMaterialTypeList(data)
// 获取每个类型的素材数量
fetchMaterialTypesCount(data)
return
}
if (Array.isArray(data?.types) && data.types.length > 0) {
console.log('[Home] Applying material type list (nested):', data.types)
applyMaterialTypeList(data.types)
fetchMaterialTypesCount(data.types)
return
}
}
// 接口返回异常或为空时使用兜底
console.warn('[Home] Material types API returned empty or invalid data, using fallback')
applyMaterialTypeList(FALLBACK_MATERIAL_TYPES)
fetchMaterialTypesCount(FALLBACK_MATERIAL_TYPES)
} catch (error) {
console.error('[Home] Error fetching material types:', error)
applyMaterialTypeList(FALLBACK_MATERIAL_TYPES)
fetchMaterialTypesCount(FALLBACK_MATERIAL_TYPES)
}
}, [applyMaterialTypeList, fetchMaterialTypesCount])
const fetchHomeFilterFields = useCallback(async () => {
try {
const response = await fetch('/api/home-filter-fields', {
@ -830,7 +830,6 @@ export default function Home() {
selectedTemplateId,
selectedPlatform,
selectedYear,
selectedMonth,
selectedYearMonth,
sortBy,
]

View File

@ -262,7 +262,7 @@ export default function MaterialPreviewModal({
}
setIsPolling(false)
}
}, [isOpen, isVideoMaterial, material?.id])
}, [isOpen, isVideoMaterial, material?.id, videoStatus])
const modalTitle = material?.productModel || title || '素材预览'
const isLongForm =

View File

@ -238,6 +238,7 @@ const isVideoFile = (file: File) => {
previewImages,
displayImage,
zipFile,
uploadComplete,
])
// 清除保存的上传状态
@ -293,7 +294,7 @@ const isVideoFile = (file: File) => {
setShowNewSceneInput(false)
setNewCategoryName('')
setNewSceneName('')
}, [])
}, [previewUrls])
// 检查是否有未完成的上传
useEffect(() => {