in frontend/src/components/teamsAndOrgs/members.js [13:110]
export function Members({
addMembers,
removeMembers,
saveMembersFn,
resetMembersFn,
members,
type,
}: Object) {
const token = useSelector((state) => state.auth.get('token'));
const [editMode, setEditMode] = useState(false);
const [membersBackup, setMembersBackup] = useState(null);
const selectPlaceHolder = <FormattedMessage {...messages.searchUsers} />;
let title = <FormattedMessage {...messages.managers} />;
if (type === 'members') {
title = <FormattedMessage {...messages.members} />;
}
// store the first array of members in order to restore it if the user cancels an
// add and remove members operation
useEffect(() => {
if (membersBackup === null && editMode) {
setMembersBackup(members);
}
}, [members, editMode, setMembersBackup, membersBackup]);
const submitMembers = () => {
if (saveMembersFn) {
saveMembersFn();
}
setMembersBackup(members);
setEditMode(false);
};
const promiseOptions = (inputValue) =>
new Promise((resolve) => {
setTimeout(async () => {
const result = await fetchLocalJSONAPI(`users/?username=${inputValue}`, token);
resolve(result.users);
}, 1000);
});
return (
<>
<div className={`bg-white b--grey-light pa4 ${editMode ? 'bt bl br' : 'ba'}`}>
<div className="cf db">
<h3 className="f3 blue-dark mv2 fw6 fl">{title}</h3>
<EditModeControl editMode={editMode} switchModeFn={setEditMode} />
</div>
<div className="cf mb1">
{editMode && (
<AsyncSelect
classNamePrefix="react-select"
isMulti
cacheOptions
defaultOptions
placeholder={selectPlaceHolder}
isClearable={false}
getOptionLabel={(option) => option.username}
getOptionValue={(option) => option.username}
loadOptions={promiseOptions}
onChange={(values) => addMembers(values || [])}
className="z-2"
/>
)}
</div>
<div className="cf db mt3">
{members.map((user, n) => (
<UserAvatar
key={n}
username={user.username}
picture={user.pictureUrl}
size="large"
colorClasses="white bg-blue-grey mv1"
removeFn={members.length > 1 && removeMembers}
editMode={members.length > 1 && editMode}
/>
))}
</div>
</div>
{editMode && (
<div className="cf pt0">
<div className="w-70-l w-50 fl tr dib bg-grey-light">
<Button
className="blue-dark bg-grey-light h3"
onClick={() => {
resetMembersFn(membersBackup || []);
setEditMode(false);
}}
>
<FormattedMessage {...messages.cancel} />
</Button>
</div>
<div className="w-30-l w-50 fr dib">
<Button className="white bg-primary h3 w-100" onClick={() => submitMembers()}>
<FormattedMessage {...messages.done} />
</Button>
</div>
</div>
)}