bastienrobert/la-ferme

View on GitHub
packages/components/src/elements/Button/Button.native.tsx

Summary

Maintainability
A
0 mins
Test Coverage
import React, { FC } from 'react'
import { GestureResponderEvent } from 'react-native'
import styled from 'styled-components/native'

import Background from './Background.native'
import {
  ButtonSharedProps,
  variants,
  defaultSize,
  defaultVariant
} from './Button.shared'
import styles from './Button.styles'

export interface ButtonProps extends ButtonSharedProps {
  /** Callback on press */
  onPress: (e?: GestureResponderEvent) => void
}

const Button: FC<ButtonProps> = ({
  children,
  variant,
  onPress,
  disabled,
  ...style
}) => {
  const Container = disabled ? DisabledButtonContainer : ButtonContainer

  return (
    <Container onPress={disabled ? undefined : onPress} {...style}>
      <Background color={variants[variant]} />
      <ButtonText {...style}>{children}</ButtonText>
    </Container>
  )
}

const ButtonContainer = styled.TouchableOpacity`
  ${styles.box()}
`

/**
 * TODO
 *
 * DisabledButtonContainer should extends ButtonContainer
 * but take View in `as` attrs
 *
 * https://spectrum.chat/styled-components/general/cant-use-as-property-on-react-native~3fd4b59c-3a45-49ee-8f49-8f0f70c59d82
 */
const DisabledButtonContainer = styled.View<any>`
  ${styles.box()}
  ${styles.commons.disabled}
`

const ButtonText = styled.Text<any>`
  ${styles.native.text}
  ${props => styles.text(props.size)}
`

Button.defaultProps = {
  size: defaultSize,
  variant: defaultVariant
}

export { Button }