From 6652c920642d09905a514b7b25ddf5f516978b35 Mon Sep 17 00:00:00 2001 From: Kieran Date: Tue, 31 Jan 2023 19:08:11 +0000 Subject: [PATCH] feat: nostrimg.com --- src/Element/NoteCreator.tsx | 2 +- src/Pages/settings/Preferences.tsx | 1 + src/Pages/settings/Profile.tsx | 2 +- src/State/Login.ts | 2 +- .../NostrBuild.ts} | 4 +- src/Upload/NostrImg.ts | 41 +++++++++++++++++++ src/{Feed/VoidUpload.ts => Upload/VoidCat.ts} | 4 +- src/{Feed/FileUpload.ts => Upload/index.ts} | 14 +++++-- 8 files changed, 59 insertions(+), 11 deletions(-) rename src/{Feed/NostrBuildUpload.ts => Upload/NostrBuild.ts} (77%) create mode 100644 src/Upload/NostrImg.ts rename src/{Feed/VoidUpload.ts => Upload/VoidCat.ts} (92%) rename src/{Feed/FileUpload.ts => Upload/index.ts} (66%) diff --git a/src/Element/NoteCreator.tsx b/src/Element/NoteCreator.tsx index a4223d2..cefe254 100644 --- a/src/Element/NoteCreator.tsx +++ b/src/Element/NoteCreator.tsx @@ -10,7 +10,7 @@ import { openFile } from "Util"; import Textarea from "Element/Textarea"; import Modal from "Element/Modal"; import { default as NEvent } from "Nostr/Event"; -import useFileUpload from "Feed/FileUpload"; +import useFileUpload from "Upload"; export interface NoteCreatorProps { show: boolean diff --git a/src/Pages/settings/Preferences.tsx b/src/Pages/settings/Preferences.tsx index 93e3bfd..25774da 100644 --- a/src/Pages/settings/Preferences.tsx +++ b/src/Pages/settings/Preferences.tsx @@ -105,6 +105,7 @@ const PreferencesPage = () => { diff --git a/src/Pages/settings/Profile.tsx b/src/Pages/settings/Profile.tsx index 28b82cc..9d5bc51 100644 --- a/src/Pages/settings/Profile.tsx +++ b/src/Pages/settings/Profile.tsx @@ -14,7 +14,7 @@ import { hexToBech32, openFile } from "Util"; import Copy from "Element/Copy"; import { RootState } from "State/Store"; import { HexKey } from "Nostr"; -import useFileUpload from "Feed/FileUpload"; +import useFileUpload from "Upload"; export default function ProfileSettings() { const navigate = useNavigate(); diff --git a/src/State/Login.ts b/src/State/Login.ts index e564022..f3a684c 100644 --- a/src/State/Login.ts +++ b/src/State/Login.ts @@ -54,7 +54,7 @@ export interface UserPreferences { /** * File uploading service to upload attachments to */ - fileUploader: "void.cat" | "nostr.build", + fileUploader: "void.cat" | "nostr.build" | "nostrimg.com", /** * Use imgproxy to optimize images diff --git a/src/Feed/NostrBuildUpload.ts b/src/Upload/NostrBuild.ts similarity index 77% rename from src/Feed/NostrBuildUpload.ts rename to src/Upload/NostrBuild.ts index 9c934ef..69d5b11 100644 --- a/src/Feed/NostrBuildUpload.ts +++ b/src/Upload/NostrBuild.ts @@ -1,6 +1,6 @@ -import { UploadResult } from "./FileUpload"; +import { UploadResult } from "Upload"; -export default async function NostrBuildUpload(file: File | Blob): Promise { +export default async function NostrBuild(file: File | Blob): Promise { let fd = new FormData(); fd.append("fileToUpload", file); fd.append("submit", "Upload Image"); diff --git a/src/Upload/NostrImg.ts b/src/Upload/NostrImg.ts new file mode 100644 index 0000000..b91387c --- /dev/null +++ b/src/Upload/NostrImg.ts @@ -0,0 +1,41 @@ +import { UploadResult } from "Upload"; + +export default async function NostrImg(file: File | Blob): Promise { + let fd = new FormData(); + fd.append("image", file); + + let rsp = await fetch("https://nostrimg.com/api/upload", { + body: fd, + method: "POST", + headers: { + "accept": "application/json" + } + }); + if (rsp.ok) { + let data: UploadResponse = await rsp.json(); + if (typeof data?.imageUrl === "string" && data.success) { + return { + url: new URL(data.imageUrl).toString() + } + } + } + return { + error: "Upload failed" + } +} + +interface UploadResponse { + fileID?: string, + fileName?: string, + imageUrl?: string, + lightningDestination?: string, + lightningPaymentLink?: string, + message?: string, + route?: string, + status: number, + success: boolean, + url?: string, + data?: { + url?: string + } +} \ No newline at end of file diff --git a/src/Feed/VoidUpload.ts b/src/Upload/VoidCat.ts similarity index 92% rename from src/Feed/VoidUpload.ts rename to src/Upload/VoidCat.ts index e492f7c..3370852 100644 --- a/src/Feed/VoidUpload.ts +++ b/src/Upload/VoidCat.ts @@ -1,12 +1,12 @@ import * as secp from "@noble/secp256k1"; import { FileExtensionRegex, VoidCatHost } from "Const"; -import { UploadResult } from "./FileUpload"; +import { UploadResult } from "Upload"; /** * Upload file to void.cat * https://void.cat/swagger/index.html */ -export default async function VoidUpload(file: File | Blob, filename: string): Promise { +export default async function VoidCat(file: File | Blob, filename: string): Promise { const buf = await file.arrayBuffer(); const digest = await crypto.subtle.digest("SHA-256", buf); diff --git a/src/Feed/FileUpload.ts b/src/Upload/index.ts similarity index 66% rename from src/Feed/FileUpload.ts rename to src/Upload/index.ts index 1610c85..5a3879b 100644 --- a/src/Feed/FileUpload.ts +++ b/src/Upload/index.ts @@ -1,7 +1,8 @@ import { useSelector } from "react-redux"; import { RootState } from "State/Store"; -import NostrBuildUpload from "./NostrBuildUpload"; -import VoidUpload from "./VoidUpload"; +import NostrBuild from "Upload/NostrBuild"; +import VoidCat from "Upload/VoidCat"; +import NostrImg from "./NostrImg"; export interface UploadResult { url?: string, @@ -18,12 +19,17 @@ export default function useFileUpload(): Uploader { switch (fileUploader) { case "nostr.build": { return { - upload: NostrBuildUpload + upload: NostrBuild + } as Uploader; + } + case "nostrimg.com": { + return { + upload: NostrImg } as Uploader; } default: { return { - upload: VoidUpload + upload: VoidCat } as Uploader; } }