import * as React from 'react'; import List from '@mui/material/List'; import ListItem from '@mui/material/ListItem'; import ListItemButton from '@mui/material/ListItemButton'; import ListItemText from '@mui/material/ListItemText'; import IconButton from '@mui/material/IconButton'; import { RequestQueueWithPromise } from '../../utils/queue/queue'; import GroupAddIcon from '@mui/icons-material/GroupAdd'; import { executeEvent } from '../../utils/events'; import { Box, ButtonBase, Collapse, Typography, useTheme } from '@mui/material'; import { CustomLoader } from '../../common/CustomLoader'; import { getBaseApiReact } from '../../App'; import { myGroupsWhereIAmAdminAtom, txListAtom } from '../../atoms/global'; import ExpandMoreIcon from '@mui/icons-material/ExpandMore'; import ExpandLessIcon from '@mui/icons-material/ExpandLess'; import { useTranslation } from 'react-i18next'; import { useAtom, useSetAtom } from 'jotai'; export const requestQueueGroupJoinRequests = new RequestQueueWithPromise(2); export const GroupJoinRequests = ({ myAddress, groups, setOpenManageMembers, getTimestampEnterChat, setSelectedGroup, setGroupSection, setMobileViewMode, setDesktopViewMode, }) => { const [isExpanded, setIsExpanded] = React.useState(false); const { t } = useTranslation(['core', 'group']); const [groupsWithJoinRequests, setGroupsWithJoinRequests] = React.useState( [] ); const [loading, setLoading] = React.useState(true); const [txList] = useAtom(txListAtom); const setMyGroupsWhereIAmAdmin = useSetAtom(myGroupsWhereIAmAdminAtom); const theme = useTheme(); const getJoinRequests = async () => { try { setLoading(true); let groupsAsAdmin = []; const getAllGroupsAsAdmin = groups .filter((item) => item.groupId !== '0') .map(async (group) => { const isAdminResponse = await requestQueueGroupJoinRequests.enqueue( () => { return fetch( `${getBaseApiReact()}/groups/members/${group.groupId}?limit=0&onlyAdmins=true` ); } ); const isAdminData = await isAdminResponse.json(); const findMyself = isAdminData?.members?.find( (member) => member.member === myAddress ); if (findMyself) { groupsAsAdmin.push(group); } return true; }); await Promise.all(getAllGroupsAsAdmin); setMyGroupsWhereIAmAdmin(groupsAsAdmin); const res = await Promise.all( groupsAsAdmin.map(async (group) => { const joinRequestResponse = await requestQueueGroupJoinRequests.enqueue(() => { return fetch( `${getBaseApiReact()}/groups/joinrequests/${group.groupId}` ); }); const joinRequestData = await joinRequestResponse.json(); return { group, data: joinRequestData, }; }) ); setGroupsWithJoinRequests(res); } catch (error) { console.log(error); } finally { setLoading(false); } }; React.useEffect(() => { if (myAddress && groups.length > 0) { getJoinRequests(); } else { setLoading(false); } }, [myAddress, groups]); const filteredJoinRequests = React.useMemo(() => { return groupsWithJoinRequests.map((group) => { const filteredGroupRequests = group?.data?.filter((gd) => { const findJoinRequsetInTxList = txList?.find( (tx) => tx?.groupId === group?.group?.groupId && tx?.qortalAddress === gd?.joiner && tx?.type === 'join-request-accept' ); if (findJoinRequsetInTxList) return false; return true; }); return { ...group, data: filteredGroupRequests, }; }); }, [groupsWithJoinRequests, txList]); return ( setIsExpanded((prev) => !prev)} > {t('group:join_requests', { postProcess: 'capitalizeFirst' })}{' '} {filteredJoinRequests?.filter((group) => group?.data?.length > 0) ?.length > 0 && ` (${filteredJoinRequests?.filter((group) => group?.data?.length > 0)?.length})`} {isExpanded ? ( ) : ( )} {loading && filteredJoinRequests.length === 0 && ( )} {!loading && (filteredJoinRequests.length === 0 || filteredJoinRequests?.filter((group) => group?.data?.length > 0) .length === 0) && ( {t('group:message.generic.no_display', { postProcess: 'capitalizeFirst', })} )} {filteredJoinRequests?.map((group) => { if (group?.data?.length === 0) return null; return ( { setSelectedGroup(group?.group); setMobileViewMode('group'); getTimestampEnterChat(); setGroupSection('announcement'); setOpenManageMembers(true); setDesktopViewMode('chat'); setTimeout(() => { executeEvent('openGroupJoinRequest', {}); }, 300); }} sx={{ marginBottom: '20px', }} disablePadding secondaryAction={ } > ); })} ); };