69 lines
2.6 KiB
TypeScript
69 lines
2.6 KiB
TypeScript
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
|
||
};
|
||
} |