import React from 'react'; import { View } from 'react-native'; import { Photograph } from '@pingtou/rn-vant-icons'; import { useThemeFactory } from '../Theme'; import type { ImagePickerProps, UploaderValueItem, PickerImageInfo } from './types'; import { useControllableValue } from '../hooks'; import ImageItem from './ImageItem'; import Uploader from './Uploader'; import { createStyles } from './style'; const ImagePicker = (props: ImagePickerProps): JSX.Element => { const [value = [], setValue] = useControllableValue(props); const { styles, theme } = useThemeFactory(createStyles); const { maxCount = 0, uploadIcon = } = props; const previewSize = props.previewSize || theme.image_picker_size; const handleUpload = (files: PickerImageInfo[]) => { const nextValue: UploaderValueItem[] = value.concat(files.map(it => ({ url: it.uri, ...it }))); setValue(nextValue); }; const renderPreviewList = () => { if (props.previewImage) { return value.map((item, index) => ( props.previewCoverRender?.(item)} onDelete={async () => { try { const canDelete = await props.onDelete?.(item); if (canDelete === false) return; setValue(value.filter((_, i) => i !== index)); // eslint-disable-next-line no-empty } catch (error) {} }} /> )); } return null; }; const renderUpload = () => { if (props.showUpload && (maxCount === 0 || value.length < maxCount)) { if (props.children) { return {props.children}; } return ( ); } return null; }; return ( {renderPreviewList()} {renderUpload()} ); }; ImagePicker.defaultProps = { maxSize: Number.MAX_VALUE, maxCount: Number.MAX_VALUE, deletable: true, showUpload: true, previewImage: true, previewFullImage: true, name: '', accept: 'image/*', imageFit: 'cover', resultType: 'dataUrl', }; export default ImagePicker;