From 2982dc5838a11ed3700cd08e1e04f3af62df00d2 Mon Sep 17 00:00:00 2001 From: vivganes Date: Wed, 12 Apr 2023 16:47:59 +0530 Subject: [PATCH 1/4] fix #502 --- packages/app/src/Element/NoteCreator.tsx | 43 +++++++++++++++++++++++- 1 file changed, 42 insertions(+), 1 deletion(-) diff --git a/packages/app/src/Element/NoteCreator.tsx b/packages/app/src/Element/NoteCreator.tsx index a338c5a2..566fb4ed 100644 --- a/packages/app/src/Element/NoteCreator.tsx +++ b/packages/app/src/Element/NoteCreator.tsx @@ -27,6 +27,8 @@ import type { RootState } from "State/Store"; import { LNURL } from "LNURL"; import messages from "./messages"; +import { ClipboardEventHandler, useState } from "react"; +import Spinner from "Icons/Spinner"; interface NotePreviewProps { note: TaggedRawEvent; @@ -58,6 +60,7 @@ export function NoteCreator() { const zapForward = useSelector((s: RootState) => s.noteCreator.zapForward); const sensitive = useSelector((s: RootState) => s.noteCreator.sensitive); const pollOptions = useSelector((s: RootState) => s.noteCreator.pollOptions); + const [uploadInProgress, setUploadInProgress] = useState(false); const dispatch = useDispatch(); async function sendNote() { @@ -99,6 +102,19 @@ export function NoteCreator() { async function attachFile() { try { const file = await openFile(); + if (file) { + uploadFile(file); + } + } catch (error: unknown) { + if (error instanceof Error) { + dispatch(setError(error?.message)); + } + } + } + + async function uploadFile(file: File) { + setUploadInProgress(true); + try { if (file) { const rx = await uploader.upload(file, file.name); if (rx.url) { @@ -106,11 +122,13 @@ export function NoteCreator() { } else if (rx?.error) { dispatch(setError(rx.error)); } + setUploadInProgress(false); } } catch (error: unknown) { if (error instanceof Error) { dispatch(setError(error?.message)); } + setUploadInProgress(false); } } @@ -205,6 +223,26 @@ export function NoteCreator() { } } + const handlePaste: ClipboardEventHandler = evt => { + if (evt.clipboardData) { + const clipboardItems = evt.clipboardData.items; + const items: DataTransferItem[] = Array.from(clipboardItems).filter(function (item: DataTransferItem) { + // Filter the image items only + return /^image\//.test(item.type); + }); + if (items.length === 0) { + return; + } + + const item = items[0]; + const blob = item.getAsFile(); + if (blob) { + const file = new File([blob], "filename.jpg", { type: "image/jpeg", lastModified: new Date().getTime() }); + uploadFile(file); + } + } + }; + return ( <> {show && ( @@ -212,7 +250,9 @@ export function NoteCreator() { {replyTo && } {preview && getPreviewNote()} {!preview && ( -
+