Files
desktop/app/providers/InformationProvider/useGroupMembers.ts
rosetta 83f38dc63f 'init'
2026-01-30 05:01:05 +02:00

69 lines
2.6 KiB
TypeScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import { useEffect, useState } from "react";
import { useGroupInformation } from "./useGroupInformation";
import { PacketGroupInfo } from "../ProtocolProvider/protocol/packets/packet.group.info";
import { usePacket } from "../ProtocolProvider/usePacket";
import { useSender } from "../ProtocolProvider/useSender";
import { useGroups } from "../DialogProvider/useGroups";
import { useMemory } from "../MemoryProvider/useMemory";
/**
* Хук для получения участников группы
* @param groupId ид группы
* @param force принудительное обновление, если true, то будет
* отправлен запрос на сервер и получен актуальный список участников,
* если false, то будет возвращено значение из памяти
* @returns
*/
export function useGroupMembers(groupId: string, force?: boolean) : {
members: string[];
loading: boolean;
} {
const send = useSender();
const {normalize, hasGroup} = useGroups();
const {markAsDeleted} = useGroupInformation(normalize(groupId));
const [members, setMembers] = useMemory<string[]>("members_group_" + groupId, [], true);
const [loading, setLoading] = useState(false);
useEffect(() => {
updateGroupMembers();
}, [groupId]);
const updateGroupMembers = () => {
if((!hasGroup(groupId) && groupId.length > 16)
|| (members.length > 0 && !force)
){
/**
* Не ID группы, пропускаем. Если ид группы больше 16 символов
* и не начинается с #group:, то это не группа.
* Однако если ID меньше 16 символов, то это и не
* публичный ключ. Значит скорее всего это ID группы.
*
* Это условие нужно для оптимизации запросов на сервер.
*/
return;
}
setLoading(true);
let packet = new PacketGroupInfo();
packet.setGroupId(normalize(groupId));
send(packet);
}
usePacket(0x12, (packet: PacketGroupInfo) => {
if(packet.getGroupId() != normalize(groupId)){
return;
}
const members = packet.getMembers();
if(members.length <= 0){
setLoading(false);
markAsDeleted();
return;
}
setLoading(false);
setMembers(members);
}, [groupId]);
return {
members,
loading
};
}