Skip to content

Commit 5b8dc2f

Browse files
authored
Make reusable WebviewWrapper component (#1775)
* Make plots wrapper element have 100% width and height * Make WebviewWrapper component that provides theme variables * Allow setting className on WebviewWrapper
1 parent d99f464 commit 5b8dc2f

File tree

10 files changed

+57
-64
lines changed

10 files changed

+57
-64
lines changed

webview/src/experiments/components/Experiments.tsx

Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ import styles from './table/styles.module.scss'
2323
import { AddColumns, Welcome } from './GetStarted'
2424
import buildDynamicColumns from '../util/buildDynamicColumns'
2525
import { sendMessage } from '../../shared/vscode'
26-
import { useThemeVariables } from '../../shared/components/theme/Theme'
26+
import { WebviewWrapper } from '../../shared/components/webviewWrapper/WebviewWrapper'
2727
import { GetStarted } from '../../shared/components/getStarted/GetStarted'
2828
import { DragDropProvider } from '../../shared/components/dragDrop/DragDropContext'
2929
import { EmptyState } from '../../shared/components/emptyState/EmptyState'
@@ -224,21 +224,14 @@ export const ExperimentsTable: React.FC<{
224224
const Experiments: React.FC<{
225225
tableData?: TableData | null
226226
}> = ({ tableData }) => {
227-
const variables = useThemeVariables()
228227
return (
229-
<div
230-
className={styles.experiments}
231-
style={variables}
232-
onContextMenu={e => {
233-
e.preventDefault()
234-
}}
235-
>
228+
<WebviewWrapper className={styles.experiments}>
236229
{tableData ? (
237230
<ExperimentsTable tableData={tableData} />
238231
) : (
239232
<EmptyState>Loading Experiments...</EmptyState>
240233
)}
241-
</div>
234+
</WebviewWrapper>
242235
)
243236
}
244237

webview/src/plots/components/Plots.tsx

Lines changed: 6 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import { ComparisonTableWrapper } from './comparisonTable/ComparisonTableWrapper
1212
import { PlotsWebviewState } from '../hooks/useAppReducer'
1313
import { EmptyState } from '../../shared/components/emptyState/EmptyState'
1414
import { Modal } from '../../shared/components/modal/Modal'
15-
import { useThemeVariables } from '../../shared/components/theme/Theme'
15+
import { WebviewWrapper } from '../../shared/components/webviewWrapper/WebviewWrapper'
1616
import { DragDropProvider } from '../../shared/components/dragDrop/DragDropContext'
1717
import { sendMessage } from '../../shared/vscode'
1818
import { getThemeValue, ThemeProperty } from '../../util/styles'
@@ -170,18 +170,8 @@ const PlotsContent = ({ state }: PlotsProps) => {
170170
)
171171
}
172172

173-
export const Plots = ({ state }: PlotsProps) => {
174-
const variables = useThemeVariables()
175-
176-
return (
177-
<div
178-
className={styles.plots}
179-
style={variables}
180-
onContextMenu={e => {
181-
e.preventDefault()
182-
}}
183-
>
184-
<PlotsContent state={state} />
185-
</div>
186-
)
187-
}
173+
export const Plots = ({ state }: PlotsProps) => (
174+
<WebviewWrapper>
175+
<PlotsContent state={state} />
176+
</WebviewWrapper>
177+
)

webview/src/shared/components/theme/Theme.test.tsx renamed to webview/src/shared/components/webviewWrapper/WebviewWrapper.test.tsx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,17 +3,17 @@
33
*/
44
import React from 'react'
55
import { render, cleanup, screen } from '@testing-library/react'
6-
import { Theme } from './Theme'
6+
import { WebviewWrapper } from './WebviewWrapper'
77

8-
describe('Theme', () => {
8+
describe('Wrapper', () => {
99
afterEach(() => {
1010
cleanup()
1111
})
1212

1313
it('should add some css variables to the markup', () => {
14-
render(<Theme />)
14+
render(<WebviewWrapper>Test</WebviewWrapper>)
1515

16-
const theme = screen.getByTestId('theme-wrapper')
16+
const theme = screen.getByText('Test')
1717
const expectedVariables = [
1818
'--editor-background-transparency-1',
1919
'--editor-background-transparency-2',
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
import React, { ReactNode } from 'react'
2+
import cx from 'classnames'
3+
import { useThemeVariables } from './useThemeVariables'
4+
import styles from './styles.module.scss'
5+
6+
export const WebviewWrapper = ({
7+
children,
8+
className
9+
}: {
10+
children: ReactNode
11+
className?: string
12+
}) => {
13+
const themeVariables = useThemeVariables()
14+
15+
return (
16+
<div
17+
className={cx(styles.webviewWrapper, className)}
18+
style={themeVariables}
19+
onContextMenu={e => {
20+
e.preventDefault()
21+
}}
22+
>
23+
{children}
24+
</div>
25+
)
26+
}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
.webviewWrapper {
2+
width: 100%;
3+
height: 100%;
4+
}

webview/src/shared/components/theme/Theme.tsx renamed to webview/src/shared/components/webviewWrapper/useThemeVariables.ts

Lines changed: 2 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,8 @@
1-
import React, {
2-
DetailedHTMLProps,
3-
HTMLAttributes,
4-
useState,
5-
useLayoutEffect,
6-
useCallback
7-
} from 'react'
1+
import { useState, useLayoutEffect, useCallback } from 'react'
82
import { alphaToHex, getThemeValue, ThemeProperty } from '../../../util/styles'
93

10-
type CSSVariables = DetailedHTMLProps<
11-
HTMLAttributes<HTMLDivElement>,
12-
HTMLDivElement
13-
>
14-
154
export const useThemeVariables = () => {
16-
const [variables, setVariables] = useState<CSSVariables>({})
5+
const [variables, setVariables] = useState<Record<string, string>>({})
176

187
const createCSSVariables = useCallback(() => {
198
const ColorsWithOpacity = {
@@ -57,12 +46,3 @@ export const useThemeVariables = () => {
5746

5847
return variables
5948
}
60-
61-
export const Theme: React.FC = ({ children }) => {
62-
const variables = useThemeVariables()
63-
return (
64-
<div style={variables} data-testid="theme-wrapper">
65-
{children}
66-
</div>
67-
)
68-
}

webview/src/stories/ComparisonTable.stories.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import {
77
ComparisonTable,
88
ComparisonTableProps
99
} from '../plots/components/comparisonTable/ComparisonTable'
10-
import { Theme } from '../shared/components/theme/Theme'
10+
import { WebviewWrapper } from '../shared/components/webviewWrapper/WebviewWrapper'
1111
import { DragDropProvider } from '../shared/components/dragDrop/DragDropContext'
1212

1313
export default {
@@ -18,11 +18,11 @@ export default {
1818

1919
const Template: Story<ComparisonTableProps> = ({ plots, revisions }) => {
2020
return (
21-
<Theme>
21+
<WebviewWrapper>
2222
<DragDropProvider>
2323
<ComparisonTable plots={plots} revisions={revisions} />
2424
</DragDropProvider>
25-
</Theme>
25+
</WebviewWrapper>
2626
)
2727
}
2828

webview/src/stories/ComparisonTableHeader.stories.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { Meta, Story } from '@storybook/react/types-6-0'
22
import React from 'react'
33
import { ComparisonTableHeader } from '../plots/components/comparisonTable/ComparisonTableHeader'
4-
import { Theme } from '../shared/components/theme/Theme'
4+
import { WebviewWrapper } from '../shared/components/webviewWrapper/WebviewWrapper'
55

66
const basicArgs = {
77
displayColor: '#945DD6',
@@ -24,15 +24,15 @@ const Template: Story<{
2424
index: number
2525
isPinned: boolean
2626
}> = ({ name, displayColor, onClicked, isPinned }) => (
27-
<Theme>
27+
<WebviewWrapper>
2828
<ComparisonTableHeader
2929
displayColor={displayColor}
3030
onClicked={onClicked}
3131
isPinned={isPinned}
3232
>
3333
{name}
3434
</ComparisonTableHeader>
35-
</Theme>
35+
</WebviewWrapper>
3636
)
3737

3838
export const Basic = Template.bind({})

webview/src/stories/ContextMenu.stories.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import React from 'react'
33
import '../shared/style.scss'
44
import './test-vscode-styles.scss'
55
import { MessageFromWebviewType } from 'dvc/src/webview/contract'
6-
import { Theme } from '../shared/components/theme/Theme'
6+
import { WebviewWrapper } from '../shared/components/webviewWrapper/WebviewWrapper'
77
import {
88
ContextMenu,
99
ContextMenuProps
@@ -19,7 +19,7 @@ export default {
1919

2020
const Template: Story<ContextMenuProps> = () => {
2121
return (
22-
<Theme>
22+
<WebviewWrapper>
2323
<ContextMenu
2424
content={
2525
<MessagesMenu
@@ -40,7 +40,7 @@ const Template: Story<ContextMenuProps> = () => {
4040
<Icon width={15} icon={AllIcons.LINES} />
4141
</div>
4242
</ContextMenu>
43-
</Theme>
43+
</WebviewWrapper>
4444
)
4545
}
4646

webview/src/stories/IconMenu.stories.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import { SelectMenu } from '../shared/components/selectMenu/SelectMenu'
77
import { IconMenu } from '../shared/components/iconMenu/IconMenu'
88
import { IconMenuItemProps } from '../shared/components/iconMenu/IconMenuItem'
99
import { AllIcons } from '../shared/components/Icon'
10-
import { Theme } from '../shared/components/theme/Theme'
10+
import { WebviewWrapper } from '../shared/components/webviewWrapper/WebviewWrapper'
1111

1212
const items: IconMenuItemProps[] = [
1313
{
@@ -90,9 +90,9 @@ export default {
9090
const Template: Story<{
9191
items: IconMenuItemProps[]
9292
}> = ({ items }) => (
93-
<Theme>
93+
<WebviewWrapper>
9494
<IconMenu items={items} />
95-
</Theme>
95+
</WebviewWrapper>
9696
)
9797

9898
export const MenuWithIcons = Template.bind({})

0 commit comments

Comments
 (0)