import isString from 'lodash/isString'; import omit from 'lodash/omit'; import pick from 'lodash/pick'; import React, { Component } from 'react'; import PropTypes from 'prop-types'; import { StyleSheet, Text, TouchableHighlight, View } from './react-native'; const styles = StyleSheet.create({ container: { flexDirection: 'row', justifyContent: 'flex-start', alignItems: 'center', padding: 8, }, touchable: { overflow: 'hidden', }, icon: { marginRight: 10, }, text: { fontWeight: '600', backgroundColor: 'transparent', }, }); const IOS7_BLUE = '#007AFF'; export default function createIconButtonComponent(Icon) { return class IconButton extends Component { static propTypes = { backgroundColor: PropTypes.string, borderRadius: PropTypes.number, color: PropTypes.string, size: PropTypes.number, iconStyle: PropTypes.any, // eslint-disable-line react/forbid-prop-types style: PropTypes.any, // eslint-disable-line react/forbid-prop-types children: PropTypes.node, }; static defaultProps = { backgroundColor: IOS7_BLUE, borderRadius: 5, color: 'white', size: 20, }; render() { const { style, iconStyle, children, ...restProps } = this.props; const iconProps = pick( restProps, Object.keys(Text.propTypes), 'style', 'name', 'size', 'color' ); const touchableProps = pick( restProps, Object.keys(TouchableHighlight.propTypes) ); const props = omit( restProps, Object.keys(iconProps), Object.keys(touchableProps), 'iconStyle', 'borderRadius', 'backgroundColor' ); iconProps.style = iconStyle ? [styles.icon, iconStyle] : styles.icon; const colorStyle = pick(this.props, 'color'); const blockStyle = pick(this.props, 'backgroundColor', 'borderRadius'); return ( {isString(children) ? ( {children} ) : ( children )} ); } }; }