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.         // Quando il WebSocket è aperto, aggiorniamo lo stato con la connessione attiva
  15.         ws.onopen = () => {
  16.             setSocket(ws);
  17.         };
  18.  
  19.         ws.onmessage = (event) => {
  20.             const data = JSON.parse(event.data);
  21.  
  22.             switch (data.type) {
  23.                 case 'message':
  24.                     setMessages((prev) => [...prev, data]);
  25.  
  26.                     // Notifica all'admin che il messaggio è stato letto, solo se il socket è aperto
  27.                     if (ws && ws.readyState === WebSocket.OPEN) {
  28.                         ws.send(JSON.stringify({ type: 'message_read' }));
  29.                     }
  30.                     break;
  31.  
  32.                 case 'message_read':
  33.                     setMessages((prev) => [
  34.                         ...prev,
  35.                         { message: "Message read", sender_role: "system" },
  36.                     ]);
  37.                     break;
  38.  
  39.                 case 'typing':
  40.                     setTypingStatus('Admin is typing...');
  41.                     if (typingTimeout.current) clearTimeout(typingTimeout.current);
  42.                     typingTimeout.current = setTimeout(() => setTypingStatus(''), 3000);
  43.                     break;
  44.  
  45.                 default:
  46.                     console.warn("Unknown message type:", data.type);
  47.             }
  48.         };
  49.  
  50.         return () => ws.close();
  51.     }, []);
  52.  
  53.     const sendMessage = () => {
  54.         if (socket && socket.readyState === WebSocket.OPEN && message.trim() !== '') {
  55.             socket.send(JSON.stringify({ type: 'message', message }));
  56.             setMessages((prev) => [
  57.                 ...prev,
  58.                 { message, sender_role: 'client' },
  59.             ]);
  60.             setMessage('');
  61.         }
  62.     };
  63.  
  64.     const handleTyping = () => {
  65.         if (socket && socket.readyState === WebSocket.OPEN) {
  66.             socket.send(JSON.stringify({ type: 'typing' }));
  67.         }
  68.     };
  69.  
  70.     return (
  71.         <div>
  72.             <h1>Client Chat</h1>
  73.             <div style={{ height: '200px', overflowY: 'auto', border: '1px solid #ccc', padding: '10px' }}>
  74.                 {messages.map((msg, index) => (
  75.                     <p key={index}>
  76.                         {msg.sender_role === 'system' ? (
  77.                             <span style={{ fontStyle: 'italic', color: 'gray' }}>{msg.message}</span>
  78.                         ) : (
  79.                             <>
  80.                                 <strong>{msg.sender_role === 'admin' ? 'Admin' : 'You'}:</strong> {msg.message}
  81.                             </>
  82.                         )}
  83.                     </p>
  84.                 ))}
  85.                 {typingStatus && (
  86.                     <p style={{ fontStyle: 'italic', color: 'gray' }}>{typingStatus}</p>
  87.                 )}
  88.             </div>
  89.             <input
  90.                 type="text"
  91.                 value={message}
  92.                 onChange={(e) => {
  93.                     setMessage(e.target.value);
  94.                     handleTyping();
  95.                 }}
  96.                 placeholder="Type your message"
  97.             />
  98.             <button onClick={sendMessage}>Send</button>
  99.         </div>
  100.     );
  101. };
  102.  
  103. export default ChatClient;
  104.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement