import { useEffect, useRef, useState } from 'react'; import { Avatar, Box, ListItem, ListItemAvatar, ListItemButton, ListItemText, Popover, } from '@mui/material'; import { AutoSizer, CellMeasurer, CellMeasurerCache, List, } from 'react-virtualized'; import { getNameInfo } from './Group'; import { getFee } from '../../background'; import { LoadingButton } from '@mui/lab'; import { getBaseApiReact } from '../../App'; import { useTranslation } from 'react-i18next'; export const getMemberInvites = async (groupNumber) => { const response = await fetch( `${getBaseApiReact()}/groups/bans/${groupNumber}?limit=0` ); const groupData = await response.json(); return groupData; }; const getNames = async (listOfMembers, includeNoNames) => { let members = []; if (listOfMembers && Array.isArray(listOfMembers)) { for (const member of listOfMembers) { if (member.offender) { const name = await getNameInfo(member.offender); if (name) { members.push({ ...member, name }); } else if (includeNoNames) { members.push({ ...member, name: name || '' }); } } } } return members; }; const cache = new CellMeasurerCache({ fixedWidth: true, defaultHeight: 50, }); export const ListOfBans = ({ groupId, setInfoSnack, setOpenSnack, show }) => { const [bans, setBans] = useState([]); const [popoverAnchor, setPopoverAnchor] = useState(null); // Track which list item the popover is anchored to const [openPopoverIndex, setOpenPopoverIndex] = useState(null); // Track which list item has the popover open const listRef = useRef(); const [isLoadingUnban, setIsLoadingUnban] = useState(false); const { t } = useTranslation(['core', 'group']); const getInvites = async (groupId) => { try { const res = await getMemberInvites(groupId); const resWithNames = await getNames(res, true); setBans(resWithNames); } catch (error) { console.error(error); } }; useEffect(() => { if (groupId) { getInvites(groupId); } }, [groupId]); const handlePopoverOpen = (event, index) => { setPopoverAnchor(event.currentTarget); setOpenPopoverIndex(index); }; const handlePopoverClose = () => { setPopoverAnchor(null); setOpenPopoverIndex(null); }; const handleCancelBan = async (address) => { try { const fee = await getFee('CANCEL_GROUP_BAN'); await show({ message: t('group:question.cancel_ban', { postProcess: 'capitalize' }), publishFee: fee.fee + ' QORT', }); setIsLoadingUnban(true); new Promise((res, rej) => { window .sendMessage('cancelBan', { groupId, qortalAddress: address, }) .then((response) => { if (!response?.error) { res(response); setIsLoadingUnban(false); setInfoSnack({ type: 'success', message: t('group:message.success.unbanned_user', { postProcess: 'capitalize', }), }); handlePopoverClose(); setOpenSnack(true); return; } setInfoSnack({ type: 'error', message: response?.error, }); setOpenSnack(true); rej(response.error); }) .catch((error) => { setInfoSnack({ type: 'error', message: error.message || 'An error occurred', }); setOpenSnack(true); rej(error); }); }); } catch (error) { console.log(error); } finally { setIsLoadingUnban(false); } }; const rowRenderer = ({ index, key, parent, style }) => { const member = bans[index]; return ( {({ measure }) => (
handleCancelBan(member?.offender)} > {t('group:action.cancel_ban', { postProcess: 'capitalize', })} handlePopoverOpen(event, index)} >
)}
); }; return (

{t('group:ban_list', { postProcess: 'capitalize' })}

{({ height, width }) => ( )}
); };