@stainless-code/react-custom-events
This library provides utilities to simplify working with custom DOM events in React, allowing you to dispatch and listen for events in a declarative and type-safe manner.
Features
- Typesafe
- Reusable
- Simple API
- Centralised event dispatcher and listener
Installation
npm
npm install @stainless-code/react-custom-events
yarn
yarn add @stainless-code/react-custom-events
pnpm
pnpm add @stainless-code/react-custom-events
bun
bun add @stainless-code/react-custom-events
Usage
1. Basic
import { createCustomEvent } from "@stainless-code/react-custom-events";
const useMyEvent = createCustomEvent<string>("my-event");
function MyComponent() {
useMyEvent((payload) => console.log("Event received with payload:", payload));
return (
<button onClick={() => useMyEvent.dispatch("hello!")}>
Dispatch event
</button>
);
}
2. With options and dependency list
import { createCustomEvent } from "@stainless-code/react-custom-events";
import { useState } from "react";
const useMyEvent = createCustomEvent<string>("my-event");
function MyComponent() {
const [enabled, setEnabled] = useState(true);
useMyEvent(
(payload, event) =>
console.log("Event received with payload:", payload, event),
{
listen: enabled,
onStartListening: () => console.log("Started listening"),
onStopListening: () => console.log("Stopped listening"),
},
[enabled],
);
return (
<>
<button onClick={() => setEnabled(!enabled)}>
{enabled ? "Disable" : "Enable"} event listener
</button>
<button onClick={() => useMyEvent.dispatch("hello!")}>
Dispatch event
</button>
</>
);
}
Typesafety
const useMyEvent = createCustomEvent<string>("my-event");
useMyEvent.dispatch("Valid string payload");
useMyEvent.dispatch(123);
useMyEvent((payload) => {
console.log(payload.toUpperCase());
console.log(payload * 2);
});
API
createCustomEvent()
Creates a custom event with a given name and returns a hook for listening to it and a dispatch function for triggering the event.
eventName | string | The name of the custom event. | (required) |
Returns
useCustomEventListener with eventName prepopulated along with a dispatch method to trigger the event and the eventName property.
useCustomEventListener()
Custom hook to listen for a custom event and handle the payload.
eventName | string | The name of the custom event to listen for. | (required) |
onListen | (payload: Payload, event: CustomEvent<Payload>) => void | Callback to handle the event payload and event object. | (required) |
options (optional) | Object | Additional configuration for the event listener. | { listen: true } |
options.listen | boolean | Whether the listener should be active (default: true). | true |
options.onStartListening | () => void | Callback when the listener starts. | undefined |
options.onStopListening | () => void | Callback when the listener stops. | undefined |
deps (optional) | DependencyList | Dependency list for re-subscribing to the event. | undefined |
Contributing
Feel free to submit issues or PRs to improve the library!
License
MIT