import React, { useEffect, useState } from "react"; import { useChannel } from "../hooks/useChannel"; import { ChannelEvents } from "../../types/events/constants"; /** * Example demonstrating channel pause/resume functionality * * This example shows: * 1. Basic pause/resume controls * 2. Message buffering * 3. Event tracking * 4. Auto-pause on document visibility change */ export function PauseResumeExample() { const { channel, subscribe, pause, resume, paused, clearBufferedMessages, status, } = useChannel("demo-channel"); const [messages, setMessages] = useState([]); const [pauseEvents, setPauseEvents] = useState([]); const [resumeEvents, setResumeEvents] = useState([]); const [bufferMode, setBufferMode] = useState(true); // Subscribe to messages useEffect(() => { if (status === "subscribed") { const handleMessage = (message: any) => { setMessages((prev) => [ ...prev, { ...message, receivedAt: new Date().toISOString(), }, ]); }; subscribe(handleMessage); } }, [status, subscribe]); // Listen to pause/resume events useEffect(() => { if (!channel) return; const handlePaused = (payload: any) => { setPauseEvents((prev) => [ ...prev, { ...payload, timestamp: new Date().toISOString(), }, ]); }; const handleResumed = (payload: any) => { setResumeEvents((prev) => [ ...prev, { ...payload, timestamp: new Date().toISOString(), }, ]); }; channel.on(ChannelEvents.PAUSED, handlePaused); channel.on(ChannelEvents.RESUMED, handleResumed); return () => { channel.off(ChannelEvents.PAUSED, handlePaused); channel.off(ChannelEvents.RESUMED, handleResumed); }; }, [channel]); // Auto-pause when document is hidden useEffect(() => { const handleVisibilityChange = () => { if (!channel) return; if (document.hidden && !paused) { console.log("[Auto] Document hidden - pausing channel"); pause({ bufferMessages: bufferMode }); } else if (!document.hidden && paused) { console.log("[Auto] Document visible - resuming channel"); resume(); } }; document.addEventListener("visibilitychange", handleVisibilityChange); return () => { document.removeEventListener( "visibilitychange", handleVisibilityChange ); }; }, [channel, pause, resume, paused, bufferMode]); const handlePause = () => { pause({ bufferMessages: bufferMode }); }; const handleResume = () => { resume(); }; const handleClearBuffer = () => { clearBufferedMessages(); }; const handleClearMessages = () => { setMessages([]); }; const handleClearEvents = () => { setPauseEvents([]); setResumeEvents([]); }; const lastResumeEvent = resumeEvents[resumeEvents.length - 1]; return (

Channel Pause/Resume Demo

{/* Status Section */}

Status

Channel Status: {status}

Paused:{" "} {paused ? "YES" : "NO"}

Buffer Mode:{" "} {bufferMode ? "Enabled" : "Disabled"}

{lastResumeEvent && (

Last Resume:{" "} {lastResumeEvent.bufferedMessagesDelivered} buffered message(s) delivered

)}
{/* Controls */}

Controls

{bufferMode ? "Messages will be stored and delivered when resumed" : "Messages will be dropped during pause"}

{/* Messages Section */}

Received Messages ({messages.length})

{messages.length === 0 ? (

No messages received yet

) : ( messages.map((msg, idx) => (
{msg.receivedAt}
{JSON.stringify(msg.data)}
)) )}
{/* Events Section */}

Events ({pauseEvents.length + resumeEvents.length})

{pauseEvents.length === 0 && resumeEvents.length === 0 ? (

No events yet

) : ( <> {pauseEvents.map((event, idx) => (
PAUSED - {event.timestamp}
Buffering:{" "} {event.buffering ? "Yes" : "No"}
))} {resumeEvents.map((event, idx) => (
RESUMED - {event.timestamp}
Buffered messages:{" "} {event.bufferedMessagesDelivered}
))} )}
{/* Instructions */}

Try it:

  1. Click "Pause Channel" to pause receiving messages
  2. Publish messages from another client (they'll be buffered)
  3. Click "Resume Channel" to receive all buffered messages at once
  4. Try disabling "Buffer messages" and pausing - messages will be dropped
  5. Switch to another tab - channel auto-pauses (check events)
💡 Tip: Use the reactive{" "} paused state in useEffect dependencies, not{" "} isPaused():
                        {`useEffect(() => {
  console.log('Paused changed:', paused);
}, [paused]); // ✅ Reactive state

// NOT: [isPaused] ❌ Function reference`}
                    
); }