<template>
	<view class="upFile" >
		<view class="media" v-if="!fileType">
			<view v-if="!type" class="multiple">
				<view class="imageList">
					<view class="imageItem" v-for="(item,index) in fileList" :key='index'>
						<image :style="{
							width:width,
							height:height
						}"  :src="item[valueKey] " @click="seeImage(index)" mode="aspectFill"></image>
						<view class="close" @click="removeFile('multiple',index)"  v-if="compile">
							<image :src="closeImg"></image>
						</view>
					</view>
					<view class="addFile" v-if="compile">
						<image :style="{
							width:width,
							height:height
						}" :src="background" mode="上传文件" @click="uploadFile('multiple')"></image>
						<text>{{upImgText}}</text>
					</view>
				</view>
			</view>
			<view v-else class="single">
				<view :style="{
						width:width,
						height:height
					}" class="addFile" >
					<image mode="aspectFill" :src="fileList[0] && fileList[0][valueKey] || background" @click="uploadFile('single')"></image>
					<view class="close" @click="removeFile('single')" v-if="fileList.length && compile" >
						<image :src="closeImg"></image>
					</view>
				</view>
			</view>
		</view>
		<view class="accessory" v-else>
			
		</view>
	</view>
</template>
<script>
	export default {
		data(){
			return {
				// 文件列表
				fileList:[], 
				// 删除的文件id
				removeList:[],
			}
		},
		props:{
			config:{
				type: Object,
				default:{
					count:1,         							// 上传图片张数
					sizeType: ['original','compressed'], 				// original 原图，compressed 压缩图，默认二者都有
					sourceType:	['album','camera'],								// album 从相册选图，camera 使用相机，默认二者都有。如需直接开相机或直接选相册，请只使用一个选项
				}
			},
			// 0 表示媒体文件 1 附件  默认为0
			fileType:{
				type: Number,
				default: 0,
			},
			// 0 表示上传多张图片模式 1 表示上传一张模式  当type设置为1时count无效
			type:{
				type: Number,
				default: 0,
			},
			// 上传图片的背景
			background:{
				type: String,
				default:'https://vkceyugu.cdn.bspapp.com/VKCEYUGU-aliyun-hglbk3dir3rbd07f5a/2efd0ea0-5718-11eb-8a36-ebb87efcf8c0.png',
			},
			// 删除图片
			closeImg:{
				type: String,
				default:'https://vkceyugu.cdn.bspapp.com/VKCEYUGU-aliyun-14mxvwe8lug756a025/12e55e20-50b0-11eb-b680-7980c8a877b8.png',
			},
			// 0 阿里云上传 1 腾讯云 2 自定义上传  默认为0
			upFileType:{
				type: Number,
				default:0,
			},
			// 展示图片的key
			valueKey:{
				type: String,
				default:'url',
			},
			// 图片的宽度
			width:{
				type: String,
				default:'210rpx',
			},
			// 图片的高度
			height:{
				type: String,
				default:'210rpx',
			},
			// 需要展示的图片数组
			values:{ 
				type: Array,
				default:() => [],
			},
			// true是编辑模式上传 false查看模式只能查看
			compile:{ 
				type: Boolean,
				default:() => true,
			},
			// 自定义文字
			upImgText:{ 
				type: String,
				default:() => '上传图片',
			},
		},
		onShow:function(){
			this.reset()
		},
		mounted(){
		},
		methods:{
			reset(){
				this.fileList = [...this.values] || []
				this.removeList = []
			},
			updataFile(){
				//前端代码
				uni.chooseImage({
					count: this.type || this.config.count,
					sizeType: this.config.sizeType,
					sourceType: this.config.sourceType,
					success: (res) => {
						if (res.tempFiles.length > 0) {
							switch (this.upFileType){
								case 1:
									
									break;
								case 2:
									this.$emit('upLoadFile',res)
									break;
								default:
									let count = 0 
									uni.showLoading({
										title: '正在上传',
										mask:true,
									});
									let upFile = async (data) => {
										if(data.length > count){
											console.log(uniCloud)
											const result = await uniCloud.uploadFile({
												filePath: data[count].path,
												cloudPath: data[count].name || data[count].path.match(/[^\/]+$/)[0],  // 只有h5能获取到图片的名字
												onUploadProgress: function(progressEvent) {
													// this.$emit('onUploadProgress',progressEvent)
												}
											});
											this.fileList.push({size:data[count].size,name:data[count].name,[this.valueKey]:result.fileID})
											count++
											upFile(data)
										}else{
											uni.hideLoading()
											this.fileListChange()
										}
									}
									upFile(res.tempFiles)
									break;
							}
							
						}else{
							uni.showToast({
								title: '获取图片失败请刷新重试',
								icon:'none',
								duration: 2000
							});
						}
					},
					fail(res){
						console.log(res)
						uni.showToast({
							title: res,
							icon:'none',
							duration: 2000
						});
					},
					complete(res){
					}
				})
			},
			seeImage(index_ = 0){
				let images = []
				this.fileList.forEach(el => {
					if(/\.(png|jpg|jpeg|gif|webp|svg|webm)$/.test(el[this.valueKey])){
						images.push(el[this.valueKey])
					}
				})
				if(images.length){
					uni.previewImage({
						urls:images,
						current:index_
					})
				}
			},
			uploadFile(type){
				if('single' === type){
					if(this.fileList.length){
						this.seeImage()
						return 
					}
					this.reset()
				}
				this.updataFile()
			},
			removeFile(type,index){
				if('single' === type){
					this.removeList = [...this.fileList]
					this.fileList = []
				}else if('multiple' === type){
					this.removeList.push(this.fileList[index])
					this.fileList.splice(index,1)
				}
				this.fileListChange()
			},
			// 当图片上传或者删除时都会触发这个函数
			fileListChange(){
				this.$emit('fileListChange',{
					fileList:this.fileList,
					removeList:this.removeList
				})
			}
		}
	}
</script>

<style lang="scss">
	.upFile{
		
		.addFile{
			position: relative;
			
			image{
				width: 100%;
				height: 100%;
				cursor: pointer;
				border-radius: 6rpx;
			}
			
			text{
				left: 50%;
				bottom: 20%;
				position: absolute;
				white-space: nowrap;
				transform: translateX(-50%);
			}
		}
		
		.imageList{
			padding: 10rpx 0;
			
			>view{
				margin-right: 20rpx;
				margin-bottom: 16rpx;
				display: inline-block;
			}
			
			image{
				width: 100%;
				height: 100%;
				border-radius: 10rpx;
			}
			
			.imageItem{
				position: relative;
			}
			
			// .close{
			// 	top: -20rpx;
			// 	right: 8%;
			// }
		}
		
		.close{
			width: 40rpx;
			height: 40rpx;
			top: -20rpx;
			right: -20rpx;
			padding: 10rpx;
			position: absolute;
			
		}
	}
</style>
