index.jsx 3.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. import React from "react";
  2. import Taro from "@tarojs/taro";
  3. import { View, Image, Video } from "@tarojs/components";
  4. import { Loading } from "@antmjs/vantui";
  5. import { uploadFileBase64, uploadFiles } from "@/utils/request";
  6. import icon from "@/assets/icons/uploader.png";
  7. import closeIcon from "@/assets/icons/close.png";
  8. import style from "./style.modules.less";
  9. export default (props) => {
  10. // value 为数组
  11. // 单个元素结构为 { url, fileType }
  12. const { value, disabled = false, onChange } = props;
  13. const [loading, setLoading] = React.useState(false);
  14. const onAdd = (e) => {
  15. e.preventDefault();
  16. e.stopPropagation();
  17. if (disabled) return;
  18. setLoading(true);
  19. // eslint-disable-next-line no-undef
  20. if (IS_APP_CLIENT) {
  21. // eslint-disable-next-line no-undef
  22. SmartCity.chooseImage({
  23. count : 1 // 图片张数
  24. },function(res){
  25. console.log("--------上传图片---------", res);
  26. const base64 = res[0].imageData;
  27. const fileName = res[0].name;
  28. const fileType = res[0].type;
  29. uploadFileBase64(base64, fileName, fileType).then(resp => {
  30. setLoading(false);
  31. onChange((value || []).concat(resp));
  32. }).catch((err) => {
  33. console.error(err);
  34. setLoading(false);
  35. });
  36. });
  37. } else {
  38. Taro.chooseMedia({
  39. maxDuration: 60,
  40. // sizeType: "compressed",
  41. success: (res) => {
  42. const { tempFiles } = res;
  43. uploadFiles(tempFiles)
  44. .then((resp) => {
  45. setLoading(false);
  46. onChange((value || []).concat(resp));
  47. })
  48. .catch((err) => {
  49. console.error(err);
  50. setLoading(false);
  51. });
  52. },
  53. fail: (err) => {
  54. console.error(err);
  55. setLoading(false);
  56. },
  57. });
  58. }
  59. };
  60. const onDelete = (item) => {
  61. const newVal = value.filter((x) => x.url != item.url);
  62. onChange(newVal);
  63. };
  64. const onPreview = (inx) => {
  65. const url = value.map((x) => x.url);
  66. // Taro.previewMedia({
  67. // sources: value.map(x => ({ url: x.url, type: x.fileType })),
  68. // current: inx,
  69. // })
  70. //H5
  71. Taro.previewImage({
  72. current: inx, // 当前显示图片的http链接
  73. urls: url,
  74. });
  75. };
  76. return (
  77. <View className={style["uploader-wrapper"]}>
  78. <View className={style["uploader-box"]}>
  79. {!disabled && (
  80. <View className={style["uploader-add"]}>
  81. <Image src={icon} onClick={onAdd} />
  82. {loading && (
  83. <View>
  84. <Loading color="#fff" />
  85. </View>
  86. )}
  87. </View>
  88. )}
  89. {(value || []).map((item, inx) => (
  90. <View key={item.url} className={style["uploader-item"]}>
  91. {item.fileType.indexOf("image") == 0 ? (
  92. <Image src={item.url} onClick={() => onPreview(inx)} />
  93. ) : (
  94. <Video
  95. src={item.url}
  96. controls={false}
  97. onClick={() => onPreview(inx)}
  98. />
  99. )}
  100. {!disabled && (
  101. <View onClick={() => onDelete(item)}>
  102. <Image src={closeIcon} />
  103. </View>
  104. )}
  105. </View>
  106. ))}
  107. </View>
  108. </View>
  109. );
  110. };