import React, {Component} from 'react'; import t from 'coral-framework/services/i18n'; import {can} from 'coral-framework/services/perms'; import {PopupMenu, Button} from 'coral-ui'; import ClickOutside from 'coral-framework/components/ClickOutside'; import cn from 'classnames'; import styles from './styles.css'; import {getErrorMessages} from 'coral-framework/utils'; const name = 'talk-plugin-flags'; export default class FlagButton extends Component { state = { showMenu: false, itemType: '', reason: '', message: '', step: 0, posted: false, localPost: null } componentDidUpdate () { if (this.popup) { // this will be defined when the reporting popup is opened this.popup.firstChild.style.top = `${this.flagButton.offsetTop - this.popup.firstChild.clientHeight - 15}px`; } } // When the "report" button is clicked expand the menu onReportClick = () => { const {currentUser} = this.props; if (!currentUser) { this.props.showSignInDialog(); return; } if (can(currentUser, 'INTERACT_WITH_COMMUNITY')) { if (this.state.showMenu) { this.closeMenu(); } else { this.setState({showMenu: true}); } } else { this.props.notify('error', t('error.NOT_AUTHORIZED')); } } closeMenu = () => { this.setState({ showMenu: false, itemType: '', reason: '', message: '', step: 0 }); } onPopupContinue = () => { const {postFlag, postDontAgree, id, author_id} = this.props; const {itemType, reason, step, posted, message} = this.state; // Proceed to the next step or close the menu if we've reached the end if (step + 1 >= this.props.getPopupMenu.length) { this.closeMenu(); } else { this.setState({step: step + 1}); } // If itemType and reason are both set, post the action if (itemType && reason && !posted) { this.setState({posted: true}); let item_id; switch(itemType) { case 'COMMENTS': item_id = id; break; case 'USERS': item_id = author_id; break; } if (itemType === 'COMMENTS') { this.setState({localPost: 'temp'}); } let action = { item_id, item_type: itemType, reason: null, message }; if (reason === 'COMMENT_NOAGREE') { postDontAgree(action) .then(({data}) => { if (itemType === 'COMMENTS') { this.setState({localPost: data.createDontAgree.dontagree.id}); } }) .catch((err) => { this.props.notify('error', getErrorMessages(err)); console.error(err); }); } else { postFlag({...action, reason}) .then(({data}) => { if (itemType === 'COMMENTS') { this.setState({localPost: data.createFlag.flag.id}); } }) .catch((err) => { this.props.notify('error', getErrorMessages(err)); console.error(err); }); } } } onPopupOptionClick = (sets) => (e) => { // If flagging a user, indicate that this is referencing the username rather than the bio if(sets === 'itemType' && e.target.value === 'users') { this.setState({field: 'username'}); } // Set itemType and field if they are defined in the popupMenu const currentMenu = this.props.getPopupMenu[this.state.step](); if (currentMenu.itemType) { this.setState({itemType: currentMenu.itemType}); } if (currentMenu.field) { this.setState({field: currentMenu.field}); } this.setState({[sets]: e.target.value}); } onNoteTextChange = (e) => { this.setState({message: e.target.value}); } handleClickOutside = () => { if (this.state.showMenu) { this.closeMenu(); } } render () { const {getPopupMenu, flaggedByCurrentUser} = this.props; const {localPost} = this.state; const flagged = flaggedByCurrentUser || localPost; const popupMenu = getPopupMenu[this.state.step](this.state.itemType); return (
{ this.state.showMenu &&
this.popup = ref}>
{popupMenu.header}
{ popupMenu.text &&
{popupMenu.text}
} { popupMenu.options &&
{ popupMenu.options.map((option) =>

) } { this.state.reason &&