UNPKG

@szmg-fe/tarco

Version:

function library in Taro

76 lines (65 loc) 2.29 kB
import useCos from "@szmg-fe/tarco/useCos"; import useVod from "@szmg-fe/tarco/useVod"; import { compose, concat } from '@szmg-fe/funba/ramda' import prop from '@szmg-fe/funba/prop' import fork from '@szmg-fe/funba/fork' import Task from '@szmg-fe/funba/Task' import { useState } from "react"; import useRefCallback from "@szmg-fe/hooks/useRefCallback"; import showLoading from "./showLoading"; import hideLoading from "./hideLoading"; /** * * @param chooseTask a task for choose media * @returns {medias, setMedias, upload} */ export default function useMediasUpload<T>(config: { cosTask: Task, vodTask: Task }) { const [medias, setMedias] = useState<Array<T>>([]); const { cosTask, vodTask } = config; const createCosUploadTask = useCos(cosTask); const createVodUploadTask = useVod(vodTask); const error = i => { throw new Error(i) }; // 这里接收cos&vod上传的结果 const saveUploadLi = compose(setMedias, concat(medias)); // 上传cos&vod const uploadImg = arr => { showLoading("正在上传中..."); const allTask = arr.map(i => { return new Promise((res) => { compose(fork(error, res), createCosUploadTask, prop('tempFilePath'))(i) }) }); Promise.all(allTask).then(res => { saveUploadLi(res as any); hideLoading(); }); }; const uploadVideo = arr => { const allTask = arr.map(i => { return new Promise((res) => { compose(fork(error, res), createVodUploadTask)(i) }) }); Promise.all(allTask).then(res => saveUploadLi(res as any)); } // 这里接收原生上传的结果 const [handleImage, handleVideo] = [uploadImg, uploadVideo].map(f => compose(f, prop('tempFiles'))); const uploadMedia = li => { if ((li.type as string).toLocaleLowerCase() === 'image') { return handleImage(li); } else { return handleVideo(li); } } const init = useRefCallback((chooseTask) => { const upload = compose(fork(error, uploadMedia), chooseTask); const max: T[] = medias.slice(0, 9); return { medias: max, setMedias, upload } }); return init; }