fix(order-service): 避免配置输入时引导图重复刷新

This commit is contained in:
yml2213
2026-11-04 11:51:34 +08:00
parent bb692754af
commit d576e8a2b1
2 changed files with 26 additions and 14 deletions
@@ -1,7 +1,7 @@
import { CameraOutlined, CloudUploadOutlined, PlusOutlined } from '@ant-design/icons' import { CameraOutlined, CloudUploadOutlined, PlusOutlined } from '@ant-design/icons'
import { App, Button, Typography, Upload } from 'antd' import { App, Button, Typography, Upload } from 'antd'
import type { UploadFile, UploadProps } from 'antd' import type { UploadFile, UploadProps } from 'antd'
import { useEffect, useRef, useState } from 'react' import { memo, useEffect, useMemo, useRef, useState } from 'react'
import type { ChangeEvent, ClipboardEvent, DragEvent, FocusEvent, MouseEvent } from 'react' import type { ChangeEvent, ClipboardEvent, DragEvent, FocusEvent, MouseEvent } from 'react'
import { uploadFile } from '@/services/files' import { uploadFile } from '@/services/files'
@@ -68,7 +68,7 @@ function registerGlobalPasteTarget(target: GlobalPasteTarget): () => void {
} }
} }
export default function ImageUpload({ export default memo(function ImageUpload({
value = [], value = [],
onChange, onChange,
scene, scene,
@@ -91,13 +91,17 @@ export default function ImageUpload({
const cameraEnabled = resolveCameraEntryEnabled({ isMobile, scope, allowCamera }) const cameraEnabled = resolveCameraEntryEnabled({ isMobile, scope, allowCamera })
const cameraInputProps = cameraCaptureInputProps('image') const cameraInputProps = cameraCaptureInputProps('image')
const fileList: UploadFile[] = value.map((file) => ({ const fileList: UploadFile[] = useMemo(
uid: file.objectKey || file.url, () =>
name: file.filename || '图片', value.map((file) => ({
status: 'done', uid: file.objectKey || file.url,
url: file.thumbnailUrl || file.url, name: file.filename || '图片',
thumbUrl: file.thumbnailUrl || file.url, status: 'done',
})) url: file.thumbnailUrl || file.url,
thumbUrl: file.thumbnailUrl || file.url,
})),
[value],
)
async function uploadImages(images: File[], source: UploadSource = 'default') { async function uploadImages(images: File[], source: UploadSource = 'default') {
const remaining = maxCount - valueRef.current.length const remaining = maxCount - valueRef.current.length
@@ -299,7 +303,7 @@ export default function ImageUpload({
) : null} ) : null}
</div> </div>
) )
} })
function resolveUploadErrorMessage(error: unknown, source: UploadSource) { function resolveUploadErrorMessage(error: unknown, source: UploadSource) {
const errorMessage = error instanceof Error ? error.message : '上传失败' const errorMessage = error instanceof Error ? error.message : '上传失败'
@@ -27,7 +27,7 @@ import {
Typography, Typography,
} from 'antd' } from 'antd'
import { useQuery, useQueryClient } from '@tanstack/react-query' import { useQuery, useQueryClient } from '@tanstack/react-query'
import { useEffect, useMemo, useState } from 'react' import { useCallback, useEffect, useMemo, useState } from 'react'
import PercentTable from '@/components/common/PercentTable' import PercentTable from '@/components/common/PercentTable'
import ImageUpload from '@/components/files/ImageUpload' import ImageUpload from '@/components/files/ImageUpload'
@@ -133,6 +133,14 @@ export default function OrderServicePanel() {
).length ).length
const selectedCategory = categories.find((item) => item.categoryId === selectedCategoryId) || null const selectedCategory = categories.find((item) => item.categoryId === selectedCategoryId) || null
const profile = (selectedCategoryId ? profileByCategoryId.get(selectedCategoryId) : null) || null const profile = (selectedCategoryId ? profileByCategoryId.get(selectedCategoryId) : null) || null
const guideFiles = useMemo(() => (guideImage ? [guideImage as UploadedFile] : []), [guideImage])
const handleGuideImageChange = useCallback((files: UploadedFile[]) => {
setGuideImage(files[0] || null)
}, [])
const uploadGuideImage = useCallback(
(file: File, scene: string) => uploadFile(file, scene, 'admin'),
[],
)
useEffect(() => { useEffect(() => {
if (selectedCategoryId !== null || categories.length === 0) return if (selectedCategoryId !== null || categories.length === 0) return
@@ -488,9 +496,9 @@ export default function OrderServicePanel() {
scene="order-service" scene="order-service"
scope="admin" scope="admin"
maxCount={1} maxCount={1}
value={guideImage ? [guideImage as UploadedFile] : []} value={guideFiles}
onChange={(files) => setGuideImage(files[0] || null)} onChange={handleGuideImageChange}
uploader={(file, scene) => uploadFile(file, scene, 'admin')} uploader={uploadGuideImage}
/> />
</div> </div>
</div> </div>