Skip to content
This repository has been archived by the owner on Nov 1, 2019. It is now read-only.

Commit

Permalink
refactor: Select, Dropdown, Tooltip (#207)
Browse files Browse the repository at this point in the history
* refactor: Refactored Dropdown, Tooltip and Select components

* fix: Fixed undefined interface usage in Code. Updated highlighter package

* fix: smoke tests
  • Loading branch information
alex-golubtsov committed Oct 3, 2019
1 parent 8f490a5 commit 87c5fa5
Show file tree
Hide file tree
Showing 19 changed files with 4,834 additions and 3,777 deletions.
37 changes: 19 additions & 18 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -92,7 +92,7 @@
"@dr-kobros/react-webfont-loader": "^8.0.0",
"@rooks/use-timeout": "^3.3.0",
"@types/color": "^3.0.0",
"@types/react-syntax-highlighter": "^10.1.0",
"@types/react-syntax-highlighter": "^11.0.0",
"@types/react-window": "^1.7.0",
"@types/styled-components": "^4.1.12",
"@types/styled-system": "^4.0.0",
Expand All @@ -102,7 +102,7 @@
"react-markdown": "^4.0.6",
"react-popper": "^1.3.4",
"react-spring": "^8.0.14",
"react-syntax-highlighter": "^10.2.0",
"react-syntax-highlighter": "^11.0.2",
"react-virtualized-auto-sizer": "^1.0.2",
"react-window": "^1.7.1",
"snyk": "^1.222.0",
Expand All @@ -111,27 +111,28 @@
},
"devDependencies": {
"@babel/core": "^7.3.4",
"@storybook/addon-actions": "^5.0.11",
"@storybook/addon-links": "^5.0.11",
"@storybook/addon-storysource": "^5.0.11",
"@storybook/addon-viewport": "^5.0.11",
"@storybook/addons": "^5.0.11",
"@storybook/cli": "^5.0.11",
"@storybook/react": "^5.0.11",
"@storybook/theming": "^5.0.11",
"@storybook/addon-actions": "^5.2.1",
"@storybook/addon-links": "^5.2.1",
"@storybook/addon-storysource": "^5.2.1",
"@storybook/addon-viewport": "^5.2.1",
"@storybook/addons": "^5.2.1",
"@storybook/cli": "^5.2.1",
"@storybook/react": "^5.2.1",
"@storybook/theming": "^5.2.1",
"@testing-library/jest-dom": "^4.1.0",
"@testing-library/react": "^8.0.1",
"@types/enzyme": "^3.10.3",
"@types/enzyme-adapter-react-16": "^1.0.5",
"@types/faker": "^4.1.5",
"@types/jest": "^24.0.11",
"@types/jest-specific-snapshot": "^0.5.3",
"@types/react": "^16.9.4",
"@types/react-dom": "^16.9.1",
"@types/react-virtualized-auto-sizer": "^1.0.0",
"@types/storybook__addon-actions": "^3.4.2",
"@types/storybook__react": "^4.0.1",
"@types/storybook__addon-actions": "^3.4.3",
"@types/storybook__react": "^4.0.2",
"@typescript-eslint/eslint-plugin": "^2.3.1",
"@typescript-eslint/parser": "^2.3.1",
"babel-loader": "^8.0.5",
"commitizen": "^3.0.7",
"cross-env": "^5.2.0",
"cz-conventional-changelog": "2.1.0",
Expand All @@ -152,13 +153,13 @@
"lint-staged": "^8.1.5",
"npm-run-all": "^4.1.5",
"prism-react-renderer": "latest",
"react": "^16.8.6",
"react": "^16.10.1",
"react-docgen-typescript-loader": "^3.0.1",
"react-dom": "^16.8.6",
"react-dom": "^16.10.1",
"react-hooks-testing-library": "^0.5.1",
"react-live": "^2.0.0",
"react-scripts": "2.1.8",
"react-test-renderer": "^16.8.4",
"react-test-renderer": "^16.9.0",
"require-context.macro": "^1.0.4",
"rimraf": "^2.6.2",
"standard-version": "^6.0.1",
Expand All @@ -167,8 +168,8 @@
"typescript": "^3.6.3"
},
"peerDependencies": {
"react": "^16.8.2",
"react-dom": "^16.8.2"
"react": "^16.10.1",
"react-dom": "^16.10.1"
},
"snyk": true
}
31 changes: 20 additions & 11 deletions src/Code/Code.tsx
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
import React, { ReactNode, useEffect, useState } from 'react'
import { SyntaxHighlighterProps } from 'react-syntax-highlighter'
// @ts-ignore
import SyntaxHighlighter from 'react-syntax-highlighter/dist/cjs/prism-light'
// @ts-ignore
import solarizedlight from 'react-syntax-highlighter/dist/cjs/styles/prism/solarizedlight'
import styled, { css } from 'styled-components'

import { SectionProps, fromTheme } from '../utils/styled'
import { preciseEm } from '../utils/styled/isolated'

Expand Down Expand Up @@ -55,20 +57,27 @@ const StyledSyntaxHighlighter = styled(SyntaxHighlighter)`
}
padding: ${props => props.PreTag === 'span'
? css`${fromTheme(theme => theme.global.baseSpacing / 4)}`
: css`${fromTheme(theme => theme.global.baseSpacing)}`}em !important;
? css`${fromTheme(theme => theme.global.baseSpacing / 4)}`
: css`${fromTheme(theme => theme.global.baseSpacing)}`}em !important;
}
`

export const Code = ({ children, block, showLineNumbers, language = 'text' }: CodeProps & SectionProps) => {
export function Code ({
children,
block,
showLineNumbers,
language = 'text'
}: CodeProps & SectionProps) {
const highlighterLanguage = useDynamicLanguage(language)

return <StyledSyntaxHighlighter
PreTag={block ? 'pre' : 'span'}
style={solarizedlight}
language={highlighterLanguage}
showLineNumbers={showLineNumbers}
>
{children}
</StyledSyntaxHighlighter>
return (
<StyledSyntaxHighlighter
PreTag={block ? 'pre' : 'span'}
style={solarizedlight}
language={highlighterLanguage}
showLineNumbers={showLineNumbers}
>
{children}
</StyledSyntaxHighlighter>
)
}
54 changes: 16 additions & 38 deletions src/Dropdown/Dropdown.stories.tsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import React, { Ref } from 'react'
import React from 'react'
import Faker from 'faker'
import { storiesOf } from '@storybook/react'
import { withState } from '../utils/tests/decorators/StateDecorator'
Expand All @@ -16,18 +16,9 @@ storiesOf('molecules|Dropdown', module)
<div>
<Dropdown
open={state.one}
renderTrigger={({ ref }: { ref: Ref<HTMLButtonElement> }) => (
<Button
ref={ref}
secondary
onClick={() => storeState({ one: !state.one })}
>
Click me
</Button>
)}>
<div style={{ width: 300 }}>
{Faker.lorem.paragraphs(2)}
</div>
trigger={<Button onClick={() => storeState({ one: !state.one })}>Click me</Button>}
>
<div style={{ width: 300 }}>{Faker.lorem.paragraphs(2)}</div>
</Dropdown>
</div>
</Flex>
Expand All @@ -38,43 +29,30 @@ storiesOf('molecules|Dropdown', module)
<Dropdown
open={state.one}
placement={DropdownPlacement.RIGHT}
renderTrigger={({ ref }: { ref: Ref<HTMLButtonElement> }) => (
<Button ref={ref} secondary onClick={() => storeState({ one: !state.one })}>position right</Button>
)}>
<Block width={200} p={1}>
{Faker.lorem.paragraphs(2)}
</Block>
trigger={<Button onClick={() => storeState({ one: !state.one })}>Right</Button>}
>
<Block width={200} p={1}>{Faker.lorem.paragraphs(2)}</Block>
</Dropdown>
<Dropdown
open={state.two}
placement={DropdownPlacement.LEFT}
renderTrigger={({ ref }: { ref: Ref<HTMLButtonElement> }) => (
<Button ref={ref} secondary onClick={() => storeState({ two: !state.two })}>position left</Button>
)}>
<Block width={200} p={1}>
{Faker.lorem.paragraphs(2)}
</Block>
trigger={<Button onClick={() => storeState({ two: !state.two })}>Left</Button>}
>
<Block width={200} p={1}>{Faker.lorem.paragraphs(2)}</Block>
</Dropdown>
<Dropdown
open={state.three}
placement={DropdownPlacement.TOP}
renderTrigger={({ ref }: { ref: Ref<HTMLButtonElement> }) => (
<Button ref={ref} secondary onClick={() => storeState({ three: !state.three })}>position top</Button>
)}>
<Block width={200} p={1}>
{Faker.lorem.paragraphs(2)}
</Block>
trigger={<Button onClick={() => storeState({ three: !state.three })}>Top</Button>}
>
<Block width={200} p={1}>{Faker.lorem.paragraphs(2)}</Block>
</Dropdown>
<Dropdown
open={state.four}
placement={DropdownPlacement.BOTTOM}
onOutsideClick={() => storeState({ ...state, four: false })}
renderTrigger={({ ref }: { ref: Ref<HTMLButtonElement> }) => (
<Button ref={ref} secondary onClick={() => storeState({ four: !state.four })}>position bottom</Button>
)}>
<Block width={200} p={1}>
{Faker.lorem.paragraphs(2)}
</Block>
trigger={<Button onClick={() => storeState({ four: !state.four })}>Bottom</Button>}
>
<Block width={200} p={1}>{Faker.lorem.paragraphs(2)}</Block>
</Dropdown>
</Row>
</Flex>
Expand Down
114 changes: 49 additions & 65 deletions src/Dropdown/Dropdown.test.tsx
Original file line number Diff line number Diff line change
@@ -1,71 +1,55 @@
import React, { Ref } from 'react'
import React from 'react'
import { mount } from 'enzyme'
import 'jest-styled-components'

import { Dropdown } from '.'

test('hides content, when open is false', () => {
const dropdown = mount((
<Dropdown
open={false}
test='dropdown'
renderTrigger={({ ref }: { ref: Ref<HTMLButtonElement> }) => <button ref={ref}>toggle</button>}
>
<div>test</div>
</Dropdown>
))

const dropdownContent = dropdown.find({ 'data-test': 'dropdown-content' })
expect(dropdownContent).toHaveLength(0)
dropdown.unmount()
})

test('displays content, when open is true', () => {
const dropdown = mount((
<Dropdown
open={true}
test='dropdown'
renderTrigger={({ ref }: { ref: Ref<HTMLButtonElement> }) => <button ref={ref}>toggle</button>}
>
<div>test</div>
</Dropdown>
))

const dropdownContent = dropdown.find({ 'data-test': 'dropdown-content' })
expect(dropdownContent.hostNodes()).toHaveLength(1)
dropdown.unmount()
})

test('uses min. width, when useTriggerWidth is false', () => {
const dropdown = mount((
<Dropdown
open={true}
useTriggerWidth={false}
test='dropdown'
renderTrigger={({ ref }: { ref: Ref<HTMLButtonElement> }) => <button ref={ref}>toggle</button>}
>
<div>test</div>
</Dropdown>
))

const dropdownContent = dropdown.find({ 'data-test': 'dropdown-content' })
expect(dropdownContent).toHaveStyleRule('min-width', '160px')
dropdown.unmount()
})

test('uses full available width, when useTriggerWidth is true', () => {
const dropdown = mount((
<Dropdown
open={true}
useTriggerWidth={true}
test='dropdown'
renderTrigger={({ ref }: { ref: Ref<HTMLButtonElement> }) => <button ref={ref}>toggle</button>}
>
<div>test</div>
</Dropdown>
))

const dropdownContent = dropdown.find({ 'data-test': 'dropdown-content' })
expect(dropdownContent).toHaveStyleRule('min-width', '100%')
dropdown.unmount()
describe('The Dropdown component', () => {
test('hides content, when open is false', () => {
const wrapper = mount((
<Dropdown open={false} trigger={<button>toggle</button>}>
<div>test</div>
</Dropdown>
))

const dropdownContent = wrapper.find(Dropdown.Content)
expect(dropdownContent).toHaveLength(0)
wrapper.unmount()
})

test('displays content, when open is true', () => {
const wrapper = mount((
<Dropdown open={true} trigger={<button>toggle</button>}>
<div>test</div>
</Dropdown>
))

const dropdownContent = wrapper.find(Dropdown.Content)
expect(dropdownContent).toHaveLength(1)
wrapper.unmount()
})

test('uses min. width, when useTriggerWidth is false', () => {
const wrapper = mount((
<Dropdown open={true} useTriggerWidth={false} trigger={<button>toggle</button>}>
<div>test</div>
</Dropdown>
))

const dropdownContent = wrapper.find(Dropdown.Content)
expect(dropdownContent).toHaveStyleRule('min-width', '160px')
wrapper.unmount()
})

test('uses full available width, when useTriggerWidth is true', () => {
const wrapper = mount((
<Dropdown open={true} useTriggerWidth={true} trigger={<button>toggle</button>}>
<div>test</div>
</Dropdown>
))

const dropdownContent = wrapper.find(Dropdown.Content)
expect(dropdownContent).toHaveStyleRule('min-width', '100%')
wrapper.unmount()
})
})

0 comments on commit 87c5fa5

Please sign in to comment.