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.
Set up presence subscription when initializing the SDK using AppSettingsBuilder:
All Users
By Roles
Friends Only
const appSettings = new CometChat . AppSettingsBuilder ()
. subscribePresenceForAllUsers ()
. setRegion ( region )
. autoEstablishSocketConnection ( true )
. build ();
CometChat . init ( appID , appSettings );
const appSettings = new CometChat . AppSettingsBuilder ()
. subscribePresenceForRoles ([ "admin" , "moderator" ])
. setRegion ( region )
. autoEstablishSocketConnection ( true )
. build ();
CometChat . init ( appID , appSettings );
const appSettings = new CometChat . AppSettingsBuilder ()
. subscribePresenceForFriends ()
. setRegion ( region )
. autoEstablishSocketConnection ( true )
. build ();
CometChat . init ( appID , appSettings );
Method Description 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 ());
}
})
);
const listenerID : string = "PRESENCE_LISTENER" ;
CometChat . addUserListener (
listenerID ,
new CometChat . UserListener ({
onUserOnline : ( user : CometChat . User ) => {
console . log ( ` ${ user . getName () } is now online` );
},
onUserOffline : ( user : CometChat . 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
Property Type Description statusString "online" or "offline"lastActiveAtNumber Unix 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
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