From cc1ec2da2f3772f8d6e0b85d63d0ddf9c1130ff8 Mon Sep 17 00:00:00 2001 From: florian <> Date: Sat, 30 Mar 2024 23:18:41 +0100 Subject: [PATCH] feat: PDF and audio views --- bun.lockb | Bin 142566 -> 164115 bytes package.json | 2 + src/components/BlobList/BlobList.css | 4 +- src/components/BlobList/BlobList.tsx | 229 +++++++++++++++++++++------ src/main.tsx | 11 +- src/pages/Check.tsx | 1 - src/pages/Transfer.tsx | 2 +- src/pages/Upload.tsx | 7 +- 8 files changed, 201 insertions(+), 55 deletions(-) diff --git a/bun.lockb b/bun.lockb index 7d6963ffc64692d53b670d41ff2294cb21f0dcd9..f812d5793ec7ca1b30aedc091fec50f6bf71030a 100755 GIT binary patch delta 38781 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 { const [mode, setMode] = useState('list'); + const images = useMemo( + () => blobs.filter(b => b.type?.startsWith('image/')).sort((a, b) => (a.created > b.created ? -1 : 1)), // descending + [blobs] + ); + + const videos = useMemo( + () => blobs.filter(b => b.type?.startsWith('video/')).sort((a, b) => (a.created > b.created ? -1 : 1)), // descending + [blobs] + ); + + const audio = useMemo( + () => blobs.filter(b => b.type?.startsWith('audio/')).sort((a, b) => (a.created > b.created ? -1 : 1)), // descending + [blobs] + ); + + const docs = useMemo( + () => blobs.filter(b => b.type?.startsWith('application/pdf')).sort((a, b) => (a.created > b.created ? -1 : 1)), // descending + [blobs] + ); + + useEffect(() => { + switch (mode) { + case 'video': + if (videos.length == 0) setMode('list'); + break; + case 'audio': + if (audio.length == 0) setMode('list'); + break; + case 'gallery': + if (images.length == 0) setMode('list'); + break; + case 'docs': + if (docs.length == 0) setMode('list'); + break; + } + }, [videos, images, audio, mode, docs]); + + const Actions = ({ blob, className }: { blob: BlobDescriptor; className?: string }) => ( + + ); + return ( <>
{title &&

{title}

}
- - + + +
{mode == 'gallery' && ( -
- {blobs - .filter(b => b.type?.startsWith('image/')) - .sort((a, b) => (a.created > b.created ? -1 : 1)) // descending - .map(blob => ( -
- -
-
-
- {formatFileSize(blob.size)} - {formatDate(blob.created)} -
+
+ {images.map(blob => ( +
+ +
+
+
+ {formatFileSize(blob.size)} + {formatDate(blob.created)}
- ))} + +
+ ))} +
+ )} + + {mode == 'video' && ( +
+ {videos.map(blob => ( +
+ +
+ {formatFileSize(blob.size)} + {formatDate(blob.created)} +
+ +
+ ))} +
+ )} + + {mode == 'audio' && ( +
+ {audio.map(blob => ( +
+ +
+ {formatFileSize(blob.size)} + {formatDate(blob.created)} +
+ +
+ ))} +
+ )} + + {mode == 'docs' && ( +
+ {docs.map(blob => ( +
+ + + + + +
+ {formatFileSize(blob.size)} + {formatDate(blob.created)} +
+ +
+ ))}
)} @@ -75,28 +225,13 @@ const BlobList = ({ blobs, onDelete, title }: BlobListProps) => { {formatFileSize(blob.size)} {blob.type && `${blob.type}`} {formatDate(blob.created)} - - +
))}
)} ); - }; export default BlobList; diff --git a/src/main.tsx b/src/main.tsx index ba2e335..d6519bf 100644 --- a/src/main.tsx +++ b/src/main.tsx @@ -13,13 +13,20 @@ import Check from './pages/Check.tsx'; const queryClient = new QueryClient(); +import { pdfjs } from 'react-pdf'; + +pdfjs.GlobalWorkerOptions.workerSrc = new URL( + 'pdfjs-dist/build/pdf.worker.min.js', + import.meta.url, +).toString(); + const router = createBrowserRouter( createRoutesFromElements( }> } /> } /> - } /> - } /> + } /> + } /> ) ); diff --git a/src/pages/Check.tsx b/src/pages/Check.tsx index 615bcab..c0ba2c4 100644 --- a/src/pages/Check.tsx +++ b/src/pages/Check.tsx @@ -16,7 +16,6 @@ function Check() { servers={Object.values(serverInfo).filter(s => s.name == source)} onCancel={() => navigate('/')} > - ); } diff --git a/src/pages/Transfer.tsx b/src/pages/Transfer.tsx index c9b76fa..239ab05 100644 --- a/src/pages/Transfer.tsx +++ b/src/pages/Transfer.tsx @@ -29,7 +29,7 @@ type TransferStatus = { export const Transfer = () => { const { source: transferSource } = useParams(); const navigate = useNavigate(); - const {serverInfo} = useServerInfo(); + const { serverInfo } = useServerInfo(); const [transferTarget, setTransferTarget] = useState(); const { signEventTemplate } = useNDK(); const queryClient = useQueryClient(); diff --git a/src/pages/Upload.tsx b/src/pages/Upload.tsx index 134c09c..1d97d27 100644 --- a/src/pages/Upload.tsx +++ b/src/pages/Upload.tsx @@ -1,4 +1,4 @@ -import { ChangeEvent, DragEvent, useEffect, useState } from 'react'; +import { ChangeEvent, DragEvent, useEffect, useMemo, useState } from 'react'; import { useServers } from '../utils/useServers'; import { BlobDescriptor, BlossomClient, SignedEvent } from 'blossom-client-sdk'; import { useNDK } from '../ndk'; @@ -9,6 +9,7 @@ import ProgressBar from '../components/ProgressBar/ProgressBar'; import { removeExifData } from '../exif'; import CheckBox from '../components/CheckBox/CheckBox'; import axios, { AxiosProgressEvent } from 'axios'; +import { formatFileSize } from '../utils'; type TransferStats = { enabled: boolean; @@ -129,6 +130,8 @@ function Upload() { } }; + const sizeOfFilesToUpload = useMemo(() => files.reduce((acc, file) => (acc += file.size), 0), [files]); + return ( <>

Upload

@@ -190,7 +193,7 @@ function Upload() { onClick={() => upload()} disabled={files.length == 0} > - Upload{files.length > 0 ? (files.length == 1 ? ` 1 file` : ` ${files.length} files`) : ''} + Upload{files.length > 0 ? (files.length == 1 ? ` 1 file` : ` ${files.length} files` ) : ''} / {formatFileSize(sizeOfFilesToUpload)}