fix getting list of groups where user is admin

This commit is contained in:
PhilReact 2025-06-19 07:27:27 +03:00
parent 3d9d3dff33
commit 9e5c39fede
4 changed files with 88 additions and 61 deletions

View File

@ -117,7 +117,7 @@ import { MainAvatar } from "./components/MainAvatar";
import { useRetrieveDataLocalStorage } from "./useRetrieveDataLocalStorage"; import { useRetrieveDataLocalStorage } from "./useRetrieveDataLocalStorage";
import { useQortalGetSaveSettings } from "./useQortalGetSaveSettings"; import { useQortalGetSaveSettings } from "./useQortalGetSaveSettings";
import { useRecoilState, useResetRecoilState, useSetRecoilState } from "recoil"; import { useRecoilState, useResetRecoilState, useSetRecoilState } from "recoil";
import { canSaveSettingToQdnAtom, fullScreenAtom, groupsPropertiesAtom, hasSettingsChangedAtom, isDisabledEditorEnterAtom, isUsingImportExportSettingsAtom, lastPaymentSeenTimestampAtom, mailsAtom, oldPinnedAppsAtom, qMailLastEnteredTimestampAtom, settingsLocalLastUpdatedAtom, settingsQDNLastUpdatedAtom, sortablePinnedAppsAtom } from "./atoms/global"; import { canSaveSettingToQdnAtom, fullScreenAtom, groupsPropertiesAtom, hasSettingsChangedAtom, isDisabledEditorEnterAtom, isUsingImportExportSettingsAtom, lastPaymentSeenTimestampAtom, mailsAtom, myGroupsWhereIAmAdminAtom, oldPinnedAppsAtom, qMailLastEnteredTimestampAtom, settingsLocalLastUpdatedAtom, settingsQDNLastUpdatedAtom, sortablePinnedAppsAtom } from "./atoms/global";
import { useAppFullScreen } from "./useAppFullscreen"; import { useAppFullScreen } from "./useAppFullscreen";
import { NotAuthenticated } from "./ExtStates/NotAuthenticated"; import { NotAuthenticated } from "./ExtStates/NotAuthenticated";
import { useFetchResources } from "./common/useFetchResources"; import { useFetchResources } from "./common/useFetchResources";
@ -445,6 +445,9 @@ function App() {
const resetAtomMailsAtom = useResetRecoilState(mailsAtom) const resetAtomMailsAtom = useResetRecoilState(mailsAtom)
const resetGroupPropertiesAtom = useResetRecoilState(groupsPropertiesAtom) const resetGroupPropertiesAtom = useResetRecoilState(groupsPropertiesAtom)
const resetLastPaymentSeenTimestampAtom = useResetRecoilState(lastPaymentSeenTimestampAtom) const resetLastPaymentSeenTimestampAtom = useResetRecoilState(lastPaymentSeenTimestampAtom)
const resetMyGroupsWhereIAmAdminAtom = useResetRecoilState(
myGroupsWhereIAmAdminAtom
);
const resetAllRecoil = () => { const resetAllRecoil = () => {
resetAtomSortablePinnedAppsAtom(); resetAtomSortablePinnedAppsAtom();
resetAtomCanSaveSettingToQdnAtom(); resetAtomCanSaveSettingToQdnAtom();
@ -456,6 +459,7 @@ function App() {
resetAtomMailsAtom() resetAtomMailsAtom()
resetGroupPropertiesAtom() resetGroupPropertiesAtom()
resetLastPaymentSeenTimestampAtom() resetLastPaymentSeenTimestampAtom()
resetMyGroupsWhereIAmAdminAtom()
}; };
useEffect(() => { useEffect(() => {
if (!isMobile) return; if (!isMobile) return;

View File

@ -231,8 +231,10 @@ export const AppsPrivate = ({myName, myAddress}) => {
} }
}, [myAddress]); }, [myAddress]);
useEffect(() => { useEffect(() => {
if (isOpenPrivateModal) {
getNames(); getNames();
}, [getNames]); }
}, [getNames, isOpenPrivateModal]);
const handleChange = (event: React.SyntheticEvent, newValue: number) => { const handleChange = (event: React.SyntheticEvent, newValue: number) => {
setValueTabPrivateApp(newValue); setValueTabPrivateApp(newValue);

View File

@ -95,7 +95,7 @@ import { formatEmailDate } from "./QMailMessages";
import LockIcon from '@mui/icons-material/Lock'; import LockIcon from '@mui/icons-material/Lock';
import NoEncryptionGmailerrorredIcon from '@mui/icons-material/NoEncryptionGmailerrorred'; import NoEncryptionGmailerrorredIcon from '@mui/icons-material/NoEncryptionGmailerrorred';
import { useRecoilState, useSetRecoilState } from "recoil"; import { useRecoilState, useSetRecoilState } from "recoil";
import { addressInfoControllerAtom, groupsPropertiesAtom, isOpenBlockedModalAtom, selectedGroupIdAtom } from "../../atoms/global"; import { addressInfoControllerAtom, groupsPropertiesAtom, isOpenBlockedModalAtom, myGroupsWhereIAmAdminAtom, selectedGroupIdAtom } from "../../atoms/global";
import { sortArrayByTimestampAndGroupName } from "../../utils/time"; import { sortArrayByTimestampAndGroupName } from "../../utils/time";
import { AdminSpace } from "../Chat/AdminSpace"; import { AdminSpace } from "../Chat/AdminSpace";
import { HubsIcon } from "../../assets/Icons/HubsIcon"; import { HubsIcon } from "../../assets/Icons/HubsIcon";
@ -466,6 +466,9 @@ export const Group = ({
const { setMemberGroups, memberGroups, rootHeight, isRunningPublicNode } = useContext(MyContext); const { setMemberGroups, memberGroups, rootHeight, isRunningPublicNode } = useContext(MyContext);
const lastGroupNotification = useRef<null | number>(null); const lastGroupNotification = useRef<null | number>(null);
const [timestampEnterData, setTimestampEnterData] = useState({}); const [timestampEnterData, setTimestampEnterData] = useState({});
const groupsPropertiesRef = useRef({});
const setMyGroupsWhereIAmAdmin = useSetRecoilState(myGroupsWhereIAmAdminAtom);
const [chatMode, setChatMode] = useState("groups"); const [chatMode, setChatMode] = useState("groups");
const [newChat, setNewChat] = useState(false); const [newChat, setNewChat] = useState(false);
const [openSnack, setOpenSnack] = React.useState(false); const [openSnack, setOpenSnack] = React.useState(false);
@ -532,6 +535,10 @@ export const Group = ({
timestampEnterDataRef.current = timestampEnterData timestampEnterDataRef.current = timestampEnterData
}, [timestampEnterData]) }, [timestampEnterData])
useEffect(() => {
groupsPropertiesRef.current = groupsProperties;
}, [groupsProperties]);
useEffect(() => { useEffect(() => {
isFocusedRef.current = isFocused; isFocusedRef.current = isFocused;
}, [isFocused]); }, [isFocused]);
@ -939,13 +946,50 @@ export const Group = ({
}, []) }, [])
useEffect(()=> { const getGroupsWhereIAmAMember = useCallback(async (groups) => {
if(!myAddress) return try {
if(areKeysEqual(groups?.map((grp)=> grp?.groupId), Object.keys(groupsProperties))){ let groupsAsAdmin = [];
} else { const getAllGroupsAsAdmin = groups
getGroupsProperties(myAddress) .filter((item) => item.groupId !== '0')
.map(async (group) => {
const isAdminResponse = await requestQueueGroupJoinRequests.enqueue(
() => {
return fetch(
`${getBaseApiReact()}/groups/members/${group.groupId}?limit=0&onlyAdmins=true`
);
} }
}, [groups, myAddress]) );
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);
} catch (error) {
console.error();
}
}, []);
useEffect(() => {
if (!myAddress) return;
if (
!areKeysEqual(
groups?.map((grp) => grp?.groupId),
Object.keys(groupsPropertiesRef.current)
)
) {
getGroupsProperties(myAddress);
getGroupsWhereIAmAMember(groups);
}
}, [groups, myAddress]);

View File

@ -17,7 +17,7 @@ import { CustomLoader } from "../../common/CustomLoader";
import { getBaseApi } from "../../background"; import { getBaseApi } from "../../background";
import { MyContext, getBaseApiReact, isMobile } from "../../App"; import { MyContext, getBaseApiReact, isMobile } from "../../App";
import { myGroupsWhereIAmAdminAtom } from "../../atoms/global"; import { myGroupsWhereIAmAdminAtom } from "../../atoms/global";
import { useSetRecoilState } from "recoil"; import { useRecoilState, useSetRecoilState } from "recoil";
import ExpandMoreIcon from '@mui/icons-material/ExpandMore'; import ExpandMoreIcon from '@mui/icons-material/ExpandMore';
import ExpandLessIcon from '@mui/icons-material/ExpandLess'; import ExpandLessIcon from '@mui/icons-material/ExpandLess';
export const requestQueueGroupJoinRequests = new RequestQueueWithPromise(2) export const requestQueueGroupJoinRequests = new RequestQueueWithPromise(2)
@ -28,67 +28,44 @@ export const GroupJoinRequests = ({ myAddress, groups, setOpenManageMembers, get
const [groupsWithJoinRequests, setGroupsWithJoinRequests] = React.useState([]) const [groupsWithJoinRequests, setGroupsWithJoinRequests] = React.useState([])
const [loading, setLoading] = React.useState(true) const [loading, setLoading] = React.useState(true)
const {txList, setTxList} = React.useContext(MyContext) const {txList, setTxList} = React.useContext(MyContext)
const setMyGroupsWhereIAmAdmin = useSetRecoilState( const [myGroupsWhereIAmAdmin] = useRecoilState(myGroupsWhereIAmAdminAtom);
myGroupsWhereIAmAdminAtom
);
const getJoinRequests = async () => { const getJoinRequests = async () => {
try { try {
setLoading(true) setLoading(true);
const res = await Promise.all(
let groupsAsAdmin = [] myGroupsWhereIAmAdmin.map(async (group) => {
const getAllGroupsAsAdmin = groups.filter((item)=> item.groupId !== '0').map(async (group)=> { const joinRequestResponse =
await requestQueueGroupJoinRequests.enqueue(() => {
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( return fetch(
`${getBaseApiReact()}/groups/joinrequests/${group.groupId}` `${getBaseApiReact()}/groups/joinrequests/${group.groupId}`
); );
}) });
const joinRequestData = await joinRequestResponse.json() const joinRequestData = await joinRequestResponse.json();
return { return {
group, group,
data: joinRequestData data: joinRequestData,
} };
})) })
setGroupsWithJoinRequests(res) );
setGroupsWithJoinRequests(res);
} catch (error) { } catch (error) {
console.log(error);
} finally { } finally {
setLoading(false) setLoading(false);
}
} }
};
React.useEffect(() => { React.useEffect(() => {
if (myAddress && groups.length > 0) { if (myAddress && myGroupsWhereIAmAdmin.length > 0) {
getJoinRequests() getJoinRequests();
} else { } else {
setLoading(false) setLoading(false);
} }
}, [myAddress, groups]); }, [myAddress, myGroupsWhereIAmAdmin]);
const filteredJoinRequests = React.useMemo(()=> { const filteredJoinRequests = React.useMemo(()=> {
return groupsWithJoinRequests.map((group)=> { return groupsWithJoinRequests.map((group)=> {
const filteredGroupRequests = group?.data?.filter((gd)=> { const filteredGroupRequests = group?.data?.filter((gd)=> {