'init'
This commit is contained in:
69
app/providers/InformationProvider/useGroupMembers.ts
Normal file
69
app/providers/InformationProvider/useGroupMembers.ts
Normal 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
|
||||
};
|
||||
}
|
||||
Reference in New Issue
Block a user