This commit is contained in:
rosetta
2026-01-30 05:01:05 +02:00
commit 83f38dc63f
327 changed files with 18725 additions and 0 deletions

View File

@@ -0,0 +1,69 @@
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
};
}