import { Set } from 'immutable'
import React, { Component } from 'react'
import { Scrollbars } from 'react-custom-scrollbars'
import { DropTarget } from 'react-dnd'
import { connect } from 'react-redux'
import { Link, Prompt, Redirect } from 'react-router-dom'
import * as UIActions from '../../actions/ui'
import Role from '../role/draggable'
import * as Actions from './actions'
import Category from './Category'
import './RoleEditor.sass'
const mapState = ({ rolePicker, roleEditor, servers }, ownProps) => ({
rp: rolePicker,
editor: roleEditor,
server: servers.get(ownProps.match.params.server),
})
const dropTarget = DropTarget(
Symbol.for('dnd: role'),
{
drop(props, monitor, element) {
element.dropRole({}, 'Uncategorized')(monitor.getItem())
},
canDrop(props, monitor) {
return monitor.getItem().category !== 'Uncategorized'
},
},
(connect, monitor) => ({
connectDropTarget: connect.dropTarget(),
isOver: monitor.isOver(),
isOverCurrent: monitor.isOver({ shallow: true }),
canDrop: monitor.canDrop(),
itemType: monitor.getItemType(),
})
)
class RoleEditor extends Component {
componentDidMount() {
const {
dispatch,
match: {
params: { server },
},
} = this.props
dispatch(Actions.constructView(server))
}
componentWillReceiveProps(nextProps) {
if (this.props.match.params.server !== nextProps.match.params.server) {
const { dispatch } = this.props
dispatch(
UIActions.fadeOut(() =>
dispatch(Actions.constructView(nextProps.match.params.server))
)
)
}
}
dropRole = (category, name) => ({ role, category }) => {
const { dispatch } = this.props
console.log(role)
dispatch(Actions.addRoleToCategory(name, category, role))
}
createCategory = () => {
const { dispatch } = this.props
dispatch(Actions.createCategory)
}
saveCategory = (category, name) => () => {
const { dispatch } = this.props
dispatch(Actions.saveCategory(name, category))
}
deleteCategory = (category, id) => () => {
const { dispatch } = this.props
dispatch(Actions.deleteCategory(id, category))
}
openEditor = (category, name) => () => {
const { dispatch } = this.props
dispatch(Actions.openEditor(name))
}
editCategory = (category, id) => (key, type) => event => {
const { dispatch } = this.props
let value
switch (type) {
case Symbol.for('edit: text'):
value = event.target.value
break
case Symbol.for('edit: bool'):
value = event.target.checked
break
case Symbol.for('edit: select'):
value = event.target.value
break
default:
value = null
}
dispatch(Actions.editCategory({ category, id, key, type, value }))
}
resetServer = () => {
const { dispatch } = this.props
dispatch({ type: Symbol.for('re: reset') })
}
saveServer = () => {
const {
dispatch,
match: {
params: { server },
},
} = this.props
dispatch(Actions.saveServer(server))
}
onBump = (category, name) => move => () =>
this.props.dispatch(Actions.bumpCategory(category, name)(move))
get hasChanged() {
return (
this.props.editor.get('originalSnapshot').hashCode() !==
this.props.editor.get('viewMap').hashCode()
)
}
render() {
const { server } = this.props
if (server == null) {
return null
}
if (server.getIn(['perms', 'canManageRoles']) !== true) {
return