import * as React from "react"; import List from "@mui/material/List"; import ListItem from "@mui/material/ListItem"; import ListItemButton from "@mui/material/ListItemButton"; import ListItemIcon from "@mui/material/ListItemIcon"; import ListItemText from "@mui/material/ListItemText"; import Checkbox from "@mui/material/Checkbox"; import IconButton from "@mui/material/IconButton"; import CommentIcon from "@mui/icons-material/Comment"; import InfoIcon from "@mui/icons-material/Info"; import { RequestQueueWithPromise } from "../../utils/queue/queue"; import GroupAddIcon from '@mui/icons-material/GroupAdd'; import { executeEvent } from "../../utils/events"; import { Box, ButtonBase, Collapse, Typography } from "@mui/material"; import { Spacer } from "../../common/Spacer"; import { CustomLoader } from "../../common/CustomLoader"; import { getBaseApi } from "../../background"; import { MyContext, getBaseApiReact, isMobile } from "../../App"; import { myGroupsWhereIAmAdminAtom } from "../../atoms/global"; import { useSetRecoilState } from "recoil"; import ExpandMoreIcon from '@mui/icons-material/ExpandMore'; import ExpandLessIcon from '@mui/icons-material/ExpandLess'; export const requestQueueGroupJoinRequests = new RequestQueueWithPromise(2) export const GroupJoinRequests = ({ myAddress, groups, setOpenManageMembers, getTimestampEnterChat, setSelectedGroup, setGroupSection, setMobileViewMode, setDesktopViewMode }) => { const [isExpanded, setIsExpanded] = React.useState(false) const [groupsWithJoinRequests, setGroupsWithJoinRequests] = React.useState([]) const [loading, setLoading] = React.useState(true) const {txList, setTxList} = React.useContext(MyContext) const setMyGroupsWhereIAmAdmin = useSetRecoilState( myGroupsWhereIAmAdminAtom ); 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) { } 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)} > Join Requests {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) && ( Nothing to display )} {filteredJoinRequests?.map((group)=> { if(group?.data?.length === 0) return null return ( { setSelectedGroup(group?.group) setMobileViewMode('group') getTimestampEnterChat() setGroupSection("announcement") setOpenManageMembers(true) if(!isMobile){ setDesktopViewMode('chat') } setTimeout(() => { executeEvent("openGroupJoinRequest", {}); }, 300); }} sx={{ marginBottom: '20px' }} disablePadding secondaryAction={ } > ) })} ); };