|
1 | 1 | import { useEffect, useRef, useState } from "react"; |
2 | 2 |
|
| 3 | +interface WebSocketMessage { |
| 4 | + type: "welcome" | "message" | "echo"; |
| 5 | + data?: string; |
| 6 | + message?: string; |
| 7 | + timestamp?: number; |
| 8 | +} |
| 9 | + |
3 | 10 | export function useWebSocket() { |
4 | 11 | const [isConnected, setIsConnected] = useState(false); |
5 | 12 | const [messages, setMessages] = useState<string[]>([]); |
6 | 13 | const ws = useRef<WebSocket | null>(null); |
7 | 14 |
|
8 | 15 | useEffect(() => { |
9 | | - ws.current = new WebSocket(process.env.NEXT_PUBLIC_WEBSOCKET_URL); |
| 16 | + const protocol = window.location.protocol === "https:" ? "wss:" : "ws:"; |
| 17 | + const wsUrl = `${protocol}//${window.location.host}/api/ws`; |
| 18 | + |
| 19 | + ws.current = new WebSocket(wsUrl); |
| 20 | + |
| 21 | + ws.current.onopen = () => { |
| 22 | + console.log("WebSocket connected"); |
| 23 | + setIsConnected(true); |
| 24 | + }; |
| 25 | + |
| 26 | + ws.current.onclose = () => { |
| 27 | + console.log("WebSocket disconnected"); |
| 28 | + setIsConnected(false); |
| 29 | + }; |
| 30 | + |
| 31 | + ws.current.onerror = (error) => { |
| 32 | + console.error("WebSocket error:", error); |
| 33 | + setIsConnected(false); |
| 34 | + }; |
10 | 35 |
|
11 | | - ws.current.onopen = () => setIsConnected(true); |
12 | | - ws.current.onclose = () => setIsConnected(false); |
13 | 36 | ws.current.onmessage = (event) => { |
14 | | - setMessages((prev) => [...prev, event.data]); |
| 37 | + try { |
| 38 | + const parsed: WebSocketMessage = JSON.parse(event.data); |
| 39 | + |
| 40 | + if (parsed.type === "welcome") { |
| 41 | + setMessages((prev) => [...prev, `System: ${parsed.message}`]); |
| 42 | + } else if (parsed.type === "message") { |
| 43 | + setMessages((prev) => [...prev, `User: ${parsed.data}`]); |
| 44 | + } else if (parsed.type === "echo") { |
| 45 | + setMessages((prev) => [...prev, `Echo: ${parsed.data}`]); |
| 46 | + } |
| 47 | + } catch { |
| 48 | + // Fallback for non-JSON messages |
| 49 | + setMessages((prev) => [...prev, event.data]); |
| 50 | + } |
15 | 51 | }; |
16 | 52 |
|
17 | | - return () => ws.current?.close(); |
| 53 | + return () => { |
| 54 | + ws.current?.close(); |
| 55 | + }; |
18 | 56 | }, []); |
19 | 57 |
|
20 | 58 | const sendMessage = (message: string) => { |
|
0 commit comments