diff --git a/client/src/views/team-members/components/InviteMemberDialog.js b/client/src/views/team-members/components/InviteMemberDialog.js
new file mode 100644
index 000000000..f34b8c9ee
--- /dev/null
+++ b/client/src/views/team-members/components/InviteMemberDialog.js
@@ -0,0 +1,207 @@
+import React, { Component } from 'react'
+import PropTypes from 'prop-types'
+import { Mutation } from 'react-apollo'
+import { withStyles } from '@material-ui/core/styles'
+
+import Button from '@material-ui/core/Button'
+import AddIcon from '@material-ui/icons/Add'
+import TextField from '@material-ui/core/TextField'
+import FormControl from '@material-ui/core/FormControl'
+import FormHelperText from '@material-ui/core/FormHelperText'
+import Dialog from '@material-ui/core/Dialog'
+import DialogActions from '@material-ui/core/DialogActions'
+import DialogContent from '@material-ui/core/DialogContent'
+import DialogTitle from '@material-ui/core/DialogTitle'
+import Typography from '@material-ui/core/Typography'
+import { isEmpty } from '../../../utils/js-helpers'
+
+import SEND_MEMBER_INVITE from '../../../graphql/teams/SendMemberInvite'
+
+// import { checkGraphQLError } from '../../../utils/graphql-errors'
+
+const styles = theme => ({
+ dialogStyle: {
+ padding: '3em'
+ },
+ buttonRight: {
+ // position: 'absolute',
+ // right: '3em'
+ marginTop: '1em',
+ marginRight: 'auto',
+ marginLeft: 'auto',
+ display: 'block',
+ lineHeight: '1em'
+ }
+})
+
+export class InviteMemberDialog extends Component {
+ constructor (props) {
+ super(props)
+
+ this.handleClickOpen = this.handleClickOpen.bind(this)
+ this.handleClose = this.handleClose.bind(this)
+ this.handleChange = this.handleChange.bind(this)
+ this.handleSubmit = this.handleSubmit.bind(this)
+ this.validate = this.validate.bind(this)
+
+ this.state = {
+ open: false,
+ email: '',
+ errors: {
+ email: ''
+ }
+ }
+ }
+
+ render () {
+ const { classes, teamId } = this.props
+
+ if (this.state.open) {
+ return (
+
+ {(sendMemberInvite, { loading, error, data }) => {
+ console.log('sendMemberInvite: ', data)
+ let errors
+ let loader = null
+ if (loading) {
+ loader = (
+ Submitting invitation...
+ )
+ }
+ if (error) {
+ errors = error.graphQLErrors.map(({ message }, i) => {
+ // const displayMessage = checkGraphQLError(message)
+ return (
+
+ {message}
+
+ )
+ })
+ }
+ return (
+
+
+
+
+ )
+ }}
+
+ )
+ } else {
+ return (
+
+ )
+ }
+ }
+
+ handleClickOpen () {
+ this.setState({ open: true })
+ }
+
+ handleClose () {
+ this.setState({ open: false })
+ }
+
+ handleChange (e) {
+ const errors = this.validate(e.target.value)
+ if (isEmpty(errors)) {
+ this.setState({ errors: { email: '' } })
+ this.setState({ email: e.target.value })
+ } else {
+ this.setState({ errors: errors })
+ this.setState({ email: e.target.value })
+ }
+ }
+
+ async handleSubmit (e, sendMemberInvite, email, teamId) {
+ e.preventDefault()
+ console.log('sendMemberInvite submit: ', email, teamId)
+ await sendMemberInvite({ variables: { email, teamId } })
+ this.setState({ email: '' })
+ }
+
+ validate (data) {
+ const errors = {}
+ if (data === '') errors.email = 'Please enter an email address'
+ return errors
+ }
+}
+
+InviteMemberDialog.propTypes = {
+ classes: PropTypes.object.isRequired,
+ teamId: PropTypes.string
+}
+
+export default withStyles(styles)(InviteMemberDialog)