Skip to content

Commit

Permalink
Feat: add copy to clipboard to node detail links (#8)
Browse files Browse the repository at this point in the history
* feat: add CopyToClipboardIcon component

* feat: add copy to clipboard in node detail links
  • Loading branch information
gmolki authored Jan 23, 2025
1 parent 2f196a9 commit 9088bfa
Show file tree
Hide file tree
Showing 8 changed files with 55 additions and 8 deletions.
13 changes: 13 additions & 0 deletions src/components/common/CopyToClipboardIcon/cmp.tsx
Original file line number Diff line number Diff line change
@@ -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 <StyledCopytoClipboardIcon name="copy" onClick={handleCopy} />
}
CopytoClipboardIcon.displayName = 'CopytoClipboardIcon'

export default memo(CopytoClipboardIcon)
1 change: 1 addition & 0 deletions src/components/common/CopyToClipboardIcon/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export { default } from './cmp'
16 changes: 16 additions & 0 deletions src/components/common/CopyToClipboardIcon/styles.ts
Original file line number Diff line number Diff line change
@@ -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};
}
`}
`
3 changes: 3 additions & 0 deletions src/components/common/CopyToClipboardIcon/types.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
export type CopyToClipboardIconProps = {
text?: string
}
2 changes: 1 addition & 1 deletion src/components/common/NodeDetailEditableField/cmp.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -121,7 +121,7 @@ export const NodeDetailEditableField = ({
)}
{isOwner && (
<div
tw="shrink-0 flex justify-end overflow-hidden"
tw="shrink-0 flex items-center justify-end overflow-hidden"
css={{
maxWidth: isEditing ? '0' : '1.75rem',
transition: 'max-width ease-in-out 0.25s 0s',
Expand Down
12 changes: 8 additions & 4 deletions src/components/common/NodeDetailLink/cmp.tsx
Original file line number Diff line number Diff line change
@@ -1,17 +1,20 @@
import { ReactNode, memo } from 'react'
import Link from 'next/link'
import { Icon } from '@aleph-front/core'
import CopyToClipboardIcon from '../CopyToClipboardIcon'

export type NodeDetailLinkProps = {
href?: string
children?: ReactNode
isOwner?: boolean
textToCopy?: string
}

export const NodeDetailLink = ({
href,
children,
isOwner,
textToCopy,
...rest
}: NodeDetailLinkProps) => {
const content = (
Expand All @@ -21,23 +24,24 @@ export const NodeDetailLink = ({
)

return (
<>
<div tw="flex items-center gap-2">
{href ? (
<Link
href={href}
target="_blank"
{...rest}
tw="flex items-center w-full"
tw="flex items-center gap-2 min-w-0 w-full"
>
{content}
{!isOwner && (
<Icon tw="ml-3 w-3.5 h-3.5" name="external-link-square-alt" />
<Icon tw="w-3.5 h-3.5" name="external-link-square-alt" />
)}
</Link>
) : (
<span tw="flex items-center w-full">{content}</span>
)}
</>
{textToCopy && <CopyToClipboardIcon text={textToCopy} />}
</div>
)
}
NodeDetailLink.displayName = 'NodeDetailLink'
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,7 @@ export const OverviewTabContent = ({
<NodeDetailLink
href={getETHExplorerURL({ address: node?.owner })}
isOwner={false}
textToCopy={node?.owner}
>
{node?.owner && ellipseAddress(node?.owner)}
</NodeDetailLink>
Expand All @@ -101,6 +102,7 @@ export const OverviewTabContent = ({
tokenAddress: rewardCtrl.field.value,
})}
isOwner={isOwner}
textToCopy={rewardCtrl.field.value}
>
{rewardCtrl.field.value &&
ellipseAddress(rewardCtrl.field.value)}
Expand All @@ -123,6 +125,7 @@ export const OverviewTabContent = ({
tokenAddress: streamRewardCtrl.field.value,
})}
isOwner={isOwner}
textToCopy={streamRewardCtrl.field.value}
>
{streamRewardCtrl.field.value &&
ellipseAddress(streamRewardCtrl.field.value)}
Expand All @@ -140,7 +143,11 @@ export const OverviewTabContent = ({
placeholder="address"
isOwner={isOwner}
>
<NodeDetailLink href={node?.address} isOwner={isOwner}>
<NodeDetailLink
href={node?.address}
isOwner={isOwner}
textToCopy={node?.address}
>
{node?.address}
</NodeDetailLink>
</NodeDetailEditableField>
Expand Down
7 changes: 5 additions & 2 deletions src/components/pages/earn/CoreChannelNodeDetailPage/cmp.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,6 @@ import { NodeManager } from '@/domain/node'
export const CoreChannelNodeDetailPage = () => {
const {
node,
// nodesOnSameASN,
baseLatency,
aggregateLatency,
fileDownloadLatency,
Expand All @@ -47,7 +46,6 @@ export const CoreChannelNodeDetailPage = () => {
lockedCtrl,
registrationUrlCtrl,
isDirty,
account,
isUnlinkableByUser,
handleUnlink,
handleRemove,
Expand Down Expand Up @@ -111,6 +109,7 @@ export const CoreChannelNodeDetailPage = () => {
<NodeDetailLink
href={getETHExplorerURL({ address: node?.owner })}
isOwner={false}
textToCopy={node?.owner}
>
{node?.owner && ellipseAddress(node?.owner)}
</NodeDetailLink>
Expand All @@ -131,6 +130,7 @@ export const CoreChannelNodeDetailPage = () => {
tokenAddress: rewardCtrl.field.value,
})}
isOwner={isOwner}
textToCopy={rewardCtrl.field.value}
>
{rewardCtrl.field.value &&
ellipseAddress(rewardCtrl.field.value)}
Expand All @@ -153,6 +153,7 @@ export const CoreChannelNodeDetailPage = () => {
multiaddress: multiaddressCtrl.field.value,
})}
isOwner={isOwner}
textToCopy={multiaddressCtrl.field.value}
>
{multiaddressCtrl.field.value &&
ellipseAddress(multiaddressCtrl.field.value)}
Expand All @@ -177,6 +178,7 @@ export const CoreChannelNodeDetailPage = () => {
address: managerCtrl.field.value,
})}
isOwner={isOwner}
textToCopy={managerCtrl.field.value}
>
{managerCtrl.field.value &&
ellipseAddress(managerCtrl.field.value)}
Expand All @@ -197,6 +199,7 @@ export const CoreChannelNodeDetailPage = () => {
<NodeDetailLink
href={registrationUrlCtrl.field.value}
isOwner={isOwner}
textToCopy={registrationUrlCtrl.field.value}
>
{registrationUrlCtrl.field.value}
</NodeDetailLink>
Expand Down

0 comments on commit 9088bfa

Please sign in to comment.