fix clipboard on http

This commit is contained in:
hzrd149 2023-12-10 07:16:12 -06:00
parent f7a913ca60
commit 7cbaa2edf6
7 changed files with 35 additions and 14 deletions

View File

@ -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 && (
<MenuItem
onClick={() => 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={<ShareIcon />}
>
Copy share link

View File

@ -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<IconButtonProps, "icon">) => {
const toast = useToast();
const [copied, setCopied] = useState(false);
return (
@ -14,7 +15,7 @@ export const CopyIconButton = ({ text, ...props }: { text?: string } & Omit<Icon
navigator.clipboard.writeText(text);
setCopied(true);
setTimeout(() => setCopied(false), 2000);
}
} else toast({ description: text, isClosable: true, duration: null });
}}
{...props}
/>

View File

@ -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<ButtonProps, "children">) {
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<ButtonProps, "children"
navigator.clipboard.writeText(version);
setCopied(true);
setTimeout(() => setCopied(false), 2000);
}
} else toast({ description: version, isClosable: true, duration: null });
}}
{...props}
>

View File

@ -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<string> {
}
const amberSignerService = {
supported: navigator.userAgent.includes("Android"),
supported: navigator.userAgent.includes("Android") && navigator.clipboard,
getPublicKey,
signEvent,
nip04Encrypt,

View File

@ -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<MenuIconButtonProps, "children"> & { event: NostrEvent; approvals: NostrEvent[] }) {
const toast = useToast();
const debugModal = useDisclosure();
return (
@ -22,7 +23,11 @@ export default function CommunityPostMenu({
<OpenInAppMenuItem event={event} />
<CopyShareLinkMenuItem event={event} />
<MenuItem
onClick={() => 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={<CopyToClipboardIcon />}
>
Copy Note ID

View File

@ -98,7 +98,7 @@ export function SearchPage() {
<Flex gap="2" wrap="wrap">
<Flex gap="2" grow={1}>
<IconButton onClick={qrScannerModal.onOpen} icon={<QrCodeIcon />} aria-label="Qr Scanner" />
{!!navigator.clipboard.readText && (
{!!navigator.clipboard?.readText && (
<IconButton onClick={readClipboard} icon={<CopyToClipboardIcon />} aria-label="Read clipboard" />
)}
<Input type="search" value={searchInput} onChange={(e) => setSearchInput(e.target.value)} />

View File

@ -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<MenuIconButtonProps, "children">) => {
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))}
</MenuItem>
<MenuItem
onClick={() => 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={<ShareIcon />}
>
Copy share link
</MenuItem>
<MenuItem
onClick={() => 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={<CopyToClipboardIcon />}
>
Copy Embed Code