5180 fichiers 38.5 Mo 0 téléchargements 255 vues mis à jour il y a 5 heures ui
nitro-v36-with-renderer-v36 / src / hooks / events / useEventDispatcher.tsx
useEventDispatcher.tsx 1.1 Ko Télécharger le fichier
import { IEventDispatcher, OctaneEvent } from '@octane/renderer';
import { useEffect, useLayoutEffect, useRef } from 'react';

/**
 * Listens once per set of event types and calls the latest handler. The handler and an inline array of types are new
 * on every render, and keying the listener on them removed and added it at each render.
 */
export const useEventDispatcher = <T extends OctaneEvent>(
    type: string | string[],
    eventDispatcher: IEventDispatcher,
    handler: (event: T) => void,
    enabled: boolean = true
) => {
    const handlerRef = useRef(handler);
    const typesKey = Array.isArray(type) ? type.join('\u0000') : type;

    useLayoutEffect(() => {
        handlerRef.current = handler;
    });

    useEffect(() => {
        if (!enabled || !eventDispatcher) return;

        const types = typesKey.split('\u0000');
        const listener = (event: T) => handlerRef.current(event);

        for (const name of types) eventDispatcher.addEventListener(name, listener);

        return () => {
            for (const name of types) eventDispatcher.removeEventListener(name, listener);
        };
    }, [typesKey, eventDispatcher, enabled]);
};
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