Skip to content

Commit f43948f

Browse files
Add onCopy prop for QuickEmbed (#1319)
* Add onCopy prop for QuickEmbed * Make onCopy prop optional * update onCopy prop description * use userEvent instead of fireEvent * update onCopy prop description --------- Co-authored-by: Joseph Axisa <josephaxisa@google.com>
1 parent df40441 commit f43948f

File tree

2 files changed

+53
-7
lines changed

2 files changed

+53
-7
lines changed

packages/embed-components/src/QuickEmbed/QuickEmbed.spec.tsx

Lines changed: 35 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,8 @@ describe('QuickEmbed', () => {
5050
...overrides,
5151
})
5252
const onClose = jest.fn()
53+
const onCopy = jest.fn()
54+
document.execCommand = jest.fn()
5355

5456
beforeEach(() => {
5557
jest.spyOn(window, 'location', 'get').mockReturnValue({
@@ -69,7 +71,7 @@ describe('QuickEmbed', () => {
6971
})
7072

7173
it('renders', () => {
72-
renderWithTheme(<QuickEmbed onClose={onClose} />)
74+
renderWithTheme(<QuickEmbed onClose={onClose} onCopy={onCopy} />)
7375

7476
expect(
7577
screen.getByRole('heading', { name: 'Get embed URL' })
@@ -103,7 +105,7 @@ describe('QuickEmbed', () => {
103105
href: 'https://example.com/looks/42',
104106
pathname: '/looks/42',
105107
} as Location)
106-
renderWithTheme(<QuickEmbed onClose={onClose} />)
108+
renderWithTheme(<QuickEmbed onClose={onClose} onCopy={onCopy} />)
107109

108110
expect(
109111
screen.getByRole('heading', { name: 'Get embed URL' })
@@ -124,7 +126,7 @@ describe('QuickEmbed', () => {
124126
;(useThemesStoreState as jest.Mock).mockReturnValue(
125127
getMockStoreState({ selectedTheme: customTheme1 })
126128
)
127-
renderWithTheme(<QuickEmbed onClose={onClose} />)
129+
renderWithTheme(<QuickEmbed onClose={onClose} onCopy={onCopy} />)
128130

129131
expect(
130132
screen.getByRole('heading', { name: 'Get embed URL' })
@@ -153,4 +155,34 @@ describe('QuickEmbed', () => {
153155
)
154156
})
155157
})
158+
159+
it('close button function triggers on click', async () => {
160+
renderWithTheme(<QuickEmbed onClose={onClose} onCopy={onCopy} />)
161+
const closeBtn = screen.getByRole('button', { name: 'Close' })
162+
163+
expect(closeBtn).toBeInTheDocument()
164+
await userEvent.click(closeBtn)
165+
166+
expect(onClose).toHaveBeenCalled()
167+
})
168+
169+
it('onCopy not called when not passed in', async () => {
170+
renderWithTheme(<QuickEmbed onClose={onClose} />)
171+
const copyBtn = screen.getByRole('button', { name: 'Copy Link' })
172+
173+
expect(copyBtn).toBeInTheDocument()
174+
await userEvent.click(copyBtn)
175+
176+
expect(onCopy).not.toHaveBeenCalled()
177+
})
178+
179+
it('copy button function triggers on click', async () => {
180+
renderWithTheme(<QuickEmbed onClose={onClose} onCopy={onCopy} />)
181+
const copyBtn = screen.getByRole('button', { name: 'Copy Link' })
182+
183+
expect(copyBtn).toBeInTheDocument()
184+
await userEvent.click(copyBtn)
185+
186+
expect(onCopy).toHaveBeenCalled()
187+
})
156188
})

packages/embed-components/src/QuickEmbed/QuickEmbed.tsx

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -43,16 +43,28 @@ import { EmbedUrl } from '@looker/embed-services'
4343
import { useThemesStoreState, SelectTheme, useThemeActions } from '../Theme'
4444

4545
interface QuickEmbedProps {
46+
/** A function triggered when close button is clicked. */
4647
onClose: () => void
48+
/**
49+
* An optional callback triggered when the copy button is clicked.
50+
* The copy to clipboard action is already handled
51+
*/
52+
onCopy?: () => void
4753
}
4854

49-
export const QuickEmbed = ({ onClose }: QuickEmbedProps) => {
55+
export const QuickEmbed = ({ onClose, onCopy }: QuickEmbedProps) => {
5056
const service = new EmbedUrl()
5157
const [toggleValue, setToggle] = useState(false)
5258
const [embedUrl, setEmbedUrl] = useState<string>(service.embedUrl(false))
5359
const { selectedTheme } = useThemesStoreState()
5460
const { selectThemeAction } = useThemeActions()
5561

62+
const handleCopy = () => {
63+
if (onCopy) {
64+
onCopy()
65+
}
66+
}
67+
5668
const handleToggle = () => {
5769
const newToggleValue = !toggleValue
5870
if (newToggleValue) {
@@ -108,9 +120,11 @@ export const QuickEmbed = ({ onClose }: QuickEmbedProps) => {
108120
</Space>
109121

110122
<Space mt="large" between>
111-
<CopyToClipboard content={embedUrl}>
112-
<ButtonOutline iconBefore={<Link />}>Copy Link</ButtonOutline>
113-
</CopyToClipboard>
123+
<Space onClick={handleCopy} width="fit-content">
124+
<CopyToClipboard content={embedUrl}>
125+
<ButtonOutline iconBefore={<Link />}>Copy Link</ButtonOutline>
126+
</CopyToClipboard>
127+
</Space>
114128
<Button onClick={onClose}>Close</Button>
115129
</Space>
116130
</Section>

0 commit comments

Comments
 (0)