Skip to content
Snippets Groups Projects
side-menu.js 2.69 KiB
Newer Older
import React from 'react'
import { Modal, StyleSheet, TouchableOpacity, View } from 'react-native'
import PropTypes from 'prop-types'

import AppIcon from '../common/app-icon'
import AppText from '../common/app-text'

import { connect } from 'react-redux'
import { navigate } from '../../slices/navigation'

import { Sizes, Typography } from '../../styles/redesign'
import settingsLabels from '../../i18n/en/settings'

const { menuItems } = settingsLabels

const settingsMenuItems = [
  {name: menuItems.settings, component: 'SettingsMenu'},
  {name: menuItems.about, component: 'About'},
  {name: menuItems.license, component: 'License'},
]

const SideMenu = ({ navigate, onPress, shouldShowMenu }) => {
  const navigateMenuItem = (page) => {
    onPress()
    navigate(page)
  }

  return(
    <React.Fragment>
      {!shouldShowMenu &&
        <TouchableOpacity onPress={onPress}>
          <AppIcon name={'dots-three-vertical'} isCTA/>
        </TouchableOpacity>
      }
      {shouldShowMenu &&
        <Modal
          animationType='fade'
          onRequestClose={onPress}
          transparent={true}
          visible={shouldShowMenu}
        >
          <View style={styles.blackBackground}></View>
          <View style={styles.menu}>
            <TouchableOpacity onPress={onPress} style={styles.iconContainer}>
              <AppIcon name={'cross'}/>
            </TouchableOpacity>
            {settingsMenuItems.map(item =>
              <MenuItem
                item={item}
                key={item.name}
                navigate={navigateMenuItem}
              />
            )}
          </View>
        </Modal>
      }
    </React.Fragment>
  )
}

SideMenu.propTypes = {
  navigate: PropTypes.func.isRequired,
  onPress: PropTypes.func,
  shouldShowMenu: PropTypes.bool.isRequired
}

const MenuItem = ({ item, navigate }) => {
  return(
    <View style={styles.menuItem}>
      <TouchableOpacity onPress={() => navigate(item.component)}>
        <AppText style={styles.text}>{item.name}</AppText>
      </TouchableOpacity>
    </View>
  )
}

MenuItem.propTypes = {
  item: PropTypes.object.isRequired,
  navigate: PropTypes.func.isRequired,
}

const styles = StyleSheet.create({
  blackBackground: {
    backgroundColor: 'black',
    flex: 1,
    opacity: 0.65,
  },
  iconContainer: {
    alignSelf: 'flex-end',
    marginBottom: Sizes.base
  },
  menu: {
    alignSelf: 'flex-end',
    backgroundColor: 'white',
    height: '100%',
    padding: Sizes.base,
    position: 'absolute',
    width: '60%'
  },
  text: {
    ...Typography.subtitle
  }
})

const mapDispatchToProps = (dispatch) => {
  return({
    navigate: (page) => dispatch(navigate(page)),
  })
}

export default connect(
  null,
  mapDispatchToProps,
)(SideMenu)