From de6cfa185ceaac65d73346f2f21ce6a543f0641f Mon Sep 17 00:00:00 2001 From: Tony Giorgio Date: Wed, 19 Jul 2023 12:11:47 -0500 Subject: [PATCH] Fix clipboard for android --- android/app/capacitor.build.gradle | 1 + android/app/src/main/AndroidManifest.xml | 2 ++ android/capacitor.settings.gradle | 3 +++ insertHead.js | 17 +++++++++++++++++ package.json | 3 ++- pnpm-lock.yaml | 11 +++++++++++ src/routes/Scanner.tsx | 14 +++++++++++++- src/routes/Send.tsx | 20 ++++++++++++++++---- src/routes/settings/Restore.tsx | 22 +++++++++++++++++----- src/utils/useCopy.ts | 10 +++++++++- 10 files changed, 91 insertions(+), 12 deletions(-) create mode 100644 insertHead.js diff --git a/android/app/capacitor.build.gradle b/android/app/capacitor.build.gradle index 2cdbfd9..0ddbfda 100644 --- a/android/app/capacitor.build.gradle +++ b/android/app/capacitor.build.gradle @@ -10,6 +10,7 @@ android { apply from: "../capacitor-cordova-android-plugins/cordova.variables.gradle" dependencies { implementation project(':capacitor-camera') + implementation project(':capacitor-clipboard') } diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index fc811d2..9efb354 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -43,4 +43,6 @@ + + diff --git a/android/capacitor.settings.gradle b/android/capacitor.settings.gradle index 6575ec5..2fa053e 100644 --- a/android/capacitor.settings.gradle +++ b/android/capacitor.settings.gradle @@ -4,3 +4,6 @@ project(':capacitor-android').projectDir = new File('../node_modules/.pnpm/@capa include ':capacitor-camera' project(':capacitor-camera').projectDir = new File('../node_modules/.pnpm/@capacitor+camera@5.0.6_@capacitor+core@5.2.1/node_modules/@capacitor/camera/android') + +include ':capacitor-clipboard' +project(':capacitor-clipboard').projectDir = new File('../node_modules/.pnpm/@capacitor+clipboard@5.0.6_@capacitor+core@5.2.1/node_modules/@capacitor/clipboard/android') diff --git a/insertHead.js b/insertHead.js new file mode 100644 index 0000000..5f33b61 --- /dev/null +++ b/insertHead.js @@ -0,0 +1,17 @@ +import { readFile, writeFile } from 'fs/promises'; +import { join } from 'path'; + +const insertHeadTag = async () => { + const filePath = join(process.cwd(), 'dist', 'public', 'index.html'); + try { + let data = await readFile(filePath, 'utf8'); + const lines = data.split('\n'); + lines.splice(2, 0, ''); + data = lines.join('\n'); + await writeFile(filePath, data); + } catch (err) { + console.error(`Error: ${err}`); + } +}; + +insertHeadTag(); diff --git a/package.json b/package.json index 432c7a9..abe7358 100644 --- a/package.json +++ b/package.json @@ -6,7 +6,7 @@ "scripts": { "dev": "solid-start dev", "host": "solid-start dev --host", - "build": "solid-start build", + "build": "solid-start build && node insertHead.js", "start": "solid-start start", "lint": "eslint src --ext .ts,.tsx,.js", "format": "npx prettier --write \"src/**/*.{ts,tsx,js,jsx,json,css,scss,md}\"" @@ -39,6 +39,7 @@ "dependencies": { "@capacitor/android": "^5.2.1", "@capacitor/camera": "^5.0.6", + "@capacitor/clipboard": "^5.0.6", "@capacitor/core": "^5.2.1", "@kobalte/core": "^0.9.8", "@kobalte/tailwindcss": "^0.5.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a79e324..f8d9778 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -7,6 +7,9 @@ dependencies: '@capacitor/camera': specifier: ^5.0.6 version: 5.0.6(@capacitor/core@5.2.1) + '@capacitor/clipboard': + specifier: ^5.0.6 + version: 5.0.6(@capacitor/core@5.2.1) '@capacitor/core': specifier: ^5.2.1 version: 5.2.1 @@ -1407,6 +1410,14 @@ packages: - supports-color dev: true + /@capacitor/clipboard@5.0.6(@capacitor/core@5.2.1): + resolution: {integrity: sha512-VsokRAn+0HVWj6riSRdspczEfqFoHbrhS/XRhGoEPsj0uvYPSufy0Kb2dpnSqkeeElhh2Jvn8jmVAzII2XeR9w==} + peerDependencies: + '@capacitor/core': ^5.0.0 + dependencies: + '@capacitor/core': 5.2.1 + dev: false + /@capacitor/core@5.2.1: resolution: {integrity: sha512-v7nzTQZj9l99Sp0v8C7Zq8QX6Cg5ljq7ASneWk/Hc5nBR5LOj/k3a+yEx/RoclWtkxJfs89Y5k+KJTFFQ6cLoA==} dependencies: diff --git a/src/routes/Scanner.tsx b/src/routes/Scanner.tsx index fe2b2dd..00c56ba 100644 --- a/src/routes/Scanner.tsx +++ b/src/routes/Scanner.tsx @@ -5,6 +5,8 @@ import { Button } from "~/components/layout"; import { showToast } from "~/components/Toaster"; import { useMegaStore } from "~/state/megaStore"; import { toParsedParams } from "~/logic/waila"; +import { Clipboard } from "@capacitor/clipboard"; +import { Capacitor } from "@capacitor/core"; export default function Scanner() { const [state, actions] = useMegaStore(); @@ -22,7 +24,17 @@ export default function Scanner() { async function handlePaste() { try { - const text = await navigator.clipboard.readText(); + let text; + + if (Capacitor.isNativePlatform()) { + const { value } = await Clipboard.read({ + type: "string" + }); + text = value; + } else { + text = await navigator.clipboard.readText(); + } + const trimText = text.trim(); setScanResult(trimText); } catch (e) { diff --git a/src/routes/Send.tsx b/src/routes/Send.tsx index 0f0eef1..aaeed9e 100644 --- a/src/routes/Send.tsx +++ b/src/routes/Send.tsx @@ -45,6 +45,8 @@ import { InfoBox } from "~/components/InfoBox"; import { useI18n } from "~/i18n/context"; import { ParsedParams, toParsedParams } from "~/logic/waila"; import { FeesModal } from "~/components/MoreInfoModal"; +import { Clipboard } from "@capacitor/clipboard"; +import { Capacitor } from "@capacitor/core"; export type SendSource = "lightning" | "onchain"; @@ -384,11 +386,21 @@ export default function Send() { } async function handlePaste() { - if (!navigator.clipboard.readText) - return showToast(new Error("Clipboard not supported")); - try { - const text = await navigator.clipboard.readText(); + let text; + + if (Capacitor.isNativePlatform()) { + const { value } = await Clipboard.read({ + type: "string" + }); + text = value; + } else { + if (!navigator.clipboard.readText) { + return showToast(new Error("Clipboard not supported")); + } + text = await navigator.clipboard.readText(); + } + const trimText = text.trim(); setFieldDestination(trimText); parsePaste(trimText); diff --git a/src/routes/settings/Restore.tsx b/src/routes/settings/Restore.tsx index a527245..0150576 100644 --- a/src/routes/settings/Restore.tsx +++ b/src/routes/settings/Restore.tsx @@ -27,6 +27,8 @@ import { ConfirmDialog } from "~/components/Dialog"; import { MutinyWallet } from "@mutinywallet/mutiny-wasm"; import { WORDS_EN } from "~/utils/words"; import { InfoBox } from "~/components/InfoBox"; +import { Clipboard } from "@capacitor/clipboard"; +import { Capacitor } from "@capacitor/core"; type SeedWordsForm = { words: string[]; @@ -91,17 +93,27 @@ function TwelveWordsEntry() { }); async function handlePaste() { - if (!navigator.clipboard.readText) - return showToast(new Error("Clipboard not supported")); - try { - const text = await navigator.clipboard.readText(); + let text; + + if (Capacitor.isNativePlatform()) { + const { value } = await Clipboard.read({ + type: "string" + }); + text = value; + } else { + if (!navigator.clipboard.readText) { + return showToast(new Error("Clipboard not supported")); + } + text = await navigator.clipboard.readText(); + } // split words on space or newline const words = text.split(/[\s\n]+/); - if (words.length !== 12) + if (words.length !== 12) { return showToast(new Error("Wrong number of words")); + } setValues(seedWordsForm, "words", words); validate(seedWordsForm); diff --git a/src/utils/useCopy.ts b/src/utils/useCopy.ts index cb5ec96..3d7751d 100644 --- a/src/utils/useCopy.ts +++ b/src/utils/useCopy.ts @@ -1,6 +1,8 @@ // Thanks you https://soorria.com/snippets/use-copy-solidjs import type { Accessor } from "solid-js"; import { createSignal } from "solid-js"; +import { Clipboard } from "@capacitor/clipboard"; +import { Capacitor } from "@capacitor/core"; export type UseCopyProps = { copiedTimeout?: number; }; @@ -12,7 +14,13 @@ export const useCopy = ({ copiedTimeout = 2000 }: UseCopyProps = {}): [ const [copied, setCopied] = createSignal(false); let timeout: number; const copy: CopyFn = async (text) => { - await navigator.clipboard.writeText(text); + if (Capacitor.isNativePlatform()) { + await Clipboard.write({ + string: text + }); + } else { + await navigator.clipboard.writeText(text); + } setCopied(true); if (timeout) clearTimeout(timeout); timeout = setTimeout(() => setCopied(false), copiedTimeout);