Skip to main content
Quick Reference for AI Agents & Developers
// Configure presence during init
const appSettings = new CometChat.AppSettingsBuilder()
  .subscribePresenceForAllUsers()  // or subscribePresenceForRoles(["admin"])
  .setRegion(region)
  .build();
await CometChat.init(appID, appSettings);

// Listen for presence changes
CometChat.addUserListener("PRESENCE_LISTENER", new CometChat.UserListener({
  onUserOnline: (user) => console.log(user.getName(), "is online"),
  onUserOffline: (user) => {
    console.log(user.getName(), "went offline");
    console.log("Last seen:", user.getLastActiveAt());
  }
}));

// Check user status
const user = await CometChat.getUser("user_uid");
const status = user.getStatus();  // "online" or "offline"
const lastActive = user.getLastActiveAt();  // Unix timestamp
User presence shows whether users are currently online and available to chat. CometChat provides real-time presence updates and last-seen timestamps.
Availability: SDK, API, UI KitsPresence must be configured during SDK initialization.

Configure Presence Subscription

Set up presence subscription when initializing the SDK using AppSettingsBuilder:
const appSettings = new CometChat.AppSettingsBuilder()
  .subscribePresenceForAllUsers()
  .setRegion(region)
  .autoEstablishSocketConnection(true)
  .build();

CometChat.init(appID, appSettings);
MethodDescription
subscribePresenceForAllUsers()Receive presence for all users
subscribePresenceForRoles(roles)Receive presence for users with specific roles
subscribePresenceForFriends()Receive presence for friends only
If no presence method is called, no presence updates will be received.

Listen for Presence Changes

Register a listener to receive real-time presence updates:
const listenerID = "PRESENCE_LISTENER";

CometChat.addUserListener(
  listenerID,
  new CometChat.UserListener({
    onUserOnline: (user) => {
      console.log(`${user.getName()} is now online`);
    },
    onUserOffline: (user) => {
      console.log(`${user.getName()} went offline`);
      console.log("Last seen:", user.getLastActiveAt());
    }
  })
);

Remove Listener

CometChat.removeUserListener("PRESENCE_LISTENER");

Check User Status

When fetching users, check their presence status:
const user = await CometChat.getUser("user1");

// Get current status
const status = user.getStatus();  // "online" or "offline"

// Get last active timestamp (when offline)
const lastActive = user.getLastActiveAt();

if (status === "online") {
  console.log("User is online");
} else {
  const lastSeen = new Date(lastActive * 1000);
  console.log("Last seen:", lastSeen.toLocaleString());
}

User Status Properties

PropertyTypeDescription
statusString"online" or "offline"
lastActiveAtNumberUnix timestamp of last activity

Implementation Example

class PresenceManager {
  constructor() {
    this.onlineUsers = new Set();
    this.listenerID = "presence-manager";
  }

  initialize() {
    CometChat.addUserListener(
      this.listenerID,
      new CometChat.UserListener({
        onUserOnline: (user) => this.handleOnline(user),
        onUserOffline: (user) => this.handleOffline(user)
      })
    );
  }

  handleOnline(user) {
    this.onlineUsers.add(user.getUid());
    this.updateUI(user.getUid(), "online");
  }

  handleOffline(user) {
    this.onlineUsers.delete(user.getUid());
    this.updateUI(user.getUid(), "offline", user.getLastActiveAt());
  }

  isOnline(uid) {
    return this.onlineUsers.has(uid);
  }

  updateUI(uid, status, lastActive = null) {
    // Update your UI here
    console.log(`${uid} is now ${status}`);
    if (lastActive) {
      console.log("Last seen:", new Date(lastActive * 1000));
    }
  }

  formatLastSeen(timestamp) {
    if (!timestamp) return "Unknown";
    
    const now = Date.now();
    const diff = now - timestamp * 1000;
    
    const minutes = Math.floor(diff / 60000);
    const hours = Math.floor(diff / 3600000);
    const days = Math.floor(diff / 86400000);
    
    if (minutes < 1) return "Just now";
    if (minutes < 60) return `${minutes}m ago`;
    if (hours < 24) return `${hours}h ago`;
    return `${days}d ago`;
  }

  cleanup() {
    CometChat.removeUserListener(this.listenerID);
  }
}

// Usage
const presenceManager = new PresenceManager();
presenceManager.initialize();

// Check if user is online
if (presenceManager.isOnline("user123")) {
  console.log("User is online");
}

// Cleanup when done
presenceManager.cleanup();

Display Presence Indicator

function getPresenceIndicator(user) {
  const status = user.getStatus();
  
  if (status === "online") {
    return {
      color: "green",
      text: "Online"
    };
  }
  
  const lastActive = user.getLastActiveAt();
  const lastSeen = formatLastSeen(lastActive);
  
  return {
    color: "gray",
    text: `Last seen ${lastSeen}`
  };
}

function formatLastSeen(timestamp) {
  if (!timestamp) return "Unknown";
  
  const now = Date.now();
  const diff = now - timestamp * 1000;
  const minutes = Math.floor(diff / 60000);
  
  if (minutes < 1) return "just now";
  if (minutes < 60) return `${minutes} min ago`;
  if (minutes < 1440) return `${Math.floor(minutes / 60)} hours ago`;
  return new Date(timestamp * 1000).toLocaleDateString();
}

Best Practices

  • Use role-based or friends-only presence for large apps
  • subscribePresenceForAllUsers() can be resource-intensive with many users
  • Remove listeners when components unmount
  • Show green dot for online users
  • Display “Last seen” for offline users
  • Update presence indicators in real-time
  • Consider showing “typing…” instead of “online” when user is typing
  • Some users may prefer to hide their online status
  • Consider adding presence privacy settings in your app

Next Steps