@adyen/react-native
Version:
Wraps Adyen Checkout Drop-In and Components for iOS and Android for convenient use with React Native
45 lines (44 loc) • 1.8 kB
JavaScript
;
import { useCallback, useEffect, useRef } from 'react';
import { EmbeddedComponentBus } from '../modules/embedded/EmbeddedComponentBus';
import { EmbeddedComponentProxy } from '../modules/embedded/EmbeddedComponentProxy';
import { startEventListeners } from '../components/utils/startEventListeners';
export function useSubscriptionManager(eventHandlerRefs) {
const subscriptions = useRef(new Map());
const removeEventListeners = useCallback(nativeComponent => {
const listeners = subscriptions.current.get(nativeComponent.name) ?? [];
listeners.forEach(s => s.remove());
subscriptions.current.delete(nativeComponent.name);
}, []);
const storeEventListeners = useCallback((nativeComponent, listeners) => {
subscriptions.current.set(nativeComponent.name, listeners);
}, []);
const subscribe = useCallback(viewId => {
if (subscriptions.current.has(viewId)) return;
EmbeddedComponentBus.subscribe(viewId);
const proxy = new EmbeddedComponentProxy(EmbeddedComponentBus, viewId);
const bag = startEventListeners(proxy, eventHandlerRefs, viewId);
subscriptions.current.set(viewId, bag);
}, [eventHandlerRefs]);
const unsubscribe = useCallback(viewId => {
const bag = subscriptions.current.get(viewId);
bag?.forEach(s => s.remove());
subscriptions.current.delete(viewId);
EmbeddedComponentBus.unsubscribe(viewId);
}, []);
function cleanup() {
subscriptions.current.forEach((listeners, viewId) => {
listeners.forEach(s => s.remove());
EmbeddedComponentBus.unsubscribe(viewId);
});
subscriptions.current.clear();
}
useEffect(() => cleanup, []);
return {
subscribe,
unsubscribe,
removeEventListeners,
storeEventListeners
};
}
//# sourceMappingURL=useSubscriptionManager.js.map