/* eslint-disable react/jsx-no-target-blank */ import { useEffect, useState } from 'react'; import { Avatar, Button, Dialog, DialogActions, DialogContent, DialogContentText, DialogTitle, List, ListItem, ListItemAvatar, ListItemSecondaryAction, ListItemText, MenuItem, } from '@material-ui/core'; import { Delete } from '@material-ui/icons'; import { Alert } from '@material-ui/lab'; import AddUserComponent from '../access-add-user'; import projectApi from '../../../store/project/api'; import PageContent from '../../common/PageContent'; import useUiConfig from '../../../hooks/api/getters/useUiConfig/useUiConfig'; import { useStyles } from './ProjectAccess.styles'; import PermissionIconButton from '../../common/PermissionIconButton/PermissionIconButton'; import { useParams } from 'react-router-dom'; import { IFeatureViewParams } from '../../../interfaces/params'; import ProjectRoleSelect from './ProjectRoleSelect/ProjectRoleSelect'; import usePagination from '../../../hooks/usePagination'; import PaginateUI from '../../common/PaginateUI/PaginateUI'; import useToast from '../../../hooks/useToast'; import ConfirmDialogue from '../../common/Dialogue'; const ProjectAccess = () => { const { id } = useParams(); const styles = useStyles(); const [roles, setRoles] = useState([]); const [users, setUsers] = useState([]); const [error, setError] = useState(); const { setToastData, setToastApiError } = useToast(); const { isOss } = useUiConfig(); const { page, pages, nextPage, prevPage, setPageIndex, pageIndex } = usePagination(users, 10); const [showDelDialogue, setShowDelDialogue] = useState(false); const [user, setUser] = useState({}); useEffect(() => { fetchAccess(); // eslint-disable-next-line react-hooks/exhaustive-deps }, [id]); const fetchAccess = async () => { try { const access = await projectApi.fetchAccess(id); setRoles(access.roles); setUsers( access.users.map(u => ({ ...u, name: u.name || '(No name)' })) ); } catch (e) { setToastApiError(e.toString()); } }; if (isOss()) { return ( Controlling access to projects requires a paid version of Unleash. Check out{' '} getunleash.io {' '} to find out more. ); } const handleRoleChange = (userId, currRoleId) => async evt => { const roleId = evt.target.value; try { await projectApi.removeUserFromRole(id, currRoleId, userId); await projectApi.addUserToRole(id, roleId, userId).then(() => { setToastData({ type: 'success', title: 'User role changed successfully', }); }); const newUsers = users.map(u => { if (u.id === userId) { return { ...u, roleId }; } else return u; }); setUsers(newUsers); } catch (err) { setToastData({ type: 'error', title: err.message || 'Server problems when adding users.', }); } }; const addUser = async (userId, roleId) => { try { await projectApi.addUserToRole(id, roleId, userId); await fetchAccess().then(() => { setToastData({ type: 'success', title: 'Successfully added user to the project', }); }); } catch (err) { setToastData({ type: 'error', title: err.message || 'Server problems when adding users.', }); } }; const removeAccess = (userId: number, roleId: number) => async () => { try { await projectApi.removeUserFromRole(id, roleId, userId).then(() => { setToastData({ type: 'success', title: 'User have been removed from project', }); }); const newUsers = users.filter(u => u.id !== userId); setUsers(newUsers); } catch (err) { setToastData({ type: 'error', title: err.message || 'Server problems when adding users.', }); } setShowDelDialogue(false); }; const handleCloseError = () => { setError(undefined); }; return ( {'Error'} {error}
{page.map(user => { const labelId = `checkbox-list-secondary-label-${user.id}`; return ( Choose role { setUser(user); setShowDelDialogue(true); }} disabled={users.length === 1} tooltip={ users.length === 1 ? 'A project must have at least one owner' : 'Remove access' } > ); })} { setUser({}); setShowDelDialogue(false); }} title="Really remove user from this project" />
); }; export default ProjectAccess;