gab-social/app/javascript/gabsocial/components/popover/group_options_popover.js

166 lines
4.6 KiB
JavaScript
Raw Normal View History

import React from 'react'
import PropTypes from 'prop-types'
import { connect } from 'react-redux'
2020-05-01 06:50:27 +01:00
import ImmutablePureComponent from 'react-immutable-pure-component'
import ImmutablePropTypes from 'react-immutable-proptypes'
import { defineMessages, injectIntl } from 'react-intl'
import { isStaff } from '../../initial_state'
import {
addShortcut,
removeShortcut,
} from '../../actions/shortcuts'
import {
openPopover,
closePopover,
} from '../../actions/popover'
import { POPOVER_SHARE } from '../../constants'
2020-04-28 06:33:58 +01:00
import PopoverLayout from './popover_layout'
2020-05-01 06:50:27 +01:00
import List from '../list'
class GroupOptionsPopover extends ImmutablePureComponent {
handleOnClosePopover = () => {
this.props.onClosePopover()
}
handleOnToggleShortcut = () => {
this.handleOnClosePopover()
if (this.props.isShortcut) {
this.props.onRemoveShortcut(this.props.group.get('id'))
} else {
this.props.onAddShortcut(this.props.group.get('id'))
}
}
handleOnShare = () => {
this.props.onShare(this.props.group)
}
2020-04-28 06:33:58 +01:00
render() {
const {
group,
intl,
isAdmin,
isShortcut,
isXS,
} = this.props
2020-05-01 06:50:27 +01:00
if (!group) return <div/>
const groupId = group.get('id')
const listItems = []
if (isAdmin) {
listItems.push({
2020-05-01 06:50:27 +01:00
hideArrow: true,
2020-05-07 06:55:24 +01:00
icon: 'group',
title: intl.formatMessage(messages.groupMembers),
onClick: this.handleOnClosePopover,
to: `/groups/${groupId}/members`,
isHidden: !isAdmin,
})
listItems.push({
2020-05-07 06:55:24 +01:00
hideArrow: true,
icon: 'block',
title: intl.formatMessage(messages.removedMembers),
onClick: this.handleOnClosePopover,
to: `/groups/${groupId}/removed-accounts`,
isHidden: !isAdmin,
})
listItems.push({
2020-05-01 06:50:27 +01:00
hideArrow: true,
icon: 'pencil',
2020-05-07 06:55:24 +01:00
title: intl.formatMessage(messages.editGroup),
onClick: this.handleOnClosePopover,
to: `/groups/${groupId}/edit`,
isHidden: !isAdmin,
})
listItems.push({})
}
listItems.push({
hideArrow: true,
icon: 'share',
title: 'Share group',
onClick: this.handleOnShare,
})
listItems.push({})
listItems.push({
hideArrow: true,
icon: 'star',
title: intl.formatMessage(isShortcut ? messages.remove_from_shortcuts : messages.add_to_shortcuts),
onClick: this.handleOnToggleShortcut,
})
2020-05-01 06:50:27 +01:00
if (isStaff) {
listItems.push({})
listItems.push({
title: intl.formatMessage(messages.open_in_admin, { name: group.getIn('title') }),
href: `/admin/groups/${groupId}`
})
}
2020-04-28 06:33:58 +01:00
return (
<PopoverLayout
width={240}
isXS={isXS}
onClose={this.handleOnClosePopover}
>
2020-05-01 06:50:27 +01:00
<List
2020-05-07 06:55:24 +01:00
scrollKey='group_options'
2020-05-01 06:50:27 +01:00
items={listItems}
size={isXS ? 'large' : 'small'}
2020-05-01 06:50:27 +01:00
/>
2020-04-28 06:33:58 +01:00
</PopoverLayout>
)
}
2020-05-01 06:50:27 +01:00
}
const messages = defineMessages({
groupMembers: { id: 'group_members', defaultMessage: 'Group members' },
removedMembers: { id: 'group_removed_members', defaultMessage: 'Removed accounts' },
editGroup: { id: 'edit_group', defaultMessage: 'Edit group' },
add_to_shortcuts: { id: 'account.add_to_shortcuts', defaultMessage: 'Add to shortcuts' },
remove_from_shortcuts: { id: 'account.remove_from_shortcuts', defaultMessage: 'Remove from shortcuts' },
open_in_admin: { id: 'status.admin_account', defaultMessage: 'Open moderation interface for @{name}' },
})
const mapStateToProps = (state, { group }) => {
const groupId = group ? group.get('id') : null
const shortcuts = state.getIn(['shortcuts', 'items'])
const isShortcut = !!shortcuts.find((s) => {
return s.get('shortcut_id') == groupId && s.get('shortcut_type') === 'group'
})
return { isShortcut }
}
const mapDispatchToProps = (dispatch, { innerRef }) => ({
onClosePopover: () => dispatch(closePopover()),
onAddShortcut(groupId) {
dispatch(addShortcut('group', groupId))
},
onRemoveShortcut(groupId) {
dispatch(removeShortcut(null, 'group', groupId))
},
onShare(group) {
dispatch(openPopover(POPOVER_SHARE, {
innerRef,
group,
position: 'top',
}))
},
})
GroupOptionsPopover.defaultProps = {
group: ImmutablePropTypes.map.isRequired,
isAdmin: PropTypes.bool,
intl: PropTypes.object.isRequired,
isXS: PropTypes.bool,
isShortcut: PropTypes.bool,
onAddShortcut: PropTypes.func.isRequired,
onRemoveShortcut: PropTypes.func.isRequired,
onClosePopover: PropTypes.func.isRequired,
}
export default injectIntl(connect(mapStateToProps, mapDispatchToProps)(GroupOptionsPopover))