Skip to content

Commit c78e419

Browse files
committed
Refactor clickable experience
1 parent 4496ec2 commit c78e419

File tree

5 files changed

+70
-6
lines changed

5 files changed

+70
-6
lines changed
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
import { makeStyles } from "@material-ui/core/styles"
2+
import Tooltip from "@material-ui/core/Tooltip"
3+
import { useClickable } from "hooks/useClickable"
4+
import { useClipboard } from "hooks/useClipboard"
5+
import React, { HTMLProps } from "react"
6+
import { combineClasses } from "util/combineClasses"
7+
8+
interface CopyableValueProps extends HTMLProps<HTMLDivElement> {
9+
value: string
10+
}
11+
12+
export const CopyableValue: React.FC<CopyableValueProps> = ({
13+
value,
14+
className,
15+
...props
16+
}) => {
17+
const { isCopied, copy } = useClipboard(value)
18+
const clickableProps = useClickable(copy)
19+
const styles = useStyles()
20+
21+
return (
22+
<Tooltip
23+
title={isCopied ? "Copied!" : "Click to copy"}
24+
placement="bottom-start"
25+
>
26+
<span
27+
{...props}
28+
{...clickableProps}
29+
className={combineClasses([styles.value, className])}
30+
/>
31+
</Tooltip>
32+
)
33+
}
34+
35+
const useStyles = makeStyles(() => ({
36+
value: {
37+
cursor: "pointer",
38+
},
39+
}))

site/src/components/Resources/AgentVersion.tsx

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ export const AgentVersion: FC<{
3434
onMouseEnter={() => setIsOpen(true)}
3535
className={styles.trigger}
3636
>
37-
{displayVersion}
37+
Agent Outdated
3838
</span>
3939
<HelpPopover
4040
id={id}
@@ -54,9 +54,8 @@ export const AgentVersion: FC<{
5454
)
5555
}
5656

57-
const useStyles = makeStyles((theme) => ({
57+
const useStyles = makeStyles(() => ({
5858
trigger: {
5959
cursor: "pointer",
60-
color: theme.palette.warning.light,
6160
},
6261
}))

site/src/components/Resources/ResourceCard.tsx

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import {
2323
import IconButton from "@material-ui/core/IconButton"
2424
import Tooltip from "@material-ui/core/Tooltip"
2525
import { Maybe } from "components/Conditionals/Maybe"
26+
import { CopyableValue } from "components/CopyableValue/CopyableValue"
2627

2728
const getAgentStatusColor = (theme: Theme, agent: WorkspaceAgent) => {
2829
switch (agent.status) {
@@ -101,7 +102,9 @@ export const ResourceCard: FC<ResourceCardProps> = ({
101102
{meta.sensitive ? (
102103
<SensitiveValue value={meta.value} />
103104
) : (
104-
meta.value
105+
<CopyableValue value={meta.value}>
106+
{meta.value}
107+
</CopyableValue>
105108
)}
106109
</div>
107110
</div>
@@ -264,7 +267,6 @@ const useStyles = makeStyles((theme) => ({
264267
textOverflow: "ellipsis",
265268
overflow: "hidden",
266269
whiteSpace: "nowrap",
267-
userSelect: "all",
268270
},
269271

270272
agentRow: {

site/src/components/Resources/SensitiveValue.tsx

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import { makeStyles } from "@material-ui/core/styles"
33
import Tooltip from "@material-ui/core/Tooltip"
44
import VisibilityOffOutlined from "@material-ui/icons/VisibilityOffOutlined"
55
import VisibilityOutlined from "@material-ui/icons/VisibilityOutlined"
6+
import { CopyableValue } from "components/CopyableValue/CopyableValue"
67
import { useState } from "react"
78

89
const Language = {
@@ -23,7 +24,9 @@ export const SensitiveValue: React.FC<{ value: string }> = ({ value }) => {
2324

2425
return (
2526
<div className={styles.sensitiveValue}>
26-
<div className={styles.value}>{displayValue}</div>
27+
<CopyableValue value={value} className={styles.value}>
28+
{displayValue}
29+
</CopyableValue>
2730
<Tooltip title={buttonLabel}>
2831
<IconButton
2932
className={styles.button}

site/src/hooks/useClickable.ts

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
import { KeyboardEvent } from "react"
2+
3+
interface UseClickableResult {
4+
tabIndex: 0
5+
role: "button"
6+
onClick: () => void
7+
onKeyDown: (event: KeyboardEvent) => void
8+
}
9+
10+
export const useClickable = (onClick: () => void): UseClickableResult => {
11+
return {
12+
tabIndex: 0,
13+
role: "button",
14+
onClick,
15+
onKeyDown: (event: KeyboardEvent) => {
16+
if (event.key === "Enter") {
17+
onClick()
18+
}
19+
},
20+
}
21+
}

0 commit comments

Comments
 (0)