From cd74b7960b989e3dd35a5675bf55bf0d8ee3278a Mon Sep 17 00:00:00 2001 From: meriadec Date: Tue, 6 Feb 2018 11:38:15 +0100 Subject: [PATCH] Refactor Radio a bit --- src/components/base/CheckBox/stories.js | 5 +- src/components/base/Radio/index.js | 80 ++++++------------------- src/components/base/Radio/stories.js | 5 +- 3 files changed, 25 insertions(+), 65 deletions(-) diff --git a/src/components/base/CheckBox/stories.js b/src/components/base/CheckBox/stories.js index 84e18e24..1bc61174 100644 --- a/src/components/base/CheckBox/stories.js +++ b/src/components/base/CheckBox/stories.js @@ -3,9 +3,12 @@ import React from 'react' import { storiesOf } from '@storybook/react' import { boolean } from '@storybook/addon-knobs' +import { action } from '@storybook/addon-actions' import CheckBox from 'components/base/CheckBox' const stories = storiesOf('CheckBox', module) -stories.add('basic', () => ) +stories.add('basic', () => ( + +)) diff --git a/src/components/base/Radio/index.js b/src/components/base/Radio/index.js index 04b18404..9c74a08d 100644 --- a/src/components/base/Radio/index.js +++ b/src/components/base/Radio/index.js @@ -1,33 +1,22 @@ // @flow -import React, { PureComponent } from 'react' +import React from 'react' +import noop from 'lodash/noop' import styled from 'styled-components' -import Box from 'components/base/Box' +import { Tabbable } from 'components/base/Box' -const Base = styled(Box).attrs({ - align: 'center', - justify: 'center', - relative: true, -})` - box-shadow: 0 0 0 ${p => (p.checked ? 4 : 1)}px - ${p => (p.checked ? p.theme.colors.cream : p.theme.colors.argile)}; +const Base = styled(Tabbable).attrs({ relative: true })` + outline: none; + box-shadow: 0 0 0 1px ${p => (p.isChecked ? p.theme.colors.cream : p.theme.colors.argile)}; border-radius: 50%; height: 19px; width: 19px; transition: all ease-in-out 0.1s; - input[type='radio'] { - bottom: 0; - cursor: pointer; - height: 100%; - left: 0; - opacity: 0; - position: absolute; - right: 0; - top: 0; - width: 100%; - z-index: 10; + &:focus { + box-shadow: 0 0 0 ${p => (p.isChecked ? 4 : 2)}px + ${p => (p.isChecked ? p.theme.colors.cream : p.theme.colors.argile)}; } &:before, @@ -45,7 +34,7 @@ const Base = styled(Box).attrs({ &:before { background-color: ${p => p.theme.colors.blue}; ${p => - p.checked && + p.isChecked && ` bottom: 0; left: 0; @@ -57,7 +46,7 @@ const Base = styled(Box).attrs({ &:after { background-color: ${p => p.theme.colors.white}; ${p => - p.checked && + p.isChecked && ` bottom: 7px; left: 7px; @@ -68,52 +57,17 @@ const Base = styled(Box).attrs({ ` type Props = { - checked: boolean, + isChecked: boolean, onChange?: Function, } -type State = { - checked: boolean, +function Radio(props: Props) { + const { isChecked, onChange } = props + return onChange(!isChecked)} /> } -class Radio extends PureComponent { - static defaultProps = { - checked: false, - } - - state = { - checked: this.props.checked, - } - - componentWillReceiveProps(nextProps: Props) { - this.setState({ - checked: nextProps.checked, - }) - } - - handleChange = (e: SyntheticInputEvent) => { - const { onChange } = this.props - const { checked } = e.target - - this.setState({ - checked, - }) - - if (onChange) { - onChange(checked) - } - } - - render() { - const { checked } = this.state - const { onChange, ...props } = this.props - - return ( - - - - ) - } +Radio.defaultProps = { + onChange: noop, } export default Radio diff --git a/src/components/base/Radio/stories.js b/src/components/base/Radio/stories.js index e21dff6e..940314a5 100644 --- a/src/components/base/Radio/stories.js +++ b/src/components/base/Radio/stories.js @@ -2,10 +2,13 @@ import React from 'react' import { storiesOf } from '@storybook/react' +import { action } from '@storybook/addon-actions' import { boolean } from '@storybook/addon-knobs' import Radio from 'components/base/Radio' const stories = storiesOf('Radio', module) -stories.add('basic', () => ) +stories.add('basic', () => ( + +))