diff --git a/src/Element/NoteCreator.tsx b/src/Element/NoteCreator.tsx
index a4223d2b..cefe2548 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 93e3bfd0..25774dac 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 28b82cc6..9d5bc517 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 ddaee2ac..b4cf6f0e 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 9c934efa..69d5b116 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 00000000..b91387c9
--- /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 e492f7c6..33708520 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 1610c855..5a3879b8 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;
}
}