From 16dce0447521f00ce385be28ea6125bd336f3326 Mon Sep 17 00:00:00 2001 From: duckietm Date: Fri, 20 Feb 2026 11:49:01 +0100 Subject: [PATCH] =?UTF-8?q?=F0=9F=90=9F=20Fix=20catalog=20index=20and=20st?= =?UTF-8?q?art=20on=20Groupbadges?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/catalog/CatalogView.tsx | 4 +- .../groups/views/GroupRoomInformationView.tsx | 80 +++++++++++++++---- 2 files changed, 68 insertions(+), 16 deletions(-) diff --git a/src/components/catalog/CatalogView.tsx b/src/components/catalog/CatalogView.tsx index d7ee89f..fc5f633 100644 --- a/src/components/catalog/CatalogView.tsx +++ b/src/components/catalog/CatalogView.tsx @@ -72,12 +72,12 @@ export const CatalogView: FC<{}> = props => setIsVisible(false) } /> - { rootNode && (rootNode.children.length > 0) && rootNode.children.map(child => + { rootNode && (rootNode.children.length > 0) && rootNode.children.map((child, index) => { if(!child.isVisible) return null; return ( - + { if(searchResult) setSearchResult(null); diff --git a/src/components/groups/views/GroupRoomInformationView.tsx b/src/components/groups/views/GroupRoomInformationView.tsx index 045d523..267ecf0 100644 --- a/src/components/groups/views/GroupRoomInformationView.tsx +++ b/src/components/groups/views/GroupRoomInformationView.tsx @@ -1,5 +1,5 @@ import { DesktopViewEvent, GetGuestRoomResultEvent, GetSessionDataManager, GroupInformationComposer, GroupInformationEvent, GroupInformationParser, GroupRemoveMemberComposer, HabboGroupDeactivatedMessageEvent, RoomEntryInfoMessageEvent } from '@nitrots/nitro-renderer'; -import { FC, useState } from 'react'; +import { FC, useEffect, useRef, useState } from 'react'; import { FaChevronDown, FaChevronUp } from 'react-icons/fa'; import { GetGroupInformation, GetGroupManager, GroupMembershipType, GroupType, LocalizeText, SendMessageComposer, TryJoinGroup } from '../../../api'; import { Button, Flex, LayoutBadgeImageView, Text } from '../../../common'; @@ -7,21 +7,72 @@ import { useMessageEvent, useNotification } from '../../../hooks'; export const GroupRoomInformationView: FC<{}> = props => { - const [ expectedGroupId, setExpectedGroupId ] = useState(0); + const expectedGroupIdRef = useRef(0); + const requestRetryCountRef = useRef(0); + const requestRetryTimeoutRef = useRef>(null); const [ groupInformation, setGroupInformation ] = useState(null); const [ isOpen, setIsOpen ] = useState(true); const { showConfirm = null } = useNotification(); + const clearRequestRetryTimeout = () => + { + if(!requestRetryTimeoutRef.current) return; + + clearTimeout(requestRetryTimeoutRef.current); + requestRetryTimeoutRef.current = null; + }; + + const scheduleGroupInfoRetry = (groupId: number) => + { + if(requestRetryCountRef.current >= 2) return; + + clearRequestRetryTimeout(); + + requestRetryTimeoutRef.current = setTimeout(() => + { + requestRetryTimeoutRef.current = null; + + if(expectedGroupIdRef.current !== groupId) return; + if(groupInformation && (groupInformation.id === groupId)) return; + + requestRetryCountRef.current++; + SendMessageComposer(new GroupInformationComposer(groupId, false)); + scheduleGroupInfoRetry(groupId); + }, 700); + }; + + const requestGroupInformation = (groupId: number) => + { + if(groupId <= 0) return; + + requestRetryCountRef.current = 0; + clearRequestRetryTimeout(); + + SendMessageComposer(new GroupInformationComposer(groupId, false)); + scheduleGroupInfoRetry(groupId); + }; + + const resetGroupState = () => + { + expectedGroupIdRef.current = 0; + requestRetryCountRef.current = 0; + clearRequestRetryTimeout(); + setGroupInformation(null); + }; + + const setRequestedGroupId = (groupId: number) => + { + expectedGroupIdRef.current = groupId; + }; + useMessageEvent(DesktopViewEvent, event => { - setExpectedGroupId(0); - setGroupInformation(null); + resetGroupState(); }); useMessageEvent(RoomEntryInfoMessageEvent, event => { - setExpectedGroupId(0); - setGroupInformation(null); + resetGroupState(); }); useMessageEvent(GetGuestRoomResultEvent, event => @@ -32,13 +83,12 @@ export const GroupRoomInformationView: FC<{}> = props => if(parser.data.habboGroupId > 0) { - setExpectedGroupId(parser.data.habboGroupId); - SendMessageComposer(new GroupInformationComposer(parser.data.habboGroupId, false)); + setRequestedGroupId(parser.data.habboGroupId); + requestGroupInformation(parser.data.habboGroupId); } else { - setExpectedGroupId(0); - setGroupInformation(null); + resetGroupState(); } }); @@ -46,21 +96,23 @@ export const GroupRoomInformationView: FC<{}> = props => { const parser = event.getParser(); - if(!groupInformation || ((parser.groupId !== groupInformation.id) && (parser.groupId !== expectedGroupId))) return; + if(!groupInformation || ((parser.groupId !== groupInformation.id) && (parser.groupId !== expectedGroupIdRef.current))) return; - setExpectedGroupId(0); - setGroupInformation(null); + resetGroupState(); }); useMessageEvent(GroupInformationEvent, event => { const parser = event.getParser(); - if(parser.id !== expectedGroupId) return; + if(parser.id !== expectedGroupIdRef.current) return; + clearRequestRetryTimeout(); setGroupInformation(parser); }); + useEffect(() => () => clearRequestRetryTimeout(), []); + const leaveGroup = () => { showConfirm(LocalizeText('group.leaveconfirm.desc'), () =>