feat: fix uploader

This commit is contained in:
Nevo David 2024-07-21 14:38:17 +07:00
parent f1dfce9f1d
commit 52c8e18ea8
4 changed files with 41 additions and 87 deletions

View File

@ -352,10 +352,12 @@ html {
}
.uppy-ProgressBar-inner[style='width: 0%;'],
.uppy-ProgressBar-inner[style='width: 0%;'] + div,
.uppy-ProgressBar-inner[style='width: 0%;'] + div {
opacity: 0;
}
.uppy-ProgressBar-inner[style='width: 100%;'],
.uppy-ProgressBar-inner[style='width: 100%;'] + div {
visibility: hidden;
@apply animate-normalFadeOut;
}
.fill-text-white {

View File

@ -63,8 +63,6 @@ export const MediaBox: FC<{
const [mediaList, setListMedia] = useState<Media[]>([]);
const fetch = useFetch();
const mediaDirectory = useMediaDirectory();
const toaster = useToaster();
const [uploadProgress, setUploadProgress] = useState(0);
const [loading, setLoading] = useState(false);
@ -72,59 +70,6 @@ export const MediaBox: FC<{
return (await fetch('/media')).json();
}, []);
const uploadMedia = useCallback(
async (event: ChangeEvent<HTMLInputElement>) => {
const file = event.target.files?.[0]!;
const totalChunks = Math.ceil(file.size / CHUNK_SIZE);
for (let i = 0; i < totalChunks; i++) {
const chunk = file.slice(i, i + CHUNK_SIZE);
const formData = new FormData();
formData.append('chunk', chunk);
formData.append('chunkNumber', String(i));
formData.append('totalChunks', String(totalChunks));
formData.append('fileName', file.name);
const percent = ((i + 1) / totalChunks) * 100;
setUploadProgress(percent);
const data = await (
await fetch('/media', {
method: 'POST',
body: formData,
})
).json();
}
// const maxFileSize =
// (file?.target?.files?.[0].name.indexOf('mp4') || -1) > -1
// ? 100 * 1024 * 1024
// : 10 * 1024 * 1024;
//
// if (
// !file?.target?.files?.length ||
// file?.target?.files?.[0]?.size > maxFileSize
// ) {
// toaster.show(
// `Maximum file size ${maxFileSize / 1024 / 1024}mb`,
// 'warning'
// );
// return;
// }
// const formData = new FormData();
// formData.append('file', file?.target?.files?.[0]);
// setLoading(true);
// const data = await (
// await fetch('/media', {
// method: 'POST',
// body: formData,
// })
// ).json();
// setLoading(false);
setListMedia([...mediaList, data]);
},
[mediaList]
);
const setNewMedia = useCallback(
(media: Media) => () => {
setMedia(media);
@ -178,18 +123,6 @@ export const MediaBox: FC<{
type="button"
>
<div className="relative flex gap-2 items-center justify-center">
<input
type="file"
className="absolute left-0 top-0 w-full h-full opacity-0"
accept={
type === 'video'
? 'video/mp4'
: type === 'image'
? 'image/*'
: 'image/*,video/mp4'
}
onChange={uploadMedia}
/>
<MultipartFileUploader
onUploadSuccess={mutate}
allowedFileTypes={
@ -207,24 +140,24 @@ export const MediaBox: FC<{
<div
className={clsx(
'flex flex-wrap gap-[10px] mt-[35px] pt-[20px]',
!mediaList.length && 'justify-center items-center text-white'
!!mediaList.length && 'justify-center items-center text-white'
)}
>
{!mediaList.length && (
<div className="flex flex-col text-center">
<div>You don{"'"}t have any assets yet.</div>
<div>Click the button below to upload one</div>
<div className="mt-[10px]">
{/*<MultipartFileUploader*/}
{/* onUploadSuccess={mutate}*/}
{/* allowedFileTypes={*/}
{/* type === 'video'*/}
{/* ? 'video/mp4'*/}
{/* : type === 'image'*/}
{/* ? 'image/*'*/}
{/* : 'image/*,video/mp4'*/}
{/* }*/}
{/*/>*/}
<div className="mt-[10px] justify-center items-center flex flex-col-reverse gap-[10px]">
<MultipartFileUploader
onUploadSuccess={mutate}
allowedFileTypes={
type === 'video'
? 'video/mp4'
: type === 'image'
? 'image/*'
: 'image/*,video/mp4'
}
/>
</div>
</div>
)}

View File

@ -1,4 +1,4 @@
import React, { useEffect, useMemo, useState } from 'react';
import React, { useCallback, useEffect, useMemo, useState } from 'react';
// @ts-ignore
import Uppy, { UploadResult } from '@uppy/core';
// @ts-ignore
@ -10,8 +10,8 @@ import sha256 from 'sha256';
import { FileInput, ProgressBar } from '@uppy/react';
// Uppy styles
import "@uppy/core/dist/style.min.css";
import "@uppy/dashboard/dist/style.min.css";
import '@uppy/core/dist/style.min.css';
import '@uppy/dashboard/dist/style.min.css';
const fetchUploadApiEndpoint = async (
fetch: any,
@ -39,18 +39,32 @@ export function MultipartFileUploader({
allowedFileTypes: string;
}) {
const [loaded, setLoaded] = useState(false);
const [reload, setReload] = useState(false);
const onUploadSuccessExtended = useCallback((result: UploadResult) => {
setReload(true);
onUploadSuccess(result);
}, [onUploadSuccess]);
useEffect(() => {
if (reload) {
setTimeout(() => {
setReload(false);
}, 1);
}
}, [reload]);
useEffect(() => {
setLoaded(true);
}, []);
if (!loaded) {
if (!loaded || reload) {
return null;
}
return (
<MultipartFileUploaderAfter
onUploadSuccess={onUploadSuccess}
onUploadSuccess={onUploadSuccessExtended}
allowedFileTypes={allowedFileTypes}
/>
);

View File

@ -39,10 +39,11 @@ module.exports = {
loginBg: 'url(/auth/bg-login.png)',
},
fontFamily: {
sans: ["Helvetica Neue"],
sans: ['Helvetica Neue'],
},
animation: {
fade: 'fadeOut 0.5s ease-in-out',
normalFadeOut: 'normalFadeOut 0.5s linear 5s forwards',
overflow: 'overFlow 0.5s ease-in-out forwards',
overflowReverse: 'overFlowReverse 0.5s ease-in-out forwards',
fadeDown: 'fadeDown 4s ease-in-out forwards',
@ -60,6 +61,10 @@ module.exports = {
'0%': { opacity: 0, transform: 'translateY(30px)' },
'100%': { opacity: 1, transform: 'translateY(0)' },
},
normalFadeOut: {
'0%': { opacity: 1 },
'100%': { opacity: 0 },
},
overFlow: {
'0%': { overflow: 'hidden' },
'99%': { overflow: 'hidden' },