fix(order-service): 避免配置输入时引导图重复刷新
This commit is contained in:
@@ -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>
|
||||||
|
|||||||
Reference in New Issue
Block a user