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 { getBaseApi, getFee } from '../../background'; import { LoadingButton } from '@mui/lab'; import { getBaseApiReact } from '../../App'; import { txListAtom } from '../../atoms/global'; import { useAtom } from 'jotai'; export const getMemberInvites = async (groupNumber) => { const response = await fetch( `${getBaseApiReact()}/groups/joinrequests/${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.joiner) { const name = await getNameInfo(member.joiner); if (name) { members.push({ ...member, name: name || '' }); } else if (includeNoNames) { members.push({ ...member, name: name || '' }); } } } } return members; }; const cache = new CellMeasurerCache({ fixedWidth: true, defaultHeight: 50, }); export const ListOfJoinRequests = ({ groupId, setInfoSnack, setOpenSnack, show, }) => { const [invites, setInvites] = useState([]); const [txList, setTxList] = useAtom(txListAtom); 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 [isLoadingAccept, setIsLoadingAccept] = useState(false); const getInvites = async (groupId) => { try { const res = await getMemberInvites(groupId); const resWithNames = await getNames(res, true); setInvites(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 handleAcceptJoinRequest = async (address) => { try { const fee = await getFee('GROUP_INVITE'); // TODO translate await show({ message: 'Would you like to perform a GROUP_INVITE transaction?', publishFee: fee.fee + ' QORT', }); setIsLoadingAccept(true); await new Promise((res, rej) => { window .sendMessage('inviteToGroup', { groupId, qortalAddress: address, inviteTime: 10800, }) .then((response) => { if (!response?.error) { setIsLoadingAccept(false); setInfoSnack({ type: 'success', message: 'Successfully accepted join request. It may take a couple of minutes for the changes to propagate', }); setOpenSnack(true); handlePopoverClose(); res(response); setTxList((prev) => [ { ...response, type: 'join-request-accept', label: `Accepted join request: awaiting confirmation`, labelDone: `User successfully joined!`, done: false, groupId, qortalAddress: address, }, ...prev, ]); 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) { } finally { setIsLoadingAccept(false); } }; const rowRenderer = ({ index, key, parent, style }) => { const member = invites[index]; const findJoinRequsetInTxList = txList?.find( (tx) => tx?.groupId === groupId && tx?.qortalAddress === member?.joiner && tx?.type === 'join-request-accept' ); if (findJoinRequsetInTxList) return null; return ( {({ measure }) => (
handleAcceptJoinRequest(member?.joiner)} > Accept handlePopoverOpen(event, index)} >
)}
); }; return (

Join request list

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