const { broadcastState } = usePresenterSync({
localUserId: user.id,
isPresenter: true,
enabled: syncEnabled,
});
// In PrebuiltRoom callbacks:
onSidebarOpenChanged={(open) => broadcastState({ sidebarOpen: open })}
onActiveTabChanged={(tab) => broadcastState({ activeTab: tab })}
const { presenterState, isFollowing } = usePresenterSync({
localUserId: user.id,
isPresenter: false,
enabled: true,
});
// Pass controlled props to PrebuiltRoom when following:
controlledSidebarOpen={isFollowing ? presenterState?.sidebarOpen : undefined}
controlledActiveTab={isFollowing ? presenterState?.activeTab : undefined}
Synchronises presenter state across room participants via the semantic relay (low-latency QUIC datagrams).
The presenter broadcasts sidebar / tab / file-open state changes; followers receive and apply them. The relay envelope already carries a
senderIdandmessageId, so this hook delegates self-message filtering andmessageIddedup touseRelaySubProtocol. A separatetimestampcheck inside the payload still drops messages that arrived out-of-order from a slow peer.