const { triggerReaction, activeEffect, canTrigger, isCoolingDown } = useReactionSync({
localUserId: user.email,
isOwner: true,
permission: 'owner-only',
});
// Trigger a reaction
triggerReaction('heart');
// Render the active effect
<ReactionsOverlay activeEffect={activeEffect} onEffectComplete={clearEffect} />
Core hook for sending and receiving reaction effects in a room.
Routes reaction events over the semantic relay (low-latency QUIC datagrams). Listens for incoming reactions from other participants and fires the active-effect lifecycle. Handles permission enforcement and cooldown throttling locally; delivery dedup + self-message filtering is provided by
useRelaySubProtocolso this hook stays small.