/****************************************************************************** * Copyright (c) 2026 Contributors to the Eclipse Foundation. * * See the NOTICE file(s) distributed with this work for additional * information regarding copyright ownership. * * This program and the accompanying materials are made available under the * terms of the Eclipse Public License 2.0 which is available at * https://www.eclipse.org/legal/epl-2.0. * * SPDX-License-Identifier: EPL-2.0 *****************************************************************************/ import { FunctionComponent, useEffect, useState, useContext, useRef } from 'react'; import { Box, Typography, Button, Divider, List, ListItem, ListItemAvatar, Avatar, ListItemText, IconButton, type PaperProps, Paper } from '@mui/material'; import { Link as RouterLink } from 'react-router-dom'; import { AdminDashboardRoutes } from '../admin-dashboard-routes'; import { MainContext } from '../../../context'; import { CustomerMembership, Customer, UserData, isError } from '../../../extension-registry-types'; import { AddUserDialog } from '../../user/add-user-dialog'; import DeleteIcon from '@mui/icons-material/Delete'; import PersonAddIcon from '@mui/icons-material/PersonAdd'; import { createRoute } from '../../../utils'; const sectionPaperProps: PaperProps = { elevation: 1, sx: { p: 3, mb: 3 } }; export const CustomerMemberList: FunctionComponent = props => { const { service, handleError } = useContext(MainContext); const [members, setMembers] = useState([]); const [addDialogIsOpen, setAddDialogIsOpen] = useState(false); const abortController = useRef(new AbortController()); const users = members.map(member => member.user); useEffect(() => { fetchMembers(); }, [props.customer]); useEffect(() => { return () => { abortController.current.abort(); }; }, []); const handleCloseAddDialog = async () => { setAddDialogIsOpen(false); fetchMembers(); }; const handleOpenAddDialog = async () => { setAddDialogIsOpen(true); }; const handleAddUser = async (user: UserData) => { try { const result = await service.admin.addCustomerMember(abortController.current, props.customer.name, user); if (isError(result)) { throw result; } await fetchMembers(); } catch (err) { handleError(err); } }; const handleRemoveUser = async (user: UserData) => { try { const result = await service.admin.removeCustomerMember(abortController.current, props.customer.name, user); if (isError(result)) { throw result; } await fetchMembers(); } catch (err) { handleError(err); } }; const fetchMembers = async () => { try { const membershipList = await service.admin.getCustomerMembers(abortController.current, props.customer.name); const members = membershipList.customerMemberships; setMembers(members); } catch (err) { handleError(err); } }; return Members {members.length === 0 ? ( No members assigned to this customer. ) : ( {users.map(user => ( handleRemoveUser(user)} title='Remove member'> } > {user.loginName} } secondary={user.fullName} /> ))} )} {/*{members.length ?*/} {/* */} {/* {members.map(member =>*/} {/* changeRole(member, role)}*/} {/* onRemoveUser={() => changeRole(member, 'remove')} />)}*/} {/* :*/} {/* There are no members assigned yet.}*/} member.user)} onClose={handleCloseAddDialog} onAddUser={handleAddUser} /> ; }; export interface CustomerMemberListProps { customer: Customer; }