Merge pull request #19 from ntsd/feat/paste-from-clipboard

feat: add paste from clipboard
This commit is contained in:
Abi Raja 2023-11-18 15:39:10 -05:00 committed by GitHub
commit 183ddde941
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 41 additions and 7 deletions

View File

@ -80,11 +80,13 @@ function App() {
// Initial version creation // Initial version creation
function doCreate(referenceImages: string[]) { function doCreate(referenceImages: string[]) {
setReferenceImages(referenceImages); setReferenceImages(referenceImages);
if (referenceImages.length > 0) {
doGenerateCode({ doGenerateCode({
generationType: "create", generationType: "create",
image: referenceImages[0], image: referenceImages[0],
}); });
} }
}
// Subsequent updates // Subsequent updates
function doUpdate() { function doUpdate() {

View File

@ -1,4 +1,4 @@
import { useState, useEffect, useMemo } from "react"; import { useState, useEffect, useMemo, useCallback } from "react";
import { useDropzone } from "react-dropzone"; import { useDropzone } from "react-dropzone";
// import { PromptImage } from "../../../types"; // import { PromptImage } from "../../../types";
import { toast } from "react-hot-toast"; import { toast } from "react-hot-toast";
@ -80,7 +80,7 @@ function ImageUpload({ setReferenceImages }: Props) {
setReferenceImages(dataUrls.map((dataUrl) => dataUrl as string)); setReferenceImages(dataUrls.map((dataUrl) => dataUrl as string));
}) })
.catch((error) => { .catch((error) => {
// TODO: Display error to user toast.error("Error reading files" + error);
console.error("Error reading files:", error); console.error("Error reading files:", error);
}); });
}, },
@ -89,6 +89,38 @@ function ImageUpload({ setReferenceImages }: Props) {
}, },
}); });
const pasteEvent = useCallback(
(event: ClipboardEvent) => {
const clipboardData = event.clipboardData;
if (!clipboardData) return;
const items = clipboardData.items;
const files = [];
for (let i = 0; i < items.length; i++) {
const file = items[i].getAsFile();
if (file && file.type.startsWith("image/")) {
files.push(file);
}
}
// Convert images to data URLs and set the prompt images state
Promise.all(files.map((file) => fileToDataURL(file)))
.then((dataUrls) => {
setReferenceImages(dataUrls.map((dataUrl) => dataUrl as string));
})
.catch((error) => {
// TODO: Display error to user
console.error("Error reading files:", error);
});
},
[setReferenceImages]
);
// TODO: Make sure we don't listen to paste events in text input components
useEffect(() => {
window.addEventListener("paste", pasteEvent);
}, [pasteEvent]);
useEffect(() => { useEffect(() => {
return () => files.forEach((file) => URL.revokeObjectURL(file.preview)); return () => files.forEach((file) => URL.revokeObjectURL(file.preview));
}, [files]); // Added files as a dependency }, [files]); // Added files as a dependency
@ -108,7 +140,7 @@ function ImageUpload({ setReferenceImages }: Props) {
{/* eslint-disable-next-line @typescript-eslint/no-explicit-any */} {/* eslint-disable-next-line @typescript-eslint/no-explicit-any */}
<div {...getRootProps({ style: style as any })}> <div {...getRootProps({ style: style as any })}>
<input {...getInputProps()} /> <input {...getInputProps()} />
<p>Drop a screenshot here, or click to select</p> <p>Drop a screenshot here, paste from clipboard, or click to select</p>
</div> </div>
</section> </section>
); );