{"id":"2d79431e-8731-4309-9b4b-07f65592c79e","shortId":"hyNb6b","kind":"skill","title":"cometchat-flutter-v6-users-groups","tagline":"Use when implementing user lists, group lists, or group member management with CometChat Flutter UIKit v6. Triggers on mentions of CometChatUsers, CometChatGroups, CometChatGroupMembers, UsersBloc, GroupsBloc, UsersServiceLocator, GroupsServiceLocator, user list, group list, cont","description":"# CometChat Flutter UIKit — Users & Groups\n\nComponents for displaying and managing users, groups, and group members.\n\n## CometChatUsers\n\nDisplays a searchable, alphabetically-sorted list of users.\n\n```dart\nCometChatUsers(\n  onItemTap: (context, user) {\n    Navigator.push(context, MaterialPageRoute(\n      builder: (_) => MessagesScreen(user: user),\n    ));\n  },\n  usersStyle: CometChatUsersStyle(\n    backgroundColor: colorPalette.background1,\n  ),\n  usersStatusVisibility: true,\n  showBackButton: true,\n  onBack: () => Navigator.pop(context),\n)\n```\n\n### Custom Request Builder\n\n```dart\nCometChatUsers(\n  usersRequestBuilder: UsersRequestBuilder()\n    ..limit = 30\n    ..friendsOnly = true\n    ..roles = ['default']\n    ..searchKeyword = 'john',\n)\n```\n\n### View Slots\n\n```dart\nCometChatUsers(\n  listItemView: (user) => MyCustomUserItem(user),\n  subtitleView: (context, user) => Text(user.status ?? 'offline'),\n  trailingView: (context, user) => Icon(Icons.chat),\n)\n```\n\n## CometChatGroups\n\nDisplays a searchable list of groups with type indicators (public/private/password).\n\n```dart\nCometChatGroups(\n  onItemTap: (context, group) {\n    Navigator.push(context, MaterialPageRoute(\n      builder: (_) => MessagesScreen(group: group),\n    ));\n  },\n  groupsStyle: CometChatGroupsStyle(\n    backgroundColor: colorPalette.background1,\n  ),\n  groupTypeVisibility: true,\n)\n```\n\n### Custom Request Builder\n\n```dart\nCometChatGroups(\n  groupsRequestBuilder: GroupsRequestBuilder()\n    ..limit = 30\n    ..joinedOnly = true\n    ..searchKeyword = 'team'\n    ..withTags = true\n    ..tags = ['project'],\n)\n```\n\n## CometChatGroupMembers\n\nDisplays members of a specific group with role indicators and management actions.\n\n```dart\nCometChatGroupMembers(\n  group: group,\n  groupMembersStyle: CometChatGroupMembersStyle(\n    backgroundColor: colorPalette.background1,\n  ),\n)\n```\n\n### Group Member Actions\n\nThe component supports scope changes, kick, and ban based on the logged-in user's role:\n\n| Logged-in Role | Can Change Scope | Can Kick | Can Ban |\n|----------------|-----------------|----------|---------|\n| Owner | ✅ All members | ✅ All | ✅ All |\n| Admin | ✅ Participants only | ✅ Participants | ✅ Participants |\n| Participant | ❌ | ❌ | ❌ |\n\n## Architecture (All Three)\n\nAll follow the same Clean Architecture + BLoC pattern:\n\n```\n{component}/\n├── bloc/{component}_bloc.dart       # State management + SDK listeners\n├── domain/usecases/                 # Get{Component}sUseCase, etc.\n├── data/repositories/               # SDK wrapper\n├── di/{component}_service_locator.dart  # Singleton DI\n└── widgets/                         # List item, empty/error/loading views\n```\n\n## BLoC State Pattern\n\nAll three use the same state pattern:\n\n```dart\n// Status-based states\n{Component}Initial → {Component}Loading → {Component}Loaded / {Component}Empty / {Component}Error\n\n// Loaded state has:\nfinal List<{Entity}> items;\nfinal bool hasMore;\nfinal Set<String> selectedItems;  // For selection mode\nfinal bool isLoadingMore;\n```\n\n## Selection Mode\n\nAll list components support selection:\n\n```dart\nCometChatUsers(\n  selectionMode: SelectionMode.multiple,\n  onSelection: (selectedUsers) {\n    // Handle selected users\n  },\n  activateSelection: ActivateSelection.onLongClick,\n)\n```\n\n## Gotchas\n\n- `CometChatGroupMembers` has been fully migrated to BLoC + Clean Architecture (bloc/, data/, di/, domain/, widgets/). A `GroupMembersBlocAdapter` wraps the BLoC to implement the legacy `CometChatGroupMembersControllerProtocol` for backward compatibility. The old `cometchat_group_members_controller.dart` file still exists but the BLoC is the active implementation.\n- Group type icons (lock for private, shield for password) are controlled by `groupTypeVisibility`. Setting it to `false` hides all type indicators.\n- `friendsOnly: true` on `UsersRequestBuilder` only works if your CometChat plan supports the friends feature.\n- When a user is blocked, they still appear in `CometChatUsers` unless you set `includeBlockedUsers: false` on the conversations BLoC or filter in the request builder.\n\n## Anti-Patterns\n\n```dart\n// ❌ WRONG — not handling group join for password-protected groups\nonItemTap: (context, group) => Navigator.push(context, MaterialPageRoute(\n  builder: (_) => MessagesScreen(group: group), // Fails if not joined\n))\n\n// ✅ CORRECT — check membership, handle password groups\nonItemTap: (context, group) {\n  if (group.hasJoined) {\n    Navigator.push(context, MaterialPageRoute(\n      builder: (_) => MessagesScreen(group: group),\n    ));\n  } else if (group.type == GroupTypeConstants.password) {\n    Navigator.push(context, MaterialPageRoute(\n      builder: (_) => JoinProtectedGroupScreen(group: group),\n    ));\n  } else {\n    // Join public group first, then navigate\n  }\n}\n```\n\n```dart\n// ❌ WRONG — hardcoded role check strings\nif (member.scope == 'admin') { ... }\n\n// ✅ CORRECT — use SDK constants\nif (member.scope == GroupMemberScope.admin) { ... }\n```\n\n```dart\n// ❌ WRONG — creating ServiceLocator per widget instance\nfinal locator = GroupsServiceLocator(); // New instance each time\n\n// ✅ CORRECT — use singleton\nfinal locator = GroupsServiceLocator.instance;\nlocator.setup();\n```\n\n## Checklist\n\n- [ ] `onItemTap` handles group join state (joined vs password vs public)\n- [ ] Group member actions respect role hierarchy\n- [ ] Selection mode configured if multi-select needed\n- [ ] Request builder customized for app's user/group filtering needs\n- [ ] ServiceLocator accessed via `.instance` singleton\n- [ ] Colors from `CometChatThemeHelper`, not hardcoded","tags":["cometchat","flutter","users","groups","skills","agent-skills","ai-agent","chat","claude-code","cursor","messaging","nextjs"],"capabilities":["skill","source-cometchat","skill-cometchat-flutter-v6-users-groups","topic-agent-skills","topic-ai-agent","topic-chat","topic-claude-code","topic-cometchat","topic-cursor","topic-messaging","topic-nextjs","topic-react","topic-react-native","topic-ui-kit"],"categories":["cometchat-skills"],"synonyms":[],"warnings":[],"endpointUrl":"https://skills.sh/cometchat/cometchat-skills/cometchat-flutter-v6-users-groups","protocol":"skill","transport":"skills-sh","auth":{"type":"none","details":{"cli":"npx skills add cometchat/cometchat-skills","source_repo":"https://github.com/cometchat/cometchat-skills","install_from":"skills.sh"}},"qualityScore":"0.463","qualityRationale":"deterministic score 0.46 from registry signals: · indexed on github topic:agent-skills · 27 github stars · SKILL.md body (5,550 chars)","verified":false,"liveness":"unknown","lastLivenessCheck":null,"agentReviews":{"count":0,"score_avg":null,"cost_usd_avg":null,"success_rate":null,"latency_p50_ms":null,"narrative_summary":null,"summary_updated_at":null},"enrichmentModel":"deterministic:skill-github:v1","enrichmentVersion":1,"enrichedAt":"2026-05-18T19:04:52.453Z","embedding":null,"createdAt":"2026-05-07T13:05:12.333Z","updatedAt":"2026-05-18T19:04:52.453Z","lastSeenAt":"2026-05-18T19:04:52.453Z","tsv":"'30':95,158 'access':566 'action':179,190,544 'activ':368 'activateselect':327 'activateselection.onlongclick':328 'admin':224,502 'alphabet':59 'alphabetically-sort':58 'anti':431 'anti-pattern':430 'app':560 'appear':412 'architectur':230,238,338 'backgroundcolor':78,146,186 'backward':355 'ban':198,218 'base':199,280 'bloc':239,242,267,336,339,348,365,423 'bloc.dart':244 'block':409 'bool':300,309 'builder':72,89,140,152,429,450,472,483,557 'chang':195,213 'check':459,498 'checklist':531 'clean':237,337 'color':570 'colorpalette.background1':79,147,187 'cometchat':2,19,39,399 'cometchat-flutter-v6-users-groups':1 'cometchat_group_members_controller.dart':359 'cometchatgroup':28,121,133,154 'cometchatgroupmemb':29,167,181,330 'cometchatgroupmemberscontrollerprotocol':353 'cometchatgroupmembersstyl':185 'cometchatgroupsstyl':145 'cometchatthemehelp':572 'cometchatus':27,54,65,91,105,319,414 'cometchatusersstyl':77 'compat':356 'compon':44,192,241,243,251,258,282,284,286,288,290,315 'configur':550 'constant':506 'cont':38 'context':67,70,86,111,117,135,138,445,448,465,470,481 'control':380 'convers':422 'correct':458,503,524 'creat':512 'custom':87,150,558 'dart':64,90,104,132,153,180,277,318,433,494,510 'data':340 'data/repositories':254 'default':99 'di':257,261,341 'display':46,55,122,168 'domain':342 'domain/usecases':249 'els':476,487 'empti':289 'empty/error/loading':265 'entiti':297 'error':291 'etc':253 'exist':362 'fail':454 'fals':386,419 'featur':404 'file':360 'filter':425,563 'final':295,299,302,308,517,527 'first':491 'flutter':3,20,40 'follow':234 'friend':403 'friendson':96,391 'fulli':333 'get':250 'gotcha':329 'group':6,12,15,36,43,50,52,127,136,142,143,173,182,183,188,370,437,443,446,452,453,463,466,474,475,485,486,490,534,542 'group.hasjoined':468 'group.type':478 'groupmembersblocadapt':345 'groupmemberscope.admin':509 'groupmembersstyl':184 'groupsbloc':31 'groupsrequestbuild':155,156 'groupsserviceloc':33,519 'groupsservicelocator.instance':529 'groupsstyl':144 'grouptypeconstants.password':479 'grouptypevis':148,382 'handl':324,436,461,533 'hardcod':496,574 'hasmor':301 'hide':387 'hierarchi':547 'icon':119,372 'icons.chat':120 'implement':9,350,369 'includeblockedus':418 'indic':130,176,390 'initi':283 'instanc':516,521,568 'isloadingmor':310 'item':264,298 'john':101 'join':438,457,488,535,537 'joinedon':159 'joinprotectedgroupscreen':484 'kick':196,216 'legaci':352 'limit':94,157 'list':11,13,35,37,61,125,263,296,314 'listen':248 'listitemview':106 'load':285,287,292 'locat':518,528 'locator.setup':530 'lock':373 'log':203,209 'logged-in':202,208 'manag':17,48,178,246 'materialpagerout':71,139,449,471,482 'member':16,53,169,189,221,543 'member.scope':501,508 'membership':460 'mention':25 'messagesscreen':73,141,451,473 'migrat':334 'mode':307,312,549 'multi':553 'multi-select':552 'mycustomuseritem':108 'navig':493 'navigator.pop':85 'navigator.push':69,137,447,469,480 'need':555,564 'new':520 'offlin':115 'old':358 'onback':84 'onitemtap':66,134,444,464,532 'onselect':322 'owner':219 'particip':225,227,228,229 'password':378,441,462,539 'password-protect':440 'pattern':240,269,276,432 'per':514 'plan':400 'privat':375 'project':166 'protect':442 'public':489,541 'public/private/password':131 'request':88,151,428,556 'respect':545 'role':98,175,207,211,497,546 'scope':194,214 'sdk':247,255,505 'searchabl':57,124 'searchkeyword':100,161 'select':306,311,317,325,548,554 'selecteditem':304 'selectedus':323 'selectionmod':320 'selectionmode.multiple':321 'service_locator.dart':259 'serviceloc':513,565 'set':303,383,417 'shield':376 'showbackbutton':82 'singleton':260,526,569 'skill' 'skill-cometchat-flutter-v6-users-groups' 'slot':103 'sort':60 'source-cometchat' 'specif':172 'state':245,268,275,281,293,536 'status':279 'status-bas':278 'still':361,411 'string':499 'subtitleview':110 'support':193,316,401 'susecas':252 'tag':165 'team':162 'text':113 'three':232,271 'time':523 'topic-agent-skills' 'topic-ai-agent' 'topic-chat' 'topic-claude-code' 'topic-cometchat' 'topic-cursor' 'topic-messaging' 'topic-nextjs' 'topic-react' 'topic-react-native' 'topic-ui-kit' 'trailingview':116 'trigger':23 'true':81,83,97,149,160,164,392 'type':129,371,389 'uikit':21,41 'unless':415 'use':7,272,504,525 'user':5,10,34,42,49,63,68,74,75,107,109,112,118,205,326,407 'user.status':114 'user/group':562 'usersbloc':30 'usersrequestbuild':92,93,394 'usersserviceloc':32 'usersstatusvis':80 'usersstyl':76 'v6':4,22 'via':567 'view':102,266 'vs':538,540 'widget':262,343,515 'withtag':163 'work':396 'wrap':346 'wrapper':256 'wrong':434,495,511","prices":[{"id":"e0288417-2b71-472c-b6b5-6168b7e09f06","listingId":"2d79431e-8731-4309-9b4b-07f65592c79e","amountUsd":"0","unit":"free","nativeCurrency":null,"nativeAmount":null,"chain":null,"payTo":null,"paymentMethod":"skill-free","isPrimary":true,"details":{"org":"cometchat","category":"cometchat-skills","install_from":"skills.sh"},"createdAt":"2026-05-07T13:05:12.333Z"}],"sources":[{"listingId":"2d79431e-8731-4309-9b4b-07f65592c79e","source":"github","sourceId":"cometchat/cometchat-skills/cometchat-flutter-v6-users-groups","sourceUrl":"https://github.com/cometchat/cometchat-skills/tree/main/skills/cometchat-flutter-v6-users-groups","isPrimary":false,"firstSeenAt":"2026-05-07T13:05:12.333Z","lastSeenAt":"2026-05-18T19:04:52.453Z"}],"details":{"listingId":"2d79431e-8731-4309-9b4b-07f65592c79e","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"cometchat","slug":"cometchat-flutter-v6-users-groups","github":{"repo":"cometchat/cometchat-skills","stars":27,"topics":["agent-skills","ai-agent","chat","claude-code","cometchat","cursor","messaging","nextjs","react","react-native","ui-kit"],"license":null,"html_url":"https://github.com/cometchat/cometchat-skills","pushed_at":"2026-05-18T05:04:24Z","description":"Add CometChat chat to any React, Next.js, React Native, Angular, Android, iOS, or Flutter project through your AI coding agent. Works with Claude Code, Cursor, Codex, VS Code Copilot, Windsurf, Cline, Kiro, and 50+ more agents.","skill_md_sha":"4f438c6fcd75f2fcc0b4354f34ac731b8024e19d","skill_md_path":"skills/cometchat-flutter-v6-users-groups/SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/cometchat/cometchat-skills/tree/main/skills/cometchat-flutter-v6-users-groups"},"layout":"multi","source":"github","category":"cometchat-skills","frontmatter":{"name":"cometchat-flutter-v6-users-groups","license":"MIT","description":"Use when implementing user lists, group lists, or group member management with CometChat Flutter UIKit v6. Triggers on mentions of CometChatUsers, CometChatGroups, CometChatGroupMembers, UsersBloc, GroupsBloc, UsersServiceLocator, GroupsServiceLocator, user list, group list, contacts, members, group info, add members, ban members, transfer ownership, change scope, UsersRequestBuilder, GroupsRequestBuilder, GroupMembersRequestBuilder, or customizing user/group list items.","compatibility":"cometchat_chat_uikit ^6.0.0-beta2; flutter_bloc ^8.1.0"},"skills_sh_url":"https://skills.sh/cometchat/cometchat-skills/cometchat-flutter-v6-users-groups"},"updatedAt":"2026-05-18T19:04:52.453Z"}}