From 7cbaa2edf613c7acf751b378e957b600fdac3e12 Mon Sep 17 00:00:00 2001 From: hzrd149 Date: Sun, 10 Dec 2023 07:16:12 -0600 Subject: [PATCH] fix clipboard on http --- .../common-menu-items/copy-share-link.tsx | 9 +++++++-- src/components/copy-icon-button.tsx | 5 +++-- src/components/version-button.tsx | 5 +++-- src/services/amber-signer.ts | 4 ++-- .../community/components/community-post-menu.tsx | 9 +++++++-- src/views/search/index.tsx | 2 +- src/views/user/components/user-profile-menu.tsx | 15 ++++++++++++--- 7 files changed, 35 insertions(+), 14 deletions(-) diff --git a/src/components/common-menu-items/copy-share-link.tsx b/src/components/common-menu-items/copy-share-link.tsx index ef3b44c24..bc902761b 100644 --- a/src/components/common-menu-items/copy-share-link.tsx +++ b/src/components/common-menu-items/copy-share-link.tsx @@ -1,16 +1,21 @@ -import { MenuItem } from "@chakra-ui/react"; +import { MenuItem, useToast } from "@chakra-ui/react"; import { NostrEvent } from "../../types/nostr-event"; import { getSharableEventAddress } from "../../helpers/nip19"; import { ShareIcon } from "../icons"; export default function CopyShareLinkMenuItem({ event }: { event: NostrEvent }) { + const toast = useToast(); const address = getSharableEventAddress(event); return ( address && ( window.navigator.clipboard.writeText("https://njump.me/" + address)} + onClick={() => { + const text = "https://njump.me/" + address; + if (navigator.clipboard) navigator.clipboard.writeText(text); + else toast({ description: text, isClosable: true, duration: null }); + }} icon={} > Copy share link diff --git a/src/components/copy-icon-button.tsx b/src/components/copy-icon-button.tsx index 11113b385..ccbbb4524 100644 --- a/src/components/copy-icon-button.tsx +++ b/src/components/copy-icon-button.tsx @@ -1,9 +1,10 @@ import { useState } from "react"; -import { IconButton, IconButtonProps } from "@chakra-ui/react"; +import { IconButton, IconButtonProps, useToast } from "@chakra-ui/react"; import { CheckIcon, CopyToClipboardIcon } from "./icons"; export const CopyIconButton = ({ text, ...props }: { text?: string } & Omit) => { + const toast = useToast(); const [copied, setCopied] = useState(false); return ( @@ -14,7 +15,7 @@ export const CopyIconButton = ({ text, ...props }: { text?: string } & Omit setCopied(false), 2000); - } + } else toast({ description: text, isClosable: true, duration: null }); }} {...props} /> diff --git a/src/components/version-button.tsx b/src/components/version-button.tsx index ef119ae37..b38c06b4a 100644 --- a/src/components/version-button.tsx +++ b/src/components/version-button.tsx @@ -1,8 +1,9 @@ -import { Button, ButtonProps } from "@chakra-ui/react"; +import { Button, ButtonProps, useToast } from "@chakra-ui/react"; import { CheckIcon, CopyToClipboardIcon } from "./icons"; import { useState } from "react"; export default function VersionButton({ ...props }: Omit) { + const toast = useToast(); const [copied, setCopied] = useState(false); const version = [import.meta.env.VITE_APP_VERSION, import.meta.env.VITE_COMMIT_HASH].filter(Boolean).join("-"); @@ -18,7 +19,7 @@ export default function VersionButton({ ...props }: Omit setCopied(false), 2000); - } + } else toast({ description: version, isClosable: true, duration: null }); }} {...props} > diff --git a/src/services/amber-signer.ts b/src/services/amber-signer.ts index d92de22cc..8b4e85c4f 100644 --- a/src/services/amber-signer.ts +++ b/src/services/amber-signer.ts @@ -34,7 +34,7 @@ function rejectPending() { function onVisibilityChange() { if (document.visibilityState === "visible") { - if (!pendingRequest) return; + if (!pendingRequest || !navigator.clipboard) return; // read the result from the clipboard setTimeout(() => { @@ -92,7 +92,7 @@ async function nip04Decrypt(pubkey: string, data: string): Promise { } const amberSignerService = { - supported: navigator.userAgent.includes("Android"), + supported: navigator.userAgent.includes("Android") && navigator.clipboard, getPublicKey, signEvent, nip04Encrypt, diff --git a/src/views/community/components/community-post-menu.tsx b/src/views/community/components/community-post-menu.tsx index f16f5e1b9..abb1e61c3 100644 --- a/src/views/community/components/community-post-menu.tsx +++ b/src/views/community/components/community-post-menu.tsx @@ -1,4 +1,4 @@ -import { MenuItem, useDisclosure } from "@chakra-ui/react"; +import { MenuItem, useDisclosure, useToast } from "@chakra-ui/react"; import { nip19 } from "nostr-tools"; import { CustomMenuIconButton, MenuIconButtonProps } from "../../../components/menu-icon-button"; @@ -14,6 +14,7 @@ export default function CommunityPostMenu({ approvals, ...props }: Omit & { event: NostrEvent; approvals: NostrEvent[] }) { + const toast = useToast(); const debugModal = useDisclosure(); return ( @@ -22,7 +23,11 @@ export default function CommunityPostMenu({ window.navigator.clipboard.writeText(nip19.noteEncode(event.id))} + onClick={() => { + const text = nip19.noteEncode(event.id); + if (navigator.clipboard) navigator.clipboard.writeText(text); + else toast({ description: text, isClosable: true, duration: null }); + }} icon={} > Copy Note ID diff --git a/src/views/search/index.tsx b/src/views/search/index.tsx index 1a7182c36..c12dd1e0b 100644 --- a/src/views/search/index.tsx +++ b/src/views/search/index.tsx @@ -98,7 +98,7 @@ export function SearchPage() { } aria-label="Qr Scanner" /> - {!!navigator.clipboard.readText && ( + {!!navigator.clipboard?.readText && ( } aria-label="Read clipboard" /> )} setSearchInput(e.target.value)} /> diff --git a/src/views/user/components/user-profile-menu.tsx b/src/views/user/components/user-profile-menu.tsx index 539d6eef3..1b3756ae6 100644 --- a/src/views/user/components/user-profile-menu.tsx +++ b/src/views/user/components/user-profile-menu.tsx @@ -1,4 +1,4 @@ -import { MenuItem, useDisclosure } from "@chakra-ui/react"; +import { MenuItem, useDisclosure, useToast } from "@chakra-ui/react"; import { Link as RouterLink } from "react-router-dom"; import { nip19 } from "nostr-tools"; @@ -31,6 +31,7 @@ export const UserProfileMenu = ({ showRelaySelectionModal, ...props }: { pubkey: string; showRelaySelectionModal?: () => void } & Omit) => { + const toast = useToast(); const account = useCurrentAccount(); const metadata = useUserMetadata(pubkey); const userRelays = useUserRelays(pubkey); @@ -69,13 +70,21 @@ export const UserProfileMenu = ({ Login as {truncatedId(getUserDisplayName(metadata, pubkey))} window.navigator.clipboard.writeText("https://njump.me/" + sharableId)} + onClick={() => { + const text = "https://njump.me/" + sharableId; + if (navigator.clipboard) navigator.clipboard?.writeText(text); + else toast({ description: text, isClosable: true, duration: null }); + }} icon={} > Copy share link window.navigator.clipboard.writeText("nostr:" + sharableId)} + onClick={() => { + const text = "nostr:" + sharableId; + if (navigator.clipboard) navigator.clipboard?.writeText(text); + else toast({ description: text, isClosable: true, duration: null }); + }} icon={} > Copy Embed Code