top of page

Just Jolly Functions

Functions: Creating a Real-Time Chat Widget with HTML, CSS, and JavaScript

A Real-Time Chat Widget allows users to communicate with support agents, bots, or other users instantly through a small chat window embedded on a website. This widget is typically used for customer support, online sales, and user engagement, helping to answer queries, provide information, or guide users in real-time.


Tech Stack:

  • HTML for structuring the chat widget.

  • CSS for styling the chat interface to make it visually appealing.

  • JavaScript for adding interactivity, such as sending and receiving messages.

  • WebSockets or Firebase for enabling real-time communication between the user and the support agent or bot.


Features:

  • Real-Time Messaging: Communication happens instantly between users and support agents or bots, with messages appearing in the chat window without the need to refresh the page.

  • Minimalist Interface: The chat widget is embedded within a small area, ensuring it doesn’t take up much screen space but remains accessible when needed.

  • Typing Indicator: Shows when someone is typing a message in real-time.

  • Message History: Displays a scrollable history of messages sent and received.

  • Send Button: Users can click a button to send messages, ensuring easy interaction.

  • Bot Integration (Optional): Can be integrated with a bot for automated responses or escalated to a live agent if necessary.

  • Close/Minimize Button: Allows users to minimize or close the chat window when it's not in use.


Tips:

Real-Time Chat Widget with HTML, CSS, and JavaScript all integrated into a single file:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Real-Time Chat Widget</title>
  <style>
    /* Basic Styling for Chat Widget */
    body {
      font-family: Arial, sans-serif;
    }

    .chat-widget {
      position: fixed;
      bottom: 20px;
      right: 20px;
      width: 300px;
      background-color: #fff;
      box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
      border-radius: 8px;
      display: flex;
      flex-direction: column;
      padding: 10px;
      z-index: 9999;
    }

    .chat-header {
      display: flex;
      justify-content: space-between;
      align-items: center;
      font-weight: bold;
      margin-bottom: 10px;
    }

    .chat-header button {
      background: transparent;
      border: none;
      font-size: 18px;
      cursor: pointer;
    }

    .chat-messages {
      flex: 1;
      overflow-y: auto;
      padding-right: 10px;
      height: 200px;
      margin-bottom: 10px;
    }

    .chat-messages p {
      margin: 5px 0;
      color: #333;
    }

    #message-input {
      width: calc(100% - 20px);
      padding: 10px;
      border: 1px solid #ddd;
      border-radius: 4px;
      margin-bottom: 10px;
    }

    #send-btn {
      padding: 10px;
      background-color: #4CAF50;
      color: #fff;
      border: none;
      border-radius: 4px;
      cursor: pointer;
    }

    #send-btn:hover {
      background-color: #45a049;
    }
  </style>
</head>
<body>

  <!-- Chat Widget -->
  <div id="chat-widget" class="chat-widget">
    <div class="chat-header">
      <span>Customer Support</span>
      <button id="close-btn">X</button>
    </div>
    <div id="messages" class="chat-messages"></div>
    <input type="text" id="message-input" placeholder="Type a message...">
    <button id="send-btn">Send</button>
  </div>

  <script>
    // Initialize WebSocket for real-time communication
    const socket = new WebSocket("ws://your-websocket-server-url"); // Replace with actual WebSocket URL

    // Elements
    const messageInput = document.getElementById("message-input");
    const sendBtn = document.getElementById("send-btn");
    const messagesDiv = document.getElementById("messages");
    const closeBtn = document.getElementById("close-btn");

    // Handle WebSocket messages (e.g., responses from the server)
    socket.onmessage = function(event) {
      const messageData = JSON.parse(event.data);
      const messageElement = document.createElement("p");
      messageElement.textContent = messageData.message;
      messagesDiv.appendChild(messageElement);
      messagesDiv.scrollTop = messagesDiv.scrollHeight;  // Auto-scroll to the latest message
    };

    // Send message when the Send button is clicked
    sendBtn.addEventListener("click", function() {
      const message = messageInput.value;
      if (message.trim() !== "") {
        const messageData = { message: message, sender: "user" };
        socket.send(JSON.stringify(messageData));
        messageInput.value = ""; // Clear input field
        const messageElement = document.createElement("p");
        messageElement.textContent = `You: ${message}`;
        messagesDiv.appendChild(messageElement);
        messagesDiv.scrollTop = messagesDiv.scrollHeight;  // Auto-scroll to the latest message
      }
    });

    // Close the chat widget when the close button is clicked
    closeBtn.addEventListener("click", function() {
      document.getElementById("chat-widget").style.display = "none";
    });
  </script>

</body>
</html>

Explanation:

  • HTML Structure: This code creates a basic chat widget with a header, messages container, input field, and send button. It also includes a close button to hide the widget.

  • CSS Styling: The styling gives the chat widget a fixed position at the bottom-right of the page, a clean design, and a responsive layout.

  • JavaScript for Real-Time Communication:

    • A WebSocket connection is established to communicate with the server (replace ws://your-websocket-server-url with your actual WebSocket URL).

    • The messages are sent to the server and received back. They are displayed in the chat window with auto-scrolling to ensure the latest message is always visible.

    • The close button hides the chat widget when clicked.


How to Use:

  1. Replace ws://your-websocket-server-url in the JavaScript code with your actual WebSocket server URL (you'll need a WebSocket server to handle this communication).

  2. Open the HTML file in a browser to test the chat widget.

  3. If you don't have a WebSocket server, you can implement one in Node.js using libraries like ws (as shown in previous examples) or integrate with services like Firebase or Pusher for real-time messaging.


Optional Improvements:

  1. Bot Integration:

    • You can integrate a bot for automated responses when no agent is available. This can be done by adding conditional logic on the server side to handle specific user queries.

  2. User Authentication:

    • You can implement user login or guest login systems to identify different users. This can be done via a backend server and using Firebase Authentication or JWT tokens.

  3. Typing Indicator:

    • A "typing" indicator can be shown when the other party is typing. This can be implemented by emitting a "typing" event when the user starts typing and broadcasting it to other connected clients.

  4. Message History:

    • Store the conversation history on the server or Firebase so that users can review their past conversations. This also allows resuming chats after a disconnect.

  5. Notifications:

    • If the chat widget is minimized, show a notification for new incoming messages. This can alert the user to open the widget for a new message.

  6. Improved UI/UX:

    • Use emoji support, rich text (like bold, italics, etc.), or even file attachments to enhance the chat functionality.

    • For mobile users, ensure that the UI adapts appropriately for smaller screens.

  7. Persistent WebSocket Connection:

    • If the WebSocket connection gets interrupted, make sure it reconnects automatically. You can implement this logic by checking the connection status and reconnecting when necessary.


This is a simple implementation, and you can enhance it by adding features like message history, typing indicators, or even integrating a bot for automated responses.

bottom of page