import React, { useEffect, useState } from 'react'; import projectApi from '../../store/project/api'; import PropTypes from 'prop-types'; import { Select, MenuItem, TextField, CircularProgress, InputLabel, FormControl, Grid, Button, Icon, InputAdornment, } from '@material-ui/core'; import Autocomplete from '@material-ui/lab/Autocomplete'; function AddUserComponent({ roles, addUserToRole }) { const [user, setUser] = useState(); const [role, setRole] = useState({}); const [options, setOptions] = useState([]); const [loading, setLoading] = useState(false); useEffect(() => { if (roles.length > 0) { const regularRole = roles.find(r => r.name.toLowerCase() === 'regular'); setRole(regularRole || roles[0]); } }, [roles]); const search = async q => { if (q.length > 1) { setLoading(true); // TODO: Do not hard-code fetch here. const users = await projectApi.searchProjectUser(q); setOptions([...users]); } else { setOptions([]); } setLoading(false); }; const handleQueryUpdate = evt => { const q = evt.target.value; search(q); }; const handleSelectUser = (evt, value) => { setOptions([]); setUser(value); }; const handleRoleChange = evt => { const roleId = +evt.target.value; const role = roles.find(r => r.id === roleId); setRole(role); }; const handleSubmit = async evt => { evt.preventDefault(); await addUserToRole(user.id, role.id); setUser(undefined); setOptions([]); }; return ( true} filterOptions={o => o} getOptionLabel={option => { if (option) { return `${option.name || '(Empty name)'} <${option.email || option.username}>`; } else return ''; }} options={options} loading={loading} renderInput={params => ( search ), endAdornment: ( {loading ? : null} {params.InputProps.endAdornment} ), }} /> )} /> Role ); } AddUserComponent.propTypes = { roles: PropTypes.array.isRequired, addUserToRole: PropTypes.func.isRequired, }; export default AddUserComponent;