From 0bda86b3193703012a86d7f41972e9a89a518997 Mon Sep 17 00:00:00 2001 From: citizenl Date: Tue, 10 May 2022 19:37:13 +0800 Subject: [PATCH] feat: saving images from the clipboard --- src/frontend/App.tsx | 4 ++- src/frontend/components/Paster.tsx | 46 ++++++++++++++++++++++++++++++ 2 files changed, 49 insertions(+), 1 deletion(-) create mode 100644 src/frontend/components/Paster.tsx diff --git a/src/frontend/App.tsx b/src/frontend/App.tsx index ef30e8810..ca668f60f 100644 --- a/src/frontend/App.tsx +++ b/src/frontend/App.tsx @@ -17,6 +17,7 @@ import { DropContextProvider } from './contexts/DropContext'; import Main from './containers/Main'; import About from './containers/About'; import { CustomThemeProvider } from './hooks/useCustomTheme'; +import { Paster } from './components/Paster'; const SPLASH_SCREEN_TIME = 1400; const PLATFORM = process.platform; @@ -37,7 +38,7 @@ const App = observer(() => { // Add listener for global keyboard shortcuts window.addEventListener('keydown', uiStore.processGlobalShortCuts); - + return () => window.removeEventListener('keydown', uiStore.processGlobalShortCuts); }, [uiStore.processGlobalShortCuts]); @@ -75,6 +76,7 @@ const App = observer(() => { + diff --git a/src/frontend/components/Paster.tsx b/src/frontend/components/Paster.tsx new file mode 100644 index 000000000..238593923 --- /dev/null +++ b/src/frontend/components/Paster.tsx @@ -0,0 +1,46 @@ +import React from "react"; +import { RendererMessenger } from "src/Messaging"; +import { useStore } from "../contexts/StoreContext"; +import { AppToaster } from "./Toaster"; + +const DEFAULT_FILE_NAME = 'image.png' +export const Paster = ({ onPaste }: { onPaste?: (data: any) => void; }) => { + const { uiStore } = useStore() + const pasteHandle = (e: ClipboardEvent) => { + let { items, files } = e.clipboardData!; + + let fileName = `allusion_${Date.now()}`; + let type = items[0].type; + if (!type.match(/image/)) return; + + let blob = items[0].getAsFile(); + if (!blob) return + const file = files[0]; + if (file && file.type.includes('image')) { + fileName = file.name == DEFAULT_FILE_NAME ? `allusion_${file.lastModified}.png` : file.name + } + + let reader = new FileReader(); + const directory = uiStore.importDirectory; + if (!directory) { + AppToaster.show({ + message: 'Please choose a location. Settings>BackgroundProcesses>Browse', + timeout: 5000, + }); + return + } + reader.addEventListener('loadend', async function (e) { + const imgBase64 = e.target!.result!.toString(); + if (!fileName.includes('.')) { + let ext = imgBase64.split(';')[0].split('/')[1]; + if (ext == 'jpeg') ext = 'jpg' + fileName = `${fileName}.${ext}` + } + const reply = await RendererMessenger.storeFile({ directory, filenameWithExt: fileName, imgBase64 }); + onPaste && onPaste({ directory, filenameWithExt: fileName, imgBase64, reply }); + }); + reader.readAsDataURL(blob); + }; + document.body.addEventListener('paste', pasteHandle); + return <>; +} \ No newline at end of file