From 9088bfaf7058ab00a413e239c379718ca36fa915 Mon Sep 17 00:00:00 2001 From: Gerard Molina <47140788+gmolki@users.noreply.github.com> Date: Thu, 23 Jan 2025 14:27:00 +0100 Subject: [PATCH] Feat: add copy to clipboard to node detail links (#8) * feat: add CopyToClipboardIcon component * feat: add copy to clipboard in node detail links --- .../common/CopyToClipboardIcon/cmp.tsx | 13 +++++++++++++ .../common/CopyToClipboardIcon/index.ts | 1 + .../common/CopyToClipboardIcon/styles.ts | 16 ++++++++++++++++ .../common/CopyToClipboardIcon/types.ts | 3 +++ .../common/NodeDetailEditableField/cmp.tsx | 2 +- src/components/common/NodeDetailLink/cmp.tsx | 12 ++++++++---- .../tabs/OverviewTabContent.tsx | 9 ++++++++- .../pages/earn/CoreChannelNodeDetailPage/cmp.tsx | 7 +++++-- 8 files changed, 55 insertions(+), 8 deletions(-) create mode 100644 src/components/common/CopyToClipboardIcon/cmp.tsx create mode 100644 src/components/common/CopyToClipboardIcon/index.ts create mode 100644 src/components/common/CopyToClipboardIcon/styles.ts create mode 100644 src/components/common/CopyToClipboardIcon/types.ts diff --git a/src/components/common/CopyToClipboardIcon/cmp.tsx b/src/components/common/CopyToClipboardIcon/cmp.tsx new file mode 100644 index 0000000..4c19059 --- /dev/null +++ b/src/components/common/CopyToClipboardIcon/cmp.tsx @@ -0,0 +1,13 @@ +import { memo } from 'react' +import { useCopyToClipboardAndNotify } from '@aleph-front/core' +import { StyledCopytoClipboardIcon } from './styles' +import { CopyToClipboardIconProps } from './types' + +export const CopytoClipboardIcon = ({ text }: CopyToClipboardIconProps) => { + const handleCopy = useCopyToClipboardAndNotify(text || '') + + return +} +CopytoClipboardIcon.displayName = 'CopytoClipboardIcon' + +export default memo(CopytoClipboardIcon) diff --git a/src/components/common/CopyToClipboardIcon/index.ts b/src/components/common/CopyToClipboardIcon/index.ts new file mode 100644 index 0000000..7a9f83f --- /dev/null +++ b/src/components/common/CopyToClipboardIcon/index.ts @@ -0,0 +1 @@ +export { default } from './cmp' diff --git a/src/components/common/CopyToClipboardIcon/styles.ts b/src/components/common/CopyToClipboardIcon/styles.ts new file mode 100644 index 0000000..4c0756d --- /dev/null +++ b/src/components/common/CopyToClipboardIcon/styles.ts @@ -0,0 +1,16 @@ +import { Icon } from '@aleph-front/core' +import styled, { css } from 'styled-components' +import tw from 'twin.macro' + +export const StyledCopytoClipboardIcon = styled(Icon)` + ${({ theme }) => css` + ${tw`cursor-pointer`} + transition-property: color; + transition-duration: ${theme.transition.duration.fast}ms; + transition-timing-function: ${theme.transition.timing}; + + &:hover { + color: ${theme.color.main0}; + } + `} +` diff --git a/src/components/common/CopyToClipboardIcon/types.ts b/src/components/common/CopyToClipboardIcon/types.ts new file mode 100644 index 0000000..eebe297 --- /dev/null +++ b/src/components/common/CopyToClipboardIcon/types.ts @@ -0,0 +1,3 @@ +export type CopyToClipboardIconProps = { + text?: string +} diff --git a/src/components/common/NodeDetailEditableField/cmp.tsx b/src/components/common/NodeDetailEditableField/cmp.tsx index 446e343..6ed4b64 100644 --- a/src/components/common/NodeDetailEditableField/cmp.tsx +++ b/src/components/common/NodeDetailEditableField/cmp.tsx @@ -121,7 +121,7 @@ export const NodeDetailEditableField = ({ )} {isOwner && (
{ const content = ( @@ -21,23 +24,24 @@ export const NodeDetailLink = ({ ) return ( - <> +
{href ? ( {content} {!isOwner && ( - + )} ) : ( {content} )} - + {textToCopy && } +
) } NodeDetailLink.displayName = 'NodeDetailLink' diff --git a/src/components/pages/earn/ComputeResourceNodeDetailPage/tabs/OverviewTabContent.tsx b/src/components/pages/earn/ComputeResourceNodeDetailPage/tabs/OverviewTabContent.tsx index fe2a7d4..fd40192 100644 --- a/src/components/pages/earn/ComputeResourceNodeDetailPage/tabs/OverviewTabContent.tsx +++ b/src/components/pages/earn/ComputeResourceNodeDetailPage/tabs/OverviewTabContent.tsx @@ -81,6 +81,7 @@ export const OverviewTabContent = ({ {node?.owner && ellipseAddress(node?.owner)} @@ -101,6 +102,7 @@ export const OverviewTabContent = ({ tokenAddress: rewardCtrl.field.value, })} isOwner={isOwner} + textToCopy={rewardCtrl.field.value} > {rewardCtrl.field.value && ellipseAddress(rewardCtrl.field.value)} @@ -123,6 +125,7 @@ export const OverviewTabContent = ({ tokenAddress: streamRewardCtrl.field.value, })} isOwner={isOwner} + textToCopy={streamRewardCtrl.field.value} > {streamRewardCtrl.field.value && ellipseAddress(streamRewardCtrl.field.value)} @@ -140,7 +143,11 @@ export const OverviewTabContent = ({ placeholder="address" isOwner={isOwner} > - + {node?.address} diff --git a/src/components/pages/earn/CoreChannelNodeDetailPage/cmp.tsx b/src/components/pages/earn/CoreChannelNodeDetailPage/cmp.tsx index 730d18c..89972ca 100644 --- a/src/components/pages/earn/CoreChannelNodeDetailPage/cmp.tsx +++ b/src/components/pages/earn/CoreChannelNodeDetailPage/cmp.tsx @@ -27,7 +27,6 @@ import { NodeManager } from '@/domain/node' export const CoreChannelNodeDetailPage = () => { const { node, - // nodesOnSameASN, baseLatency, aggregateLatency, fileDownloadLatency, @@ -47,7 +46,6 @@ export const CoreChannelNodeDetailPage = () => { lockedCtrl, registrationUrlCtrl, isDirty, - account, isUnlinkableByUser, handleUnlink, handleRemove, @@ -111,6 +109,7 @@ export const CoreChannelNodeDetailPage = () => { {node?.owner && ellipseAddress(node?.owner)} @@ -131,6 +130,7 @@ export const CoreChannelNodeDetailPage = () => { tokenAddress: rewardCtrl.field.value, })} isOwner={isOwner} + textToCopy={rewardCtrl.field.value} > {rewardCtrl.field.value && ellipseAddress(rewardCtrl.field.value)} @@ -153,6 +153,7 @@ export const CoreChannelNodeDetailPage = () => { multiaddress: multiaddressCtrl.field.value, })} isOwner={isOwner} + textToCopy={multiaddressCtrl.field.value} > {multiaddressCtrl.field.value && ellipseAddress(multiaddressCtrl.field.value)} @@ -177,6 +178,7 @@ export const CoreChannelNodeDetailPage = () => { address: managerCtrl.field.value, })} isOwner={isOwner} + textToCopy={managerCtrl.field.value} > {managerCtrl.field.value && ellipseAddress(managerCtrl.field.value)} @@ -197,6 +199,7 @@ export const CoreChannelNodeDetailPage = () => { {registrationUrlCtrl.field.value}