| import Taro from '@tarojs/taro'; | 
| import { ossUpload, OssUploadOptions } from './oss'; | 
| import { OssMedia } from '@12333/constants'; | 
| import { FileItem } from '@nutui/nutui-taro/dist/types/__VUE/uploader/type'; | 
| import { delay, guid } from '@12333/utils'; | 
|   | 
| export type ChooseMediaOptions = Taro.chooseMedia.Option & { | 
|   onSuccess?: ( | 
|     result: Taro.uploadFile.SuccessCallbackResult, | 
|     ossRes: { path: string; url: string; name: string }, | 
|     options: { | 
|       file: ChooseFileItem; | 
|     } | 
|   ) => void; | 
|   onStart?: (fileList: ChooseFileItem[]) => void; | 
|   onFail?: ( | 
|     res: TaroGeneral.CallbackResult, | 
|     options: { | 
|       file: ChooseFileItem; | 
|     } | 
|   ) => void; | 
| }; | 
|   | 
| export function chooseMedia(options: ChooseMediaOptions) { | 
|   const task = Taro.chooseMedia({ | 
|     count: 1, | 
|     mediaType: ['image'], | 
|     sourceType: ['album', 'camera'], | 
|     maxDuration: 30, | 
|     camera: 'back', | 
|     ...options, | 
|     success: (res) => { | 
|       Taro.showLoading({ | 
|         title: '上传中', | 
|         mask: true, | 
|       }); | 
|       const fileList = readFiles(res.tempFiles); | 
|       // console.log('onStart fileList: ', fileList); | 
|       options.onStart?.(fileList); | 
|       fileList.forEach((element, _index) => { | 
|         ossUpload({ | 
|           filePath: element.path, | 
|           fileDirectory: OssMedia, | 
|           customFileName: () => element.uid, | 
|           success(result, ossRes) { | 
|             // console.log('result element: ', element); | 
|             options.onSuccess?.(result, ossRes, { | 
|               file: element, | 
|             }); | 
|           }, | 
|           fail(e) { | 
|             options.onFail?.(e, { | 
|               file: element, | 
|             }); | 
|           }, | 
|         }); | 
|       }); | 
|     }, | 
|   }); | 
| } | 
|   | 
| interface TFileType { | 
|   size: number; | 
|   type?: string; | 
|   fileType?: string; | 
|   originalFileObj?: any; | 
|   tempFilePath?: string; | 
|   thumbTempFilePath?: string; | 
|   path?: string; | 
| } | 
|   | 
| export type ChooseFileItem = FileItem & { | 
|   previewUrl?: string; | 
| }; | 
|   | 
| function readFiles<T extends TFileType>(files: T[]) { | 
|   const fileList: ChooseFileItem[] = []; | 
|   files.forEach((file, index) => { | 
|     let fileType = file.type; | 
|     let filepath = (file.tempFilePath || file.path) as string; | 
|     const fileItem = createFileItem(file); | 
|     if (file.fileType) { | 
|       fileType = file.fileType; | 
|     } else { | 
|       const imgReg = /\.(png|jpeg|jpg|webp|gif)$/i; | 
|       if (!fileType && (imgReg.test(filepath) || filepath.includes('data:image'))) { | 
|         fileType = 'image'; | 
|       } | 
|     } | 
|     fileItem.path = filepath; | 
|     fileItem.name = filepath; | 
|     fileItem.status = 'ready'; | 
|     fileItem.message = '准备上传'; | 
|     fileItem.type = fileType; | 
|     fileItem.previewUrl = filepath; | 
|     fileItem.url = fileType == 'video' ? file.thumbTempFilePath : filepath; | 
|     fileList.push(fileItem); | 
|   }); | 
|   | 
|   return fileList; | 
| } | 
|   | 
| function createFileItem(file: TFileType) { | 
|   return { | 
|     status: 'ready', | 
|     message: '准备上传', | 
|     uid: guid(), | 
|     name: '', | 
|     url: '', | 
|     previewUrl: '', | 
|     type: '', | 
|     path: '', | 
|     percentage: 100, | 
|     formData: {}, | 
|   } as ChooseFileItem; | 
| } | 
|   | 
| export type ChooseImageOptions = Taro.chooseImage.Option & { | 
|   onSuccess?: OssUploadOptions['success']; | 
| }; | 
|   | 
| export function chooseImage(options: ChooseImageOptions) { | 
|   Taro.chooseImage({ | 
|     count: 9, // 默认9 | 
|     sizeType: ['original', 'compressed'], // 可以指定是原图还是压缩图,默认二者都有 | 
|     sourceType: ['album', 'camera'], // 可以指定来源是相册还是相机,默认二者都有,在H5浏览器端支持使用 `user` 和 `environment`分别指定为前后摄像头 | 
|     success: function (res) { | 
|       res.tempFilePaths.forEach((element) => { | 
|         console.log('element: ', element); | 
|         ossUpload({ | 
|           filePath: element, | 
|           fileDirectory: OssMedia, | 
|           success(result, ossRes) { | 
|             options.onSuccess?.(result, ossRes); | 
|           }, | 
|         }); | 
|       }); | 
|     }, | 
|   }); | 
| } |