Skip to content
Prev Previous commit
Next Next commit
Refactor clickable experience
  • Loading branch information
BrunoQuaresma committed Oct 17, 2022
commit c78e4194f7429e24b1bd71fdc032d5e5892daac6
39 changes: 39 additions & 0 deletions site/src/components/CopyableValue/CopyableValue.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
import { makeStyles } from "@material-ui/core/styles"
import Tooltip from "@material-ui/core/Tooltip"
import { useClickable } from "hooks/useClickable"
import { useClipboard } from "hooks/useClipboard"
import React, { HTMLProps } from "react"
import { combineClasses } from "util/combineClasses"

interface CopyableValueProps extends HTMLProps<HTMLDivElement> {
value: string
}

export const CopyableValue: React.FC<CopyableValueProps> = ({
value,
className,
...props
}) => {
const { isCopied, copy } = useClipboard(value)
const clickableProps = useClickable(copy)
const styles = useStyles()

return (
<Tooltip
title={isCopied ? "Copied!" : "Click to copy"}
placement="bottom-start"
>
<span
{...props}
{...clickableProps}
className={combineClasses([styles.value, className])}
/>
</Tooltip>
)
}

const useStyles = makeStyles(() => ({
value: {
cursor: "pointer",
},
}))
5 changes: 2 additions & 3 deletions site/src/components/Resources/AgentVersion.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ export const AgentVersion: FC<{
onMouseEnter={() => setIsOpen(true)}
className={styles.trigger}
>
{displayVersion}
Agent Outdated
</span>
<HelpPopover
id={id}
Expand All @@ -54,9 +54,8 @@ export const AgentVersion: FC<{
)
}

const useStyles = makeStyles((theme) => ({
const useStyles = makeStyles(() => ({
trigger: {
cursor: "pointer",
color: theme.palette.warning.light,
},
}))
6 changes: 4 additions & 2 deletions site/src/components/Resources/ResourceCard.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ import {
import IconButton from "@material-ui/core/IconButton"
import Tooltip from "@material-ui/core/Tooltip"
import { Maybe } from "components/Conditionals/Maybe"
import { CopyableValue } from "components/CopyableValue/CopyableValue"

const getAgentStatusColor = (theme: Theme, agent: WorkspaceAgent) => {
switch (agent.status) {
Expand Down Expand Up @@ -101,7 +102,9 @@ export const ResourceCard: FC<ResourceCardProps> = ({
{meta.sensitive ? (
<SensitiveValue value={meta.value} />
) : (
meta.value
<CopyableValue value={meta.value}>
{meta.value}
</CopyableValue>
)}
</div>
</div>
Expand Down Expand Up @@ -264,7 +267,6 @@ const useStyles = makeStyles((theme) => ({
textOverflow: "ellipsis",
overflow: "hidden",
whiteSpace: "nowrap",
userSelect: "all",
},

agentRow: {
Expand Down
5 changes: 4 additions & 1 deletion site/src/components/Resources/SensitiveValue.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import { makeStyles } from "@material-ui/core/styles"
import Tooltip from "@material-ui/core/Tooltip"
import VisibilityOffOutlined from "@material-ui/icons/VisibilityOffOutlined"
import VisibilityOutlined from "@material-ui/icons/VisibilityOutlined"
import { CopyableValue } from "components/CopyableValue/CopyableValue"
import { useState } from "react"

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

return (
<div className={styles.sensitiveValue}>
<div className={styles.value}>{displayValue}</div>
<CopyableValue value={value} className={styles.value}>
{displayValue}
</CopyableValue>
<Tooltip title={buttonLabel}>
<IconButton
className={styles.button}
Expand Down
21 changes: 21 additions & 0 deletions site/src/hooks/useClickable.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
import { KeyboardEvent } from "react"

interface UseClickableResult {
tabIndex: 0
role: "button"
onClick: () => void
onKeyDown: (event: KeyboardEvent) => void
}

export const useClickable = (onClick: () => void): UseClickableResult => {
return {
tabIndex: 0,
role: "button",
onClick,
onKeyDown: (event: KeyboardEvent) => {
if (event.key === "Enter") {
onClick()
}
},
}
}