diff --git a/package.json b/package.json index 3e0b68a..9e2b91f 100644 --- a/package.json +++ b/package.json @@ -19,6 +19,7 @@ "@nostr-dev-kit/ndk-cache-dexie": "^2.2.8", "@tanstack/react-query": "^5.28.6", "@tanstack/react-query-devtools": "^5.28.6", + "axios": "^1.6.8", "blossom-client-sdk": "^0.4.0", "dayjs": "^1.11.10", "nostr-tools": "^2.3.2", diff --git a/src/components/Layout/Layout.css b/src/components/Layout/Layout.css index a57c9e0..5433267 100644 --- a/src/components/Layout/Layout.css +++ b/src/components/Layout/Layout.css @@ -3,11 +3,11 @@ } .content { - @apply flex flex-col self-center sm:w-10/12 lg:w-4/6 w-full min-h-[80vh] + @apply flex flex-col self-center sm:w-10/12 xl:w-4/6 w-full min-h-[80vh]; } .title { - @apply text-white text-4xl flex flex-row items-center gap-2 p-4 sm:w-10/12 lg:w-4/6 w-full self-center; + @apply text-white text-4xl flex flex-row items-center gap-2 p-4 sm:w-10/12 xl:w-4/6 w-full self-center; } .title img { diff --git a/src/pages/Upload.tsx b/src/pages/Upload.tsx index 3fc8b68..134c09c 100644 --- a/src/pages/Upload.tsx +++ b/src/pages/Upload.tsx @@ -1,6 +1,6 @@ import { ChangeEvent, DragEvent, useEffect, useState } from 'react'; import { useServers } from '../utils/useServers'; -import { BlossomClient } from 'blossom-client-sdk'; +import { BlobDescriptor, BlossomClient, SignedEvent } from 'blossom-client-sdk'; import { useNDK } from '../ndk'; import { useServerInfo } from '../utils/useServerInfo'; import { useQueryClient } from '@tanstack/react-query'; @@ -8,6 +8,7 @@ import { ArrowUpOnSquareIcon } from '@heroicons/react/24/outline'; import ProgressBar from '../components/ProgressBar/ProgressBar'; import { removeExifData } from '../exif'; import CheckBox from '../components/CheckBox/CheckBox'; +import axios, { AxiosProgressEvent } from 'axios'; type TransferStats = { enabled: boolean; @@ -23,8 +24,27 @@ function Upload() { const [transfers, setTransfers] = useState<{ [key: string]: TransferStats }>({}); const [files, setFiles] = useState([]); const [cleanPrivateData, setCleanPrivateData] = useState(true); - const [resizeImages, setResizeImages] = useState(false); - const [publishToNostr, setPublishToNostr] = useState(false); + // const [resizeImages, setResizeImages] = useState(false); + // const [publishToNostr, setPublishToNostr] = useState(false); + + async function uploadBlob( + server: string, + file: File, + auth?: SignedEvent, + onUploadProgress?: (progressEvent: AxiosProgressEvent) => void + ) { + const headers = { + Accept: 'application/json', + 'Content-Type': file.type, + }; + + const res = await axios.put(`${server}/upload`, file, { + headers: auth ? { ...headers, authorization: BlossomClient.encodeAuthorizationHeader(auth) } : headers, + onUploadProgress, + }); + + return res.data; + } const upload = async () => { const filesToUpload: File[] = []; @@ -59,11 +79,23 @@ function Upload() { continue; } const serverUrl = serverInfo[server.name].url; + let serverTransferred = 0; for (const file of filesToUpload) { const uploadAuth = await BlossomClient.getUploadAuth(file, signEventTemplate, 'Upload Blob'); - const newBlob = await BlossomClient.uploadBlob(serverUrl, file, uploadAuth); - transfers[server.name].transferred += file.size; + const newBlob = await uploadBlob(serverUrl, file, uploadAuth, progressEvent => { + setTransfers(ut => ({ + ...ut, + [server.name]: { ...ut[server.name], transferred: serverTransferred + progressEvent.loaded }, + })); + }); + + serverTransferred += file.size; + setTransfers(ut => ({ + ...ut, + [server.name]: { ...ut[server.name], transferred: serverTransferred }, + })); + console.log(newBlob); } queryClient.invalidateQueries({ queryKey: ['blobs', server.name] }); @@ -138,6 +170,7 @@ function Upload() { setChecked={c => setCleanPrivateData(c)} label="Clean private data in images (EXIF)" > + {/* setPublishToNostr(c)} label="Publish to NOSTR (as 1063 file metadata event) (NOT IMPLEMENTED YET!)" > + */}