123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146 |
- import React from "react";
- import Taro from "@tarojs/taro";
- import { View, Image, Video } from "@tarojs/components";
- import { Loading } from "@antmjs/vantui";
- import { uploadFileBase64, uploadFiles } from "@/utils/request";
- import { promise } from "@/utils/promise";
- import icon from "@/assets/icons/uploader.png";
- import closeIcon from "@/assets/icons/close.png";
- import style from "./style.modules.less";
-
- export default (props) => {
- // value 为数组
- // 单个元素结构为 { url, fileType }
- const { value, disabled = false, onChange } = props;
- const [loading, setLoading] = React.useState(false);
- const [valueCopy, setValueCopy] = React.useState(value);
- const valueCopyRef = React.useRef(valueCopy);
- valueCopyRef.current = valueCopy;
-
- const onAdd = (e) => {
- e.preventDefault();
- e.stopPropagation();
-
- if (disabled) return;
-
- setValueCopy(valueCopyRef.current.concat(false));
-
- setLoading(true);
-
- // eslint-disable-next-line no-undef
- if (IS_APP_CLIENT) {
- const p = promise((resolve, reject) => {
- // eslint-disable-next-line no-undef
- SmartCity.chooseImage({
- count : 1 // 图片张数
- },function(res){
- console.log("--------上传图片---------", res);
- const base64 = res[0].imageData;
- const fileName = res[0].name;
- const fileType = res[0].type;
-
- uploadFileBase64(base64, fileName, fileType).then(resp => {
- resolve(resp);
- // onChange((value || []).concat(resp));
- }).catch((err) => {
- console.error(err);
- reject(err);
- });
- });
- }, 10 * 1000);
-
- p.then((resp) => {
- setLoading(false);
- onChange((value || []).concat(resp));
- }).catch(() => {
- setValueCopy(valueCopyRef.current.filter(Boolean))
- setLoading(false);
- });
- } else {
- Taro.chooseMedia({
- maxDuration: 60,
- // sizeType: "compressed",
- success: (res) => {
- const { tempFiles } = res;
- uploadFiles(tempFiles)
- .then((resp) => {
- setLoading(false);
- onChange((value || []).concat(resp));
- })
- .catch((err) => {
- console.error(err);
- setLoading(false);
- });
- },
- fail: (err) => {
- console.error(err);
- setLoading(false);
- },
- });
- }
- };
-
- const onDelete = (item) => {
- if (!item) {
- setValueCopy(valueCopyRef.current.filter(Boolean));
- return;
- }
-
- const newVal = value.filter((x) => x.url != item.url);
- onChange(newVal);
- };
-
- const onPreview = (inx) => {
- const url = value.map((x) => x.url);
- // Taro.previewMedia({
- // sources: value.map(x => ({ url: x.url, type: x.fileType })),
- // current: inx,
- // })
-
- //H5
- Taro.previewImage({
- current: inx, // 当前显示图片的http链接
- urls: url,
- });
- };
-
- React.useEffect(() => {
- setValueCopy(value || []);
- }, [value]);
-
- return (
- <View className={style["uploader-wrapper"]}>
- <View className={style["uploader-box"]}>
- {!disabled && (
- <View className={style["uploader-add"]}>
- <Image src={icon} onClick={onAdd} />
- </View>
- )}
- {valueCopy.map((item, inx) => (
- <View key={item?.url || '123'} className={style["uploader-item"]}>
- {
- !item ? (
- <Loading color="gray" style={{ width: '100%', height: '100%' }} />
- ) : (
- item.fileType.indexOf("image") == 0 ? (
- <Image src={item.url} onClick={() => onPreview(inx)} />
- ) : (
- <Video
- src={item.url}
- controls={false}
- onClick={() => onPreview(inx)}
- />
- )
- )
- }
- {!disabled && (
- <View onClick={() => onDelete(item)} style={{ zIndex: 99 }}>
- <Image src={closeIcon} />
- </View>
- )}
- </View>
- ))}
- </View>
- </View>
- );
- };
|