Skip to main content
{
  "component": "CometChatGroupMembers",
  "package": "@cometchat/chat-uikit-react",
  "import": "import { CometChatGroupMembers } from \"@cometchat/chat-uikit-react\";",
  "cssImport": "import \"@cometchat/chat-uikit-react/css-variables.css\";",
  "description": "Scrollable, searchable list of members in a specific group with roles, scopes, online status, and member management actions.",
  "cssRootClass": ".cometchat-group-members",
  "primaryOutput": {
    "prop": "onItemClick",
    "type": "(groupMember: CometChat.GroupMember) => void"
  },
  "props": {
    "data": {
      "group": { "type": "CometChat.Group", "required": true }
    },
    "callbacks": {
      "onItemClick": "(groupMember: CometChat.GroupMember) => void",
      "onSelect": "(groupMember: CometChat.GroupMember, selected: boolean) => void"
    },
    "visibility": {
      "hideSearch": { "type": "boolean", "default": false },
      "hideKickMemberOption": { "type": "boolean", "default": false },
      "hideBanMemberOption": { "type": "boolean", "default": false },
      "hideScopeChangeOption": { "type": "boolean", "default": false }
    }
  }
}

Overview

The Group Members component displays a searchable list of members in a group with their roles, online status, and management actions (kick, ban, change scope). It’s typically shown alongside the group chat. Time estimate: 15 minutes
Difficulty: Beginner

Prerequisites

Steps

Step 1: Display group members

Add the component with a group object:
import { useEffect, useState } from "react";
import { CometChatGroupMembers } from "@cometchat/chat-uikit-react";
import { CometChat } from "@cometchat/chat-sdk-javascript";
import "@cometchat/chat-uikit-react/css-variables.css";

function GroupMembersDemo() {
  const [group, setGroup] = useState<CometChat.Group>();

  useEffect(() => {
    CometChat.getGroup("GROUP_GUID").then(setGroup);
  }, []);

  return group ? (
    <div style={{ width: 320, height: "100vh" }}>
      <CometChatGroupMembers group={group} />
    </div>
  ) : null;
}

export default GroupMembersDemo;
Group members list

Step 2: Integrate with group chat

Show members alongside the message view:
import { useEffect, useState } from "react";
import {
  CometChatGroupMembers,
  CometChatMessageHeader,
  CometChatMessageList,
  CometChatMessageComposer,
} from "@cometchat/chat-uikit-react";
import { CometChat } from "@cometchat/chat-sdk-javascript";
import "@cometchat/chat-uikit-react/css-variables.css";

function GroupChatWithMembers() {
  const [group, setGroup] = useState<CometChat.Group>();

  useEffect(() => {
    CometChat.getGroup("GROUP_GUID").then(setGroup);
  }, []);

  if (!group) return null;

  return (
    <div style={{ display: "flex", height: "100vh", width: "100vw" }}>
      {/* Members panel */}
      <div style={{ width: 300, height: "100%" }}>
        <CometChatGroupMembers group={group} />
      </div>
      
      {/* Chat panel */}
      <div style={{ flex: 1, display: "flex", flexDirection: "column" }}>
        <CometChatMessageHeader group={group} />
        <CometChatMessageList group={group} />
        <CometChatMessageComposer group={group} />
      </div>
    </div>
  );
}

Step 3: Handle member selection

Respond to member clicks and multi-select:
import { useState } from "react";
import {
  CometChatGroupMembers,
  SelectionMode,
} from "@cometchat/chat-uikit-react";
import { CometChat } from "@cometchat/chat-sdk-javascript";

function MemberSelection({ group }: { group: CometChat.Group }) {
  const [selected, setSelected] = useState<Set<string>>(new Set());

  return (
    <>
      <CometChatGroupMembers
        group={group}
        selectionMode={SelectionMode.multiple}
        onItemClick={(member: CometChat.GroupMember) => {
          console.log("Clicked:", member.getName());
        }}
        onSelect={(member: CometChat.GroupMember, isSelected: boolean) => {
          setSelected((prev) => {
            const next = new Set(prev);
            const uid = member.getUid();
            isSelected ? next.add(uid) : next.delete(uid);
            return next;
          });
        }}
      />
      <div>Selected: {selected.size} members</div>
    </>
  );
}

Step 4: Filter members

Show only admins and moderators:
import { CometChatGroupMembers } from "@cometchat/chat-uikit-react";
import { CometChat } from "@cometchat/chat-sdk-javascript";

function AdminMembers({ group }: { group: CometChat.Group }) {
  return (
    <CometChatGroupMembers
      group={group}
      groupMemberRequestBuilder={
        new CometChat.GroupMembersRequestBuilder(group.getGuid())
          .setScopes(["admin", "moderator"])
          .setLimit(20)
      }
    />
  );
}

Step 5: Hide management actions

Create a read-only member list:
import { CometChatGroupMembers } from "@cometchat/chat-uikit-react";
import { CometChat } from "@cometchat/chat-sdk-javascript";

function ReadOnlyMembers({ group }: { group: CometChat.Group }) {
  return (
    <CometChatGroupMembers
      group={group}
      hideSearch={true}
      hideUserStatus={true}
      hideKickMemberOption={true}
      hideBanMemberOption={true}
      hideScopeChangeOption={true}
    />
  );
}

Step 6: Customize member display

Replace the subtitle with join date:
import { CometChat } from "@cometchat/chat-sdk-javascript";
import { CometChatGroupMembers } from "@cometchat/chat-uikit-react";

function CustomSubtitleMembers({ group }: { group: CometChat.Group }) {
  const getSubtitleView = (member: CometChat.GroupMember) => {
    const date = new Date(member.getJoinedAt() * 1000).toLocaleDateString();
    return <div className="member-subtitle">Joined: {date}</div>;
  };

  return (
    <CometChatGroupMembers 
      group={group} 
      subtitleView={getSubtitleView} 
    />
  );
}
Custom subtitle with join date

Step 7: Custom list item

Replace the entire row with a custom design:
import { CometChat } from "@cometchat/chat-sdk-javascript";
import {
  CometChatAvatar,
  CometChatGroupMembers,
} from "@cometchat/chat-uikit-react";

function CustomItemViewMembers({ group }: { group: CometChat.Group }) {
  const getItemView = (member: CometChat.GroupMember) => {
    const scope = member.getScope();
    return (
      <div className="member-item">
        <div className="member-item__avatar">
          <CometChatAvatar image={member.getAvatar()} name={member.getName()} />
        </div>
        <div className="member-item__content">
          <div className="member-item__name">{member.getName()}</div>
          <div className={`member-item__scope member-item__scope--${scope}`}>
            {scope}
          </div>
        </div>
      </div>
    );
  };

  return <CometChatGroupMembers group={group} itemView={getItemView} />;
}
Custom list item design

Complete Example

import { useEffect, useState } from "react";
import {
  CometChatGroupMembers,
  CometChatAvatar,
  SelectionMode,
} from "@cometchat/chat-uikit-react";
import { CometChat } from "@cometchat/chat-sdk-javascript";
import "@cometchat/chat-uikit-react/css-variables.css";

function GroupMembersPanel() {
  const [group, setGroup] = useState<CometChat.Group>();
  const [selectedMembers, setSelectedMembers] = useState<CometChat.GroupMember[]>([]);

  useEffect(() => {
    CometChat.getGroup("YOUR_GROUP_GUID").then(setGroup);
  }, []);

  const handleMemberClick = (member: CometChat.GroupMember) => {
    console.log("View profile:", member.getName());
  };

  const handleSelect = (member: CometChat.GroupMember, isSelected: boolean) => {
    setSelectedMembers((prev) =>
      isSelected
        ? [...prev, member]
        : prev.filter((m) => m.getUid() !== member.getUid())
    );
  };

  if (!group) return <div>Loading...</div>;

  return (
    <div style={{ width: 320, height: "100vh" }}>
      <CometChatGroupMembers
        group={group}
        selectionMode={SelectionMode.multiple}
        onItemClick={handleMemberClick}
        onSelect={handleSelect}
        onError={(error) => console.error("Error:", error)}
        onEmpty={() => console.log("No members found")}
        subtitleView={(member) => (
          <span style={{ color: "#666", fontSize: 12 }}>
            Joined {new Date(member.getJoinedAt() * 1000).toLocaleDateString()}
          </span>
        )}
      />
      
      {selectedMembers.length > 0 && (
        <div style={{ padding: 16, borderTop: "1px solid #e8e8e8" }}>
          <button onClick={() => console.log("Action on", selectedMembers.length, "members")}>
            Perform action on {selectedMembers.length} selected
          </button>
        </div>
      )}
    </div>
  );
}

export default GroupMembersPanel;
Add custom actions to the member options menu:
import { CometChat } from "@cometchat/chat-sdk-javascript";
import {
  CometChatGroupMembers,
  CometChatOption,
} from "@cometchat/chat-uikit-react";

function CustomOptionsMembers({ group }: { group: CometChat.Group }) {
  return (
    <CometChatGroupMembers
      group={group}
      options={(g: CometChat.Group, member: CometChat.GroupMember) => [
        new CometChatOption({
          id: "message",
          title: "Send Message",
          onClick: () => console.log("Message", member.getName()),
        }),
        new CometChatOption({
          id: "profile",
          title: "View Profile",
          onClick: () => console.log("Profile", member.getUid()),
        }),
      ]}
    />
  );
}

Common Issues

The group prop is required. The component will not render without a valid CometChat.Group object.
IssueSolution
Members not loadingVerify group GUID and user permissions
Actions not showingCheck logged-in user’s scope (admin/moderator required)
Real-time updates not workingComponent auto-subscribes to SDK events - check connection

Next Steps