Skip to content

Instantly share code, notes, and snippets.

@RStankov
Created October 30, 2020 13:19
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save RStankov/b982146709878c469fd3aad165206f51 to your computer and use it in GitHub Desktop.
Save RStankov/b982146709878c469fd3aad165206f51 to your computer and use it in GitHub Desktop.
import * as React from 'react';
import mitt from 'mitt';
type IEventName =
| 'CommentCreated'
| 'CommentDestroy'
type IEventPaload = any;
type IEventHandler = (payload: IEventPaload) => void;
interface IEmitter {
emit: (eventName: IEventName, payload: IEventPaload) => void;
on: (eventName: IEventName, handler: IEventHandler) => void;
off: (eventName: IEventName, handler: IEventHandler) => void;
}
const Context = React.createContext<IEmitter>({
emit: () => undefined,
on: () => undefined,
off: () => undefined,
});
interface IProps {
children: React.ReactNode;
}
function createEmitter(): IEmitter {
return mitt() as any;
}
export function EvenBusProvider({ children }: IProps) {
const emitter = React.useMemo(createEmitter, []);
return <Context.Provider value={emitter}>{children}</Context.Provider>;
}
export function useEventEmit() {
return React.useContext(Context).emit;
}
export function useEventListener(
eventName: IEventName,
handler: IEventHandler,
) {
const emitter = React.useContext(Context);
React.useEffect(() => {
emitter.on(eventName, handler);
return () => emitter.off(eventName, handler);
}, [eventName, handler]);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment