pubsweet-component-bookbuilder
Version:
121 lines (109 loc) • 3.13 kB
JSX
import { map, debounce, isEmpty } from 'lodash'
import React from 'react'
import PropTypes from 'prop-types'
import AsyncSelect from 'react-select/lib/Async'
import styled from 'styled-components'
import { th } from '@pubsweet/ui-toolkit'
const Container = styled.div`
margin-bottom: calc(2 * ${th('gridUnit')});
padding: 0 calc(2 * ${th('gridUnit')}) 0 calc(2 * ${th('gridUnit')});
width: 95%;
`
export class AddMember extends React.Component {
constructor(props) {
super(props)
this.handleChange = this.handleChange.bind(this)
this.promiseOptions = this.promiseOptions.bind(this)
this.searchUsers = this.searchUsers.bind(this)
this.state = {
message: {},
selectedOption: null,
}
}
handleChange(selectedOption) {
this.setState({ selectedOption })
const { team, update } = this.props
const updatedMembers = map(team.members, member => ({
user: {
id: member.user.id,
},
}))
updatedMembers.push({ user: { id: selectedOption.value } })
update({
variables: { id: team.id, input: { members: updatedMembers } },
}).then(res => this.setState({ selectedOption: null }))
}
promiseOptions(inputValue, callback) {
const { findUser, team } = this.props
const teamMemberIds = map(team.members, member => member.user.id)
findUser({
variables: {
search: inputValue,
exclude: teamMemberIds,
},
}).then(res => {
const { data } = res
const { findUser } = data
const options = map(findUser, user => ({
value: user.id,
label: `${user.givenName} ${user.surname}`,
}))
return callback(options)
})
}
searchUsers(inputValue, callback) {
if (isEmpty(inputValue)) {
return callback(null, { options: [] })
}
return this.promiseOptions(inputValue, callback)
}
render() {
const { show } = this.props
return (
<Container>
{show && (
<AsyncSelect
autoload={false}
closeMenuOnSelect
isClearable={false}
loadOptions={debounce(this.searchUsers, 500)}
onChange={this.handleChange}
placeholder="Search"
value={this.state.selectedOption}
/>
)}
</Container>
)
}
}
AddMember.propTypes = {
show: PropTypes.bool.isRequired,
hideInput: PropTypes.func.isRequired,
team: PropTypes.shape({
id: PropTypes.string,
name: PropTypes.string,
type: PropTypes.string,
rev: PropTypes.string,
teamType: PropTypes.shape({
name: PropTypes.string,
permissions: PropTypes.arrayOf(PropTypes.string),
}),
members: PropTypes.arrayOf(PropTypes.string),
object: PropTypes.shape({
id: PropTypes.string,
type: PropTypes.string,
}),
}),
users: PropTypes.arrayOf(
PropTypes.shape({
admin: PropTypes.bool,
email: PropTypes.string,
id: PropTypes.string,
rev: PropTypes.string,
type: PropTypes.string,
username: PropTypes.string,
}),
),
update: PropTypes.func.isRequired,
}
export default AddMember