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 { useRecoilState, 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 [myGroupsWhereIAmAdmin] = useRecoilState(myGroupsWhereIAmAdminAtom); const getJoinRequests = async () => { try { setLoading(true); const res = await Promise.all( myGroupsWhereIAmAdmin.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 && myGroupsWhereIAmAdmin.length > 0) { getJoinRequests(); } else { setLoading(false); } }, [myAddress, myGroupsWhereIAmAdmin]); 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={ } > ) })} ); };