ali322/CNodeRN

View on GitHub
app/component/alert.js

Summary

Maintainability
B
4 hrs
Test Coverage
import React, { Component } from 'react'
import {
  Modal,
  View,
  Text,
  TouchableOpacity,
  StyleSheet,
  Dimensions,
  Platform,
  Alert as NativeAlert
} from 'react-native'

class Alert extends Component {
  constructor(props) {
    super(props)
    this.state = {
      active: false,
      text: '',
      message: '',
      buttons: []
    }
  }
  alert(title = '', message = '', buttons) {
    if (Platform.OS === 'ios') {
      NativeAlert.alert(title, message, buttons)
    } else {
      this.setState({
        active: true,
        title,
        message,
        buttons
      })
    }
  }
  _renderButtons() {
    const { buttons } = this.state
    return (
      <View
        style={
          buttons.length <= 2
            ? styles.alertHorizontalButtons
            : styles.alertVerticalButtons
        }
      >
        {buttons.map((btn, i) => {
          let handlePress = () => {
            this.setState({ active: false })
            btn.onPress()
          }
          if (btn.style === 'cancel') {
            handlePress = () => this.setState({ active: false })
          }
          return (
            <TouchableOpacity
              onPress={handlePress}
              key={i}
              style={[
                styles.alertButton,
                buttons.length === 2 && i === 0
                  ? {
                      borderRightWidth: 0.5
                    }
                  : null,
                buttons.length > 2 && i < buttons.length - 1
                  ? {
                      borderBottomWidth: 0.5
                    }
                  : null
              ]}
            >
              <Text style={styles.alertButtonText}>{btn.text}</Text>
            </TouchableOpacity>
          )
        })}
      </View>
    )
  }
  render() {
    const { active, title, message } = this.state
    if (!active) {
      return null
    }
    return (
      <Modal
        animationType="none"
        visible={this.state.modalActive}
        transparent={true}
        onRequestClose={() => this.setState({ active: false })}
      >
        <View style={styles.alertContainer}>
          <View style={styles.alertWrap}>
            <View style={styles.alertTitle}>
              <Text style={styles.alertTitleText}>{title}</Text>
            </View>
            {message ? (
              <View style={styles.alertMessage}>
                <Text style={styles.alertMessageText}>{message}</Text>
              </View>
            ) : null}
            {this._renderButtons()}
          </View>
        </View>
      </Modal>
    )
  }
}

const stylesForAll = {
  alertContainer: {
    backgroundColor: 'rgba(0,0,0,0.5)',
    flex: 1,
    justifyContent: 'center',
    padding: Dimensions.get('window').width * 0.2
  },
  alertWrap: {
    backgroundColor: '#FFF',
    borderRadius: 5,
    paddingTop: 8
  },
  alertTitle: {
    paddingVertical: 8,
    flexDirection: 'row',
    justifyContent: 'center'
  },
  alertTitleText: {
    fontSize: 16
  },
  alertMessage: {
    paddingTop: 6,
    paddingBottom: 10,
    flexDirection: 'row',
    justifyContent: 'center'
  },
  alertMessageText: {
    fontSize: 13,
    color: '#666'
  },
  alertHorizontalButtons: {
    borderTopWidth: 0.5,
    borderColor: '#DDD',
    flexDirection: 'row',
    justifyContent: 'center',
    alignItems: 'center'
  },
  alertVerticalButtons: {
    borderTopWidth: 0.5,
    borderColor: '#DDD',
    flexDirection: 'column',
    justifyContent: 'center'
    // alignItems:"center"
  },
  alertButton: {
    flex: 1,
    flexDirection: 'row',
    justifyContent: 'center',
    alignItems: 'center',
    borderColor: '#DDD',
    paddingVertical: 10
  },
  alertButtonText: {
    fontSize: 16,
    color: '#3366FF'
  }
}

const styles = StyleSheet.create(Object.assign({}, stylesForAll))

export default Alert