fix(assets): 拖拽高亮用enter/leave计数器,避免经过子元素时闪烁
CI/CD Pipeline / Dedup Check - skip PR tests when covered by push pipeline (pull_request) Successful in 3s
CI/CD Pipeline / Check if frontend-only change (pull_request) Successful in 3m50s
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 3m47s
CI/CD Pipeline / Validate - Type Check (mypy) (pull_request) Successful in 3m47s
CI/CD Pipeline / Validate - Migration (alembic) (pull_request) Successful in 3m48s
AI Code Review / AI Code Review (pull_request) Successful in 5m48s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 5m58s
Preview Deploy / Deploy Preview Environment (pull_request) Successful in 5m27s
CI/CD Pipeline / Frontend Unit Tests (pull_request) Successful in 1m38s
CI/CD Pipeline / Frontend Lint (pull_request) Successful in 3m29s
CI/CD Pipeline / PR Build Web Image (pull_request) Successful in 2m52s
CI/CD Pipeline / Validate - Code Quality (pull_request) Successful in 9m15s
CI/CD Pipeline / CI Gate (pull_request) Successful in 25s
ACR Cleanup / ACR Image Cleanup (pull_request_target) Successful in 3m41s
Preview Cleanup / Cleanup Preview Environment (pull_request) Successful in 4m6s
CI/CD Pipeline / Production Browser E2E (pull_request) Failing after 397h22m59s
CI/CD Pipeline / Build Production Worker Image (pull_request) Failing after 397h23m3s
CI/CD Pipeline / Canary Release to Production (pull_request) Failing after 397h23m1s
CI/CD Pipeline / Build Production Web Image (pull_request) Failing after 397h23m3s
CI/CD Pipeline / Integration Tests (pull_request) Failing after 397h23m4s
CI/CD Pipeline / ACR Image Cleanup (pull_request) Failing after 397h27m3s
CI/CD Pipeline / Staging API Integration Tests (pull_request) Failing after 397h27m5s
CI/CD Pipeline / Staging E2E Tests (pull_request) Failing after 397h27m7s
CI/CD Pipeline / Deploy Staging (Watchtower auto-deploy) (pull_request) Failing after 397h27m32s
CI/CD Pipeline / PR Build Worker Image (pull_request) Failing after 397h27m35s
CI/CD Pipeline / PR Build API Image (pull_request) Failing after 397h27m44s
CI/CD Pipeline / Retag skipped Staging Worker Image (pull_request) Failing after 397h29m10s
CI/CD Pipeline / Retag skipped Staging Web Image (pull_request) Failing after 397h29m10s
CI/CD Pipeline / Retag skipped Staging API Image (pull_request) Failing after 397h29m12s
CI/CD Pipeline / Build Staging Worker Image (pull_request) Failing after 397h32m22s
CI/CD Pipeline / Build Staging Web Image (pull_request) Failing after 397h32m24s
CI/CD Pipeline / Build Staging API Image (pull_request) Failing after 397h32m26s
CI/CD Pipeline / Check push changed paths (pull_request) Failing after 397h33m8s
CI/CD Pipeline / Deploy Production (pull_request) Failing after 397h57m11s
CI/CD Pipeline / Build Production API Image (pull_request) Failing after 397h57m13s
CI/CD Pipeline / Unit Tests (pull_request) Failing after 398h2m57s
CI/CD Pipeline / Dedup Check - skip PR tests when covered by push pipeline (pull_request) Successful in 3s
CI/CD Pipeline / Check if frontend-only change (pull_request) Successful in 3m50s
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 3m47s
CI/CD Pipeline / Validate - Type Check (mypy) (pull_request) Successful in 3m47s
CI/CD Pipeline / Validate - Migration (alembic) (pull_request) Successful in 3m48s
AI Code Review / AI Code Review (pull_request) Successful in 5m48s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 5m58s
Preview Deploy / Deploy Preview Environment (pull_request) Successful in 5m27s
CI/CD Pipeline / Frontend Unit Tests (pull_request) Successful in 1m38s
CI/CD Pipeline / Frontend Lint (pull_request) Successful in 3m29s
CI/CD Pipeline / PR Build Web Image (pull_request) Successful in 2m52s
CI/CD Pipeline / Validate - Code Quality (pull_request) Successful in 9m15s
CI/CD Pipeline / CI Gate (pull_request) Successful in 25s
ACR Cleanup / ACR Image Cleanup (pull_request_target) Successful in 3m41s
Preview Cleanup / Cleanup Preview Environment (pull_request) Successful in 4m6s
CI/CD Pipeline / Production Browser E2E (pull_request) Failing after 397h22m59s
CI/CD Pipeline / Build Production Worker Image (pull_request) Failing after 397h23m3s
CI/CD Pipeline / Canary Release to Production (pull_request) Failing after 397h23m1s
CI/CD Pipeline / Build Production Web Image (pull_request) Failing after 397h23m3s
CI/CD Pipeline / Integration Tests (pull_request) Failing after 397h23m4s
CI/CD Pipeline / ACR Image Cleanup (pull_request) Failing after 397h27m3s
CI/CD Pipeline / Staging API Integration Tests (pull_request) Failing after 397h27m5s
CI/CD Pipeline / Staging E2E Tests (pull_request) Failing after 397h27m7s
CI/CD Pipeline / Deploy Staging (Watchtower auto-deploy) (pull_request) Failing after 397h27m32s
CI/CD Pipeline / PR Build Worker Image (pull_request) Failing after 397h27m35s
CI/CD Pipeline / PR Build API Image (pull_request) Failing after 397h27m44s
CI/CD Pipeline / Retag skipped Staging Worker Image (pull_request) Failing after 397h29m10s
CI/CD Pipeline / Retag skipped Staging Web Image (pull_request) Failing after 397h29m10s
CI/CD Pipeline / Retag skipped Staging API Image (pull_request) Failing after 397h29m12s
CI/CD Pipeline / Build Staging Worker Image (pull_request) Failing after 397h32m22s
CI/CD Pipeline / Build Staging Web Image (pull_request) Failing after 397h32m24s
CI/CD Pipeline / Build Staging API Image (pull_request) Failing after 397h32m26s
CI/CD Pipeline / Check push changed paths (pull_request) Failing after 397h33m8s
CI/CD Pipeline / Deploy Production (pull_request) Failing after 397h57m11s
CI/CD Pipeline / Build Production API Image (pull_request) Failing after 397h57m13s
CI/CD Pipeline / Unit Tests (pull_request) Failing after 398h2m57s
AI Review 指出 onDragLeave 在鼠标经过按钮/文字等子元素时会误触发 setDragOver(false),导致拖入过程中高亮不停闪烁。 改为 dragenter/dragleave 配对计数,计数器归零(真正离开容器)才取消高亮。
This commit is contained in:
@@ -20,6 +20,9 @@ export const AssetUploadZone: React.FC<AssetUploadZoneProps> = ({
|
||||
onUpload,
|
||||
}) => {
|
||||
const inputRef = useRef<HTMLInputElement>(null)
|
||||
// dragenter/dragleave 在经过子元素时会成对触发,用计数器避免高亮闪烁;
|
||||
// 计数器归零(拖拽真正离开容器)才取消高亮
|
||||
const dragDepthRef = useRef(0)
|
||||
const [dragOver, setDragOver] = useState(false)
|
||||
|
||||
const pickFiles = (list: FileList | null) => {
|
||||
@@ -30,16 +33,24 @@ export const AssetUploadZone: React.FC<AssetUploadZoneProps> = ({
|
||||
return (
|
||||
<div
|
||||
className={`xx-asset-upload-entry${dragOver ? " xx-asset-upload-entry-dragover" : ""}`}
|
||||
onDragEnter={(e) => {
|
||||
e.preventDefault()
|
||||
dragDepthRef.current += 1
|
||||
setDragOver(true)
|
||||
}}
|
||||
onDragOver={(e) => {
|
||||
e.preventDefault()
|
||||
setDragOver(true)
|
||||
}}
|
||||
onDragLeave={(e) => {
|
||||
e.preventDefault()
|
||||
setDragOver(false)
|
||||
dragDepthRef.current = Math.max(0, dragDepthRef.current - 1)
|
||||
if (dragDepthRef.current === 0) {
|
||||
setDragOver(false)
|
||||
}
|
||||
}}
|
||||
onDrop={(e) => {
|
||||
e.preventDefault()
|
||||
dragDepthRef.current = 0
|
||||
setDragOver(false)
|
||||
pickFiles(e.dataTransfer.files)
|
||||
}}
|
||||
|
||||
Reference in New Issue
Block a user