From dea35f261b92b5d21882d78e87aeadecf562a91f Mon Sep 17 00:00:00 2001 From: Huakun Shen Date: Fri, 10 Jan 2025 23:43:28 -0500 Subject: [PATCH] feat: write clipboard data to clipboard in clipboard history --- .../app/extension/clipboard/+page.svelte | 35 +++++++++++++++++-- 1 file changed, 33 insertions(+), 2 deletions(-) diff --git a/apps/desktop/src/routes/app/extension/clipboard/+page.svelte b/apps/desktop/src/routes/app/extension/clipboard/+page.svelte index 079ad92..d152ca2 100644 --- a/apps/desktop/src/routes/app/extension/clipboard/+page.svelte +++ b/apps/desktop/src/routes/app/extension/clipboard/+page.svelte @@ -2,7 +2,7 @@ import { goBack, goHome } from "@/utils/route" import { listenToNewClipboardItem } from "@/utils/tauri-events" import Icon from "@iconify/svelte" - import { db } from "@kksh/api/commands" + import { ClipboardContentType, db } from "@kksh/api/commands" import { SearchModeEnum, SQLSortOrderEnum, type ExtData } from "@kksh/api/models" import { Button, Command, Resizable } from "@kksh/svelte5" import { Constants } from "@kksh/ui" @@ -10,6 +10,8 @@ import type { UnlistenFn } from "@tauri-apps/api/event" import { ArrowLeft, FileQuestionIcon, ImageIcon, LetterTextIcon } from "lucide-svelte" import { onDestroy, onMount, type Snippet } from "svelte" + import { toast } from "svelte-sonner" + import clipboard from "tauri-plugin-clipboard-api" import ContentPreview from "./content-preview.svelte" let searchTerm = $state("") @@ -152,6 +154,35 @@ }, 500) } } + + function onItemSelected(dataId: number) { + // fetch data from db + db.getExtensionDataById(dataId) + .then((data) => { + if (!data || !data.data) { + return + } + const dataType = data?.dataType as ClipboardContentType + switch (dataType) { + case "Text": + return clipboard.writeText(data.data) + case "Image": + return clipboard.writeImageBase64(data.data) + case "Html": + return clipboard.writeHtml(data.data) + case "Rtf": + return clipboard.writeRtf(data.data) + default: + return Promise.reject(new Error("Unsupported data type: " + dataType)) + } + }) + .then(() => toast.success("Copied to clipboard")) + .catch((err) => { + toast.error("Failed to fetch data from db", { + description: err.message + }) + }) + } {#snippet leftSlot()} @@ -195,7 +226,7 @@ No results found. {#each clipboardHistoryIds as dataId (dataId)} - + onItemSelected(dataId)}> {@render typeIcon(clipboardHistoryMap[dataId].dataType)} {clipboardHistoryMap[dataId].searchText}