@szmg-fe/tarco
Version:
function library in Taro
76 lines (65 loc) • 2.29 kB
text/typescript
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;
}