import React, { useState, useEffect, forwardRef, useImperativeHandle } from 'react' import { Image, View, Text, ScrollView, Button } from '@tarojs/components' import Taro from '@tarojs/taro' import img from '../../config/images' import publishService from '../../services/publishService' import { CommonPopup } from '../' import emptyStatus from '../../static/emptyStatus/publish-empty.png' import './upload-source-popup.scss' type SourceType = 'history' | 'preset' type ImageItem = { id: string url: string tempFilePath?: string } interface UploadImageProps { onAdd: (images: ImageItem[]) => void } export const sourceMap = new Map([ ['history', '历史图库'], ['preset', '预设图库'] ]) const checkImageSelected = (images: ImageItem[], image: ImageItem) => { return images.some(item => item.id === image.id) } export default forwardRef(function UploadImage(props: UploadImageProps, ref) { const { onAdd = () => void 0, } = props const [visible, setVisible] = useState(false) const [sourceType, setSourceType] = useState('history') const [maxCount, setMaxCount] = useState(9) const [images, setImages] = useState([]) const [selectedImages, setSelectedImages] = useState([]) const handleImageClick = (image: ImageItem) => { if (checkImageSelected(selectedImages, image)) { setSelectedImages(selectedImages.filter(item => item.id !== image.id)) } else if (!outOfMax) { setSelectedImages([...selectedImages, image]) } else { Taro.showToast({ title: `最多选择${maxCount}张图片`, icon: 'none' }) } } useImperativeHandle(ref, () => ({ show: (sourceType: SourceType, maxCount: number) => { setVisible(true) setSourceType(sourceType) setMaxCount(maxCount) fetchImages() } })) function fetchImages() { publishService.getPictures({ pageOption: { page: 1, pageSize: 100, }, seachOption: { tag: '', resource_type: 'image', dateRange: [], }, }).then(res => { if (res.success) { let start = 0 setImages(res.data.data.rows.map(item => ({ id: (Date.now() + start++).toString(), url: item.thumbnail_url, }))) } else { // TODO: 显示错误信息 Taro.showToast({ title: res.message, icon: 'none' }) } }) } function onClose() { setVisible(false) setSelectedImages([]) setImages([]) setSourceType('history') setMaxCount(9) } const handleConfirm = () => { if (selectedImages.length > 0) { onAdd(selectedImages) setVisible(false) } else { Taro.showToast({ title: '请选择图片', icon: 'none' }) } } const outOfMax = selectedImages.length >= maxCount return ( <> {sourceMap.get(sourceType)} {/* TODO: 分页 加载更多 */} {/* TODO: 图片加载失败 */} {/* TODO: 图片加载中 */} {images.length > 0 ? ( {images.map(item => { const isSelected = checkImageSelected(selectedImages, item) return ( handleImageClick(item)}> {isSelected ? ( ) : ( )} ) })} ) : ( 暂无内容 )} {images.length > 0 ? ( ) : ( )} {/* setVisible(true)}>{sourceMap.get(sourceType)}选取 */} ); });