evently-react
Version:
A Hook-Based Framework for Event-Driven React Apps
38 lines (37 loc) • 1.52 kB
JavaScript
import { useContext, useEffect, useState } from 'react';
import { EventContext } from '../context';
import { Logger } from '../utils';
/**
* useSubscribeState hook to listen for specific events and track the latest event payload as state.
* @param eventName The name of the event to subscribe to.
* @returns The latest payload emitted by the event.
*/
export function useSubscribeState(eventName) {
const eventBus = useContext(EventContext);
const [state, setState] = useState(undefined);
if (!eventBus) {
Logger.error('useSubscribeState must be used within an EventProvider.');
throw new Error('useSubscribeState must be used within an EventProvider.');
}
useEffect(() => {
if (!eventName || typeof eventName !== 'string') {
Logger.error('useSubscribeState: Event name must be a non-empty string.');
throw new Error('useSubscribeState: Event name must be a non-empty string.');
}
try {
// Subscribe to the event and update the state on event emission
const unsubscribe = eventBus.subscribe(eventName, (payload) => {
setState(payload);
});
// Cleanup subscription on unmount
return () => {
unsubscribe();
};
}
catch (error) {
Logger.error(`useSubscribeState: Error subscribing to event "${eventName}":`, error);
throw error;
}
}, [eventName, eventBus]);
return state;
}