import React from 'react' import PropTypes from 'prop-types' import { connect } from 'react-redux' import ImmutablePropTypes from 'react-immutable-proptypes' import ImmutablePureComponent from 'react-immutable-pure-component' import { injectIntl, defineMessages } from 'react-intl' import { joinGroup, leaveGroup, } from '../actions/groups' import { openModal } from '../actions/modal' import { me } from '../initial_state' import { CX, MODAL_GROUP_PASSWORD, } from '../constants' import Button from './button' import Text from './text' class GroupActionButton extends ImmutablePureComponent { handleToggleMembership = () => { const { group, relationships } = this.props if (!group || !relationships) return false const groupId = group.get('id') const hasPassword = group.get('has_password') const isMember = relationships.get('member') const isRequested = relationships.get('requested') if (isMember || isRequested) { this.props.onLeaveGroup(groupId) } else { if (hasPassword) { this.props.onOpenGroupPasswordModal(group) } else { this.props.onJoinGroup(groupId) } } } render() { const { group, intl, relationships, size, } = this.props if (!group || !relationships) return null let buttonText = '' let buttonOptions = {} const isPrivate = group.get('is_private') const isMember = relationships.get('member') const isRequested = relationships.get('requested') if (isRequested) { buttonText = intl.formatMessage(messages.requested) buttonOptions = { color: 'primary', backgroundColor: 'tertiary', } } else if (isMember) { buttonText = intl.formatMessage(messages.member) buttonOptions = { color: 'white', backgroundColor: 'brand', } } else { if (isPrivate && !isRequested) { buttonText = intl.formatMessage(messages.request) } else { buttonText = intl.formatMessage(messages.join) } buttonOptions = { color: 'brand', backgroundColor: 'none', isOutline: true, } } const isSmall = size === 'small' const textClassName = isSmall ? null : _s.px10 const textSize = isSmall ? 'small' : 'medium' const textWeight = isSmall ? 'normal' : 'bold' const btnClasses = CX({ px10: isSmall, minW76PX: isSmall, jcCenter: 1, aiCenter: 1, }) return ( ) } } const messages = defineMessages({ join: { id: 'groups.join', defaultMessage: 'Join group' }, request: { id: 'groups.request_join', defaultMessage: 'Request to Join' }, requested: { id: 'groups.requested', defaultMessage: 'Requested' }, member: { id: 'groups.member', defaultMessage: 'Member' }, }) const mapDispatchToProps = (dispatch) => ({ onJoinGroup(groupId) { dispatch(joinGroup(groupId)) }, onLeaveGroup(groupId) { dispatch(leaveGroup(groupId)) }, onOpenGroupPasswordModal(group) { dispatch(openModal(MODAL_GROUP_PASSWORD, { group, })) }, }) GroupActionButton.propTypes = { group: ImmutablePropTypes.map, relationships: ImmutablePropTypes.map, intl: PropTypes.object.isRequired, size: PropTypes.oneOf([ 'small', 'normal', ]), onJoin: PropTypes.func.isRequired, onLeave: PropTypes.func.isRequired, onOpenGroupPasswordModal: PropTypes.func.isRequired, } GroupActionButton.defaultProps = { size: 'normal', } export default injectIntl(connect(null, mapDispatchToProps)(GroupActionButton))