From 6211945e3d64f6bb59c016159beb5b18ebdd97a2 Mon Sep 17 00:00:00 2001 From: John Costa Date: Mon, 21 Apr 2025 11:44:34 +0100 Subject: [PATCH] feat(images): share target working and receiving images! --- frontend/bun.lockb | Bin 164630 -> 165093 bytes frontend/package.json | 2 + frontend/src-tauri/Cargo.lock | 16 +++++ frontend/src-tauri/Cargo.toml | 2 + frontend/src-tauri/capabilities/default.json | 59 +++++++++++------- .../android/app/src/main/AndroidManifest.xml | 4 ++ frontend/src-tauri/src/lib.rs | 2 + frontend/src/App.tsx | 42 ++++++++++++- 8 files changed, 103 insertions(+), 24 deletions(-) diff --git a/frontend/bun.lockb b/frontend/bun.lockb index 1f190b770484bcb270fff558c3c969e1644fecba..0887dfade3ad21c01f9c44eda31dac8c49b05157 100755 GIT binary patch delta 31297 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 en3@c|UX|ggpvz746x2U7_jFi0u7xMZj diff --git a/frontend/package.json b/frontend/package.json index d83836f..9002825 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -20,6 +20,7 @@ "@tabler/icons-solidjs": "^3.30.0", "@tauri-apps/api": "^2", "@tauri-apps/plugin-dialog": "~2", + "@tauri-apps/plugin-fs": "~2", "@tauri-apps/plugin-http": "~2", "@tauri-apps/plugin-opener": "^2", "clsx": "^2.1.1", @@ -30,6 +31,7 @@ "solid-motionone": "^1.0.3", "solidjs-markdown": "^0.2.0", "tailwind-scrollbar-hide": "^2.0.0", + "tauri-plugin-sharetarget-api": "^0.1.6", "valibot": "^1.0.0-rc.2" }, "devDependencies": { diff --git a/frontend/src-tauri/Cargo.lock b/frontend/src-tauri/Cargo.lock index 17746d0..b303b4f 100644 --- a/frontend/src-tauri/Cargo.lock +++ b/frontend/src-tauri/Cargo.lock @@ -13,9 +13,11 @@ dependencies = [ "serde_json", "tauri", "tauri-build", + "tauri-plugin-fs", "tauri-plugin-global-shortcut", "tauri-plugin-http", "tauri-plugin-log", + "tauri-plugin-sharetarget", "tauri-plugin-store", "tokio", ] @@ -4057,6 +4059,20 @@ dependencies = [ "time", ] +[[package]] +name = "tauri-plugin-sharetarget" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "15a6e4638b6a5492a46847fc9e994df8cfd2dbc1bacc11f15c207d6a2163c341" +dependencies = [ + "serde", + "serde_json", + "tauri", + "tauri-build", + "tauri-plugin", + "thiserror 1.0.69", +] + [[package]] name = "tauri-plugin-store" version = "2.2.0" diff --git a/frontend/src-tauri/Cargo.toml b/frontend/src-tauri/Cargo.toml index 50f8ced..8d72705 100644 --- a/frontend/src-tauri/Cargo.toml +++ b/frontend/src-tauri/Cargo.toml @@ -27,6 +27,8 @@ tokio = { version = "1.36.0", features = ["full"] } tauri-plugin-store = "2.0.0-beta.12" tauri-plugin-http = "2.0.0-beta.12" tauri-plugin-log = "2" +tauri-plugin-sharetarget = "0.1.6" +tauri-plugin-fs = "2" [target."cfg(target_os = \"macos\")".dependencies] cocoa = "0.26" diff --git a/frontend/src-tauri/capabilities/default.json b/frontend/src-tauri/capabilities/default.json index fd96f69..d428b17 100644 --- a/frontend/src-tauri/capabilities/default.json +++ b/frontend/src-tauri/capabilities/default.json @@ -1,26 +1,39 @@ { - "$schema": "../gen/schemas/desktop-schema.json", - "identifier": "default", - "description": "Capability for the main window", - "windows": ["main"], - "permissions": [ - "core:default", - "core:window:allow-start-dragging", - "http:default", + "$schema": "../gen/schemas/desktop-schema.json", + "identifier": "default", + "description": "Capability for the main window", + "windows": [ + "main" + ], + "permissions": [ + "core:default", + "core:window:allow-start-dragging", + "http:default", + "sharetarget:default", + { + "identifier": "fs:scope", + "allow": [ { - "identifier": "http:default", - "allow": [ - { - "url": "https://haystack.johncosta.tech" - }, - { - "url": "http://localhost:3040" - }, - { - "url": "http://192.168.1.199:3040" - } - ] + "path": "$APPDATA/databases/*" + } + ] + }, + { + "identifier": "http:default", + "allow": [ + { + "url": "https://haystack.johncosta.tech" }, - "log:default" - ] -} + { + "url": "http://localhost:3040" + }, + { + "url": "http://192.168.1.199:3040" + } + ] + }, + "log:default", + "fs:default", + "fs:default" + ] +} \ No newline at end of file diff --git a/frontend/src-tauri/gen/android/app/src/main/AndroidManifest.xml b/frontend/src-tauri/gen/android/app/src/main/AndroidManifest.xml index a8d9fb6..faad303 100644 --- a/frontend/src-tauri/gen/android/app/src/main/AndroidManifest.xml +++ b/frontend/src-tauri/gen/android/app/src/main/AndroidManifest.xml @@ -1,6 +1,7 @@ + @@ -18,7 +19,10 @@ android:exported="true"> + + + diff --git a/frontend/src-tauri/src/lib.rs b/frontend/src-tauri/src/lib.rs index 756b9f3..8720ed1 100644 --- a/frontend/src-tauri/src/lib.rs +++ b/frontend/src-tauri/src/lib.rs @@ -11,9 +11,11 @@ pub fn run() { let watcher_state = new_shared_watcher_state(); tauri::Builder::default() + .plugin(tauri_plugin_fs::init()) .plugin(tauri_plugin_log::Builder::new().build()) .plugin(tauri_plugin_store::Builder::new().build()) .plugin(tauri_plugin_http::init()) + .plugin(tauri_plugin_sharetarget::init()) // .plugin(tauri_plugin_dialog::init()) // .plugin(tauri_plugin_opener::init()) // .manage(watcher_state) diff --git a/frontend/src/App.tsx b/frontend/src/App.tsx index c4fefac..0f796de 100644 --- a/frontend/src/App.tsx +++ b/frontend/src/App.tsx @@ -1,13 +1,22 @@ import { Route, Router } from "@solidjs/router"; import { listen } from "@tauri-apps/api/event"; -import { createEffect, onCleanup } from "solid-js"; +import { createEffect, createSignal, For, onCleanup, Show } from "solid-js"; import { Login } from "./Login"; import { ProtectedRoute } from "./ProtectedRoute"; import { Search } from "./Search"; import { Settings } from "./Settings"; import { ImageViewer } from "./components/ImageViewer"; +import type { PluginListener } from "@tauri-apps/api/core"; +import { + listenForShareEvents, + type ShareEvent, +} from "tauri-plugin-sharetarget-api"; +import { readFile } from "@tauri-apps/plugin-fs"; export const App = () => { + const [logs, setLogs] = createSignal([]); + const [file, setFile] = createSignal(); + createEffect(() => { // TODO: Don't use window.location.href const unlisten = listen("focus-search", () => { @@ -19,9 +28,40 @@ export const App = () => { }); }); + createEffect(() => { + let listener: PluginListener; + const setupListener = async () => { + listener = await listenForShareEvents( + async (intent: ShareEvent) => { + const contents = await readFile(intent.stream).catch( + (error: Error) => { + console.warn("fetching shared content failed:"); + throw error; + }, + ); + setFile( + new File([contents], intent.name ?? "no-name", { + type: intent.content_type, + }), + ); + setLogs((l) => [...l, intent.uri]); + }, + ); + }; + setupListener(); + return () => { + listener?.unregister(); + }; + }); + return ( <> +

Hello

+ + {(f) => my-image} + + {(log) =>

{log}

}