WebSockets enable bidirectional communication for real-time features.
Code:
1import { useState, useEffect, useRef } from "react";23function useWebSocket(url: string) {4 const [messages, setMessages] = useState<string[]>([]);5 const [connected, setConnected] = useState(false);6 const wsRef = useRef<WebSocket | null>(null);78 useEffect(() => {9 const ws = new WebSocket(url);10 wsRef.current = ws;1112 ws.onopen = () => setConnected(true);13 ws.onclose = () => setConnected(false);14 ws.onmessage = (event) => {15 setMessages(prev => [...prev, event.data]);16 };1718 return () => ws.close();19 }, [url]);2021 const send = (message: string) => {22 wsRef.current?.send(message);23 };2425 return { messages, connected, send };26}2728function ChatRoom() {29 const { messages, connected, send } = useWebSocket("ws://localhost:3000/chat");30 const [input, setInput] = useState("");3132 const handleSubmit = (e) => {33 e.preventDefault();34 send(input);35 setInput("");36 };3738 return (39 <div>40 <div className="status">{connected ? "Connected" : "Disconnected"}</div>41 <div className="messages">42 {messages.map((msg, i) => <div key={i}>{msg}</div>)}43 </div>44 <form onSubmit={handleSubmit}>45 <input value={input} onChange={e => setInput(e.target.value)} />46 <button type="submit">Send</button>47 </form>48 </div>49 );50}
With reconnection:
1function useWebSocketWithReconnect(url: string, maxRetries = 5) {2 const [messages, setMessages] = useState<string[]>([]);3 const retriesRef = useRef(0);45 useEffect(() => {6 let ws: WebSocket;78 const connect = () => {9 ws = new WebSocket(url);1011 ws.onopen = () => {12 retriesRef.current = 0;13 };1415 ws.onmessage = (event) => {16 setMessages(prev => [...prev, event.data]);17 };1819 ws.onclose = () => {20 if (retriesRef.current < maxRetries) {21 retriesRef.current++;22 setTimeout(connect, 1000 * retriesRef.current);23 }24 };25 };2627 connect();28 return () => ws?.close();29 }, [url, maxRetries]);3031 return messages;32}