Advertisement
raffaelegriecoit

Untitled

Dec 17th, 2024
32
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. import { useState, useEffect, useRef } from 'react';
  2.  
  3. const ChatClient = () => {
  4.     const [socket, setSocket] = useState(null);
  5.     const [messages, setMessages] = useState([]);
  6.     const [message, setMessage] = useState('');
  7.     const [typingStatus, setTypingStatus] = useState('');
  8.     const typingTimeout = useRef(null);
  9.  
  10.     useEffect(() => {
  11.         const jwt = localStorage.getItem('token');
  12.         const ws = new WebSocket(`ws://localhost:8003/ws/chat/?token=${jwt}`);
  13.  
  14.         ws.onopen = () => {
  15.             console.log("WebSocket connection opened");
  16.             setSocket(ws);
  17.         };
  18.  
  19.         ws.onmessage = (event) => {
  20.             const data = JSON.parse(event.data);
  21.             console.log("Received data from server:", data);
  22.  
  23.             switch (data.type) {
  24.                 case 'message':
  25.                     setMessages((prev) => [...prev, data]);
  26.  
  27.                     if (ws && ws.readyState === WebSocket.OPEN) {
  28.                         console.log("Sending message_read to server...");
  29.                         ws.send(JSON.stringify({ type: 'message_read' }));
  30.                     }
  31.                     break;
  32.  
  33.                 case 'message_read':
  34.                     console.log("Received 'message_read' event from server:", data);
  35.                     setMessages((prev) => [
  36.                         ...prev,
  37.                         { message: "Message read", sender_role: "system" },
  38.                     ]);
  39.                     break;
  40.  
  41.                 case 'typing':
  42.                     console.log("Received 'typing' event from server:", data);
  43.                     setTypingStatus('Admin is typing...');
  44.                     if (typingTimeout.current) clearTimeout(typingTimeout.current);
  45.                     typingTimeout.current = setTimeout(() => setTypingStatus(''), 3000);
  46.                     break;
  47.  
  48.                 default:
  49.                     console.warn("Unknown message type:", data.type);
  50.             }
  51.         };
  52.  
  53.         ws.onclose = () => {
  54.             console.log("WebSocket connection closed");
  55.         };
  56.  
  57.         return () => {
  58.             ws.close();
  59.         };
  60.     }, []);
  61.  
  62.     const sendMessage = () => {
  63.         if (socket && socket.readyState === WebSocket.OPEN && message.trim() !== '') {
  64.             console.log("Sending message to server:", message);
  65.             socket.send(JSON.stringify({ type: 'message', message }));
  66.             setMessages((prev) => [
  67.                 ...prev,
  68.                 { message, sender_role: 'client' },
  69.             ]);
  70.             setMessage('');
  71.         } else {
  72.             console.log("Socket not open or message empty, not sending.");
  73.         }
  74.     };
  75.  
  76.     const handleTyping = () => {
  77.         if (socket && socket.readyState === WebSocket.OPEN) {
  78.             console.log("Sending typing notification to server...");
  79.             socket.send(JSON.stringify({ type: 'typing' }));
  80.         }
  81.     };
  82.  
  83.     return (
  84.         <div>
  85.             <h1>Client Chat</h1>
  86.             <div style={{ height: '200px', overflowY: 'auto', border: '1px solid #ccc', padding: '10px' }}>
  87.                 {messages.map((msg, index) => (
  88.                     <p key={index}>
  89.                         {msg.sender_role === 'system' ? (
  90.                             <span style={{ fontStyle: 'italic', color: 'gray' }}>{msg.message}</span>
  91.                         ) : (
  92.                             <>
  93.                                 <strong>{msg.sender_role === 'admin' ? 'Admin' : 'You'}:</strong> {msg.message}
  94.                             </>
  95.                         )}
  96.                     </p>
  97.                 ))}
  98.                 {typingStatus && (
  99.                     <p style={{ fontStyle: 'italic', color: 'gray' }}>{typingStatus}</p>
  100.                 )}
  101.             </div>
  102.             <input
  103.                 type="text"
  104.                 value={message}
  105.                 onChange={(e) => {
  106.                     setMessage(e.target.value);
  107.                     handleTyping();
  108.                 }}
  109.                 placeholder="Type your message"
  110.             />
  111.             <button onClick={sendMessage}>Send</button>
  112.         </div>
  113.     );
  114. };
  115.  
  116. export default ChatClient;
  117.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement