5180 fichiers 38.5 Mo 0 téléchargements 206 vues mis à jour il y a 5 heures ui
nitro-v36-with-renderer-v36 / src / hooks / groups / useUserGroups.ts
useUserGroups.ts 1.7 Ko Télécharger le fichier
import { CatalogGroupsComposer, GroupPurchasedEvent, GuildMembershipsMessageEvent, HabboGroupEntryData } from '@octane/renderer';
import { useCallback, useEffect, useRef, useState } from 'react';
import { registerSharedHook, useSharedHook } from '@/state/useSharedHook';
import { SendMessageComposer } from '../../api';
import { useMessageEvent } from '../events';

/** AIR UsersInGroup: the memberships are asked for again at most once per 5 s. */
export const USER_GROUPS_REFRESH_MS = 5000;

export const useUserGroupsStore = () => {
    const [groups, setGroups] = useState<HabboGroupEntryData[]>([]);
    const lastRequestRef = useRef<number>(null);

    const request = useCallback(() => {
        lastRequestRef.current = Date.now();
        SendMessageComposer(new CatalogGroupsComposer());
    }, []);

    const refresh = useCallback(() => {
        if (lastRequestRef.current !== null && Date.now() - lastRequestRef.current < USER_GROUPS_REFRESH_MS) return;

        request();
    }, [request]);

    const onGuildMemberships = useCallback((event: GuildMembershipsMessageEvent) => {
        setGroups(event.getParser()?.groups || []);
    }, []);

    useMessageEvent<GuildMembershipsMessageEvent>(GuildMembershipsMessageEvent, onGuildMemberships);

    // A new group is a new membership.
    useMessageEvent<GroupPurchasedEvent>(GroupPurchasedEvent, request);

    useEffect(() => {
        request();
    }, [request]);

    return { groups, refresh };
};

export const useUserGroups = (): { data: HabboGroupEntryData[]; refresh: () => void } => {
    const { groups, refresh } = useSharedHook(useUserGroupsStore);

    return { data: groups, refresh };
};

registerSharedHook(useUserGroupsStore);
15Sujets
1Dépôts
20Membres
2En ligne
Profile
Inscrit
Dernière visite
Messages
0
Votes positifs
0
Votes négatifs
0

Nous utilisons des cookies pour assurer le bon fonctionnement du site et améliorer votre expérience. en savoir plus

Autoriser