5180 fichiers 38.5 Mo 0 téléchargements 249 vues mis à jour il y a 5 heures ui
nitro-v36-with-renderer-v36 / src / hooks / inventory / useInventoryNickIcons.ts
useInventoryNickIcons.ts 2.5 Ko Télécharger le fichier
import { RequestNickIconsComposer, SetActiveNickIconComposer, UserNickIconsEvent } from '@octane/renderer';
import { useEffect, useState } from 'react';
import { registerSharedHook, useSharedHook } from '@/state/useSharedHook';
import { INickIconItem, SendMessageComposer } from '../../api';
import { useMessageEvent } from '../events';
import { useSharedVisibility } from '../useSharedVisibility';

const useInventoryNickIconsState = () => {
    const [needsUpdate, setNeedsUpdate] = useState(true);
    const [nickIcons, setNickIcons] = useState<INickIconItem[]>([]);
    const [activeNickIcon, setActiveNickIcon] = useState<INickIconItem | null>(null);
    const [selectedNickIcon, setSelectedNickIcon] = useState<INickIconItem | null>(null);
    const { isVisible = false, activate = null, deactivate = null } = useSharedVisibility();

    useMessageEvent<UserNickIconsEvent>(UserNickIconsEvent, (event) => {
        const parser = event.getParser();
        const ownedNickIcons = parser.nickIcons
            .filter((icon) => icon.owned)
            .map((icon) => ({
                id: icon.id,
                iconKey: icon.iconKey,
                displayName: icon.displayName,
                points: icon.points,
                pointsType: icon.pointsType,
                owned: true,
                active: icon.active
            }));

        setNickIcons(ownedNickIcons);
        setActiveNickIcon(ownedNickIcons.find((icon) => icon.active) || null);
    });

    const activateNickIcon = (nickIconId: number) => {
        SendMessageComposer(new SetActiveNickIconComposer(nickIconId));
    };

    const deactivateNickIcon = () => {
        SendMessageComposer(new SetActiveNickIconComposer(0));
    };

    useEffect(() => {
        if (!nickIcons.length) {
            setSelectedNickIcon(null);
            return;
        }

        setSelectedNickIcon((prevValue) => {
            if (prevValue && nickIcons.find((icon) => icon.id === prevValue.id)) return prevValue;
            return nickIcons[0];
        });
    }, [nickIcons]);

    useEffect(() => {
        if (!isVisible || !needsUpdate) return;

        SendMessageComposer(new RequestNickIconsComposer());
        setNeedsUpdate(false);
    }, [isVisible, needsUpdate]);

    return {
        nickIcons,
        activeNickIcon,
        selectedNickIcon,
        setSelectedNickIcon,
        activateNickIcon,
        deactivateNickIcon,
        activate,
        deactivate
    };
};

export const useInventoryNickIcons = () => useSharedHook(useInventoryNickIconsState);

registerSharedHook(useInventoryNickIconsState);
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