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("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 }; }