Saltar al contenido principal
Version: Próxima (sin publicar)

EventContext

Una función factory que crea un sistema pub/sub completamente tipado basado en React Context. Importalo desde el punto de entrada dedicado:

import { factory } from "@julianfere/hooked/events";

factory<AppEvents>()

function factory<AppEvents extends Record<string, any>>(): {
createEventContext: () => Context<IEventContext<AppEvents>>;
createEventProvider: (ctx: Context<IEventContext<AppEvents>>) =>
({ children }: PropsWithChildren) => JSX.Element;
createEventHook: (ctx: Context<IEventContext<AppEvents>>) =>
() => IEventContext<AppEvents>;
}

El genérico AppEvents define el mapa de eventos — las claves son nombres de evento, los valores son sus tipos de payload.

Configuración (una sola vez)

// events.ts
import { factory } from "@julianfere/hooked/events";

interface AppEvents {
usuarioLogueado: { id: string; nombre: string };
usuarioDeslogueado: never;
carritoActualizado: { cantidadItems: number };
}

const { createEventContext, createEventProvider, createEventHook } =
factory<AppEvents>();

export const EventCtx = createEventContext();
export const EventsProvider = createEventProvider(EventCtx);
export const useEvents = createEventHook(EventCtx);

Envolvé tu app

// main.tsx
import { EventsProvider } from "./events";

<EventsProvider>
<App />
</EventsProvider>

Uso en componentes

import { useEvents } from "./events";

function BotonLogin() {
const { publish } = useEvents();

return (
<button onClick={() => publish("usuarioLogueado", { id: "1", nombre: "Alice" })}>
Iniciar sesión
</button>
);
}

function Navbar() {
const { subscribe } = useEvents();

useEffect(() => {
const unsub = subscribe("usuarioLogueado", ({ nombre }) => {
console.log(`¡Bienvenido, ${nombre}!`);
});
return unsub; // desuscribe al desmontar
}, [subscribe]);

return <nav></nav>;
}

API del hook

MétodoFirmaDescripción
publish(eventName, payload) => voidEmite un evento a todos los suscriptores actuales
subscribe(eventName, callback) => () => voidRegistra un listener. Devuelve una función de desuscripción

Manejo de errores

useEvents() lanza un error si se usa fuera de su EventsProvider. Siempre asegurate de que el provider envuelva a todos los componentes que usen el hook.

Ejemplo interactivo

Loading playground...