stream-chat-react-native-core 9.5.0-beta.7 → 9.5.0-beta.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (541) hide show
  1. package/lib/commonjs/components/ChannelDetails/ChannelDetails.js +16 -37
  2. package/lib/commonjs/components/ChannelDetails/ChannelDetails.js.map +1 -1
  3. package/lib/commonjs/components/ChannelDetails/components/ChannelDetailsActionItem.js.map +1 -1
  4. package/lib/commonjs/components/ChannelDetails/components/ChannelDetailsActionsSection.js +10 -3
  5. package/lib/commonjs/components/ChannelDetails/components/ChannelDetailsActionsSection.js.map +1 -1
  6. package/lib/commonjs/components/ChannelDetails/components/ChannelDetailsEditButton.js +23 -16
  7. package/lib/commonjs/components/ChannelDetails/components/ChannelDetailsEditButton.js.map +1 -1
  8. package/lib/commonjs/components/ChannelDetails/components/ChannelDetailsMemberSection.js +43 -59
  9. package/lib/commonjs/components/ChannelDetails/components/ChannelDetailsMemberSection.js.map +1 -1
  10. package/lib/commonjs/components/ChannelDetails/components/ChannelDetailsNavHeader.js +2 -2
  11. package/lib/commonjs/components/ChannelDetails/components/ChannelDetailsNavHeader.js.map +1 -1
  12. package/lib/commonjs/components/ChannelDetails/components/ChannelDetailsNavigationSection.js +8 -3
  13. package/lib/commonjs/components/ChannelDetails/components/ChannelDetailsNavigationSection.js.map +1 -1
  14. package/lib/commonjs/components/ChannelDetails/components/ChannelDetailsProfile.js.map +1 -1
  15. package/lib/commonjs/components/ChannelDetails/components/ChannelEditDetailsForm.js +35 -0
  16. package/lib/commonjs/components/ChannelDetails/components/ChannelEditDetailsForm.js.map +1 -0
  17. package/lib/commonjs/components/ChannelDetails/components/{ChannelEditDetails.js → ChannelEditDetailsFormContent.js} +5 -5
  18. package/lib/commonjs/components/ChannelDetails/components/ChannelEditDetailsFormContent.js.map +1 -0
  19. package/lib/commonjs/components/ChannelDetails/components/ChannelEditDetailsFormHeader.js +81 -0
  20. package/lib/commonjs/components/ChannelDetails/components/ChannelEditDetailsFormHeader.js.map +1 -0
  21. package/lib/commonjs/components/ChannelDetails/components/ChannelEditImageSheet.js.map +1 -1
  22. package/lib/commonjs/components/ChannelDetails/components/ChannelEditName.js.map +1 -1
  23. package/lib/commonjs/components/ChannelDetails/components/index.js +30 -8
  24. package/lib/commonjs/components/ChannelDetails/components/index.js.map +1 -1
  25. package/lib/commonjs/components/ChannelDetails/components/members/AddMemberSearchResultItem.js.map +1 -1
  26. package/lib/commonjs/components/ChannelDetails/components/members/ChannelAddMembersButton.js +77 -0
  27. package/lib/commonjs/components/ChannelDetails/components/members/ChannelAddMembersButton.js.map +1 -0
  28. package/lib/commonjs/components/ChannelDetails/components/members/ChannelAddMembersForm.js +33 -0
  29. package/lib/commonjs/components/ChannelDetails/components/members/ChannelAddMembersForm.js.map +1 -0
  30. package/lib/{module/components/ChannelDetails/components/members/ChannelAddMembers.js → commonjs/components/ChannelDetails/components/members/ChannelAddMembersFormContent.js} +5 -5
  31. package/lib/commonjs/components/ChannelDetails/components/members/ChannelAddMembersFormContent.js.map +1 -0
  32. package/lib/commonjs/components/ChannelDetails/components/members/ChannelAddMembersFormHeader.js +86 -0
  33. package/lib/commonjs/components/ChannelDetails/components/members/ChannelAddMembersFormHeader.js.map +1 -0
  34. package/lib/commonjs/components/ChannelDetails/components/members/ChannelMemberActionsSheet.js +4 -2
  35. package/lib/commonjs/components/ChannelDetails/components/members/ChannelMemberActionsSheet.js.map +1 -1
  36. package/lib/commonjs/components/ChannelDetails/components/members/ChannelMemberItem.js +12 -20
  37. package/lib/commonjs/components/ChannelDetails/components/members/ChannelMemberItem.js.map +1 -1
  38. package/lib/commonjs/components/ChannelDetails/components/members/ChannelMemberList.js +13 -15
  39. package/lib/commonjs/components/ChannelDetails/components/members/ChannelMemberList.js.map +1 -1
  40. package/lib/commonjs/components/ChannelDetails/components/members/MemberListLoadingSkeleton.js.map +1 -1
  41. package/lib/commonjs/components/ChannelDetails/components/members/UserListLoadingSkeleton.js.map +1 -1
  42. package/lib/commonjs/components/ChannelDetails/components/members/index.js +23 -12
  43. package/lib/commonjs/components/ChannelDetails/components/members/index.js.map +1 -1
  44. package/lib/commonjs/components/ChannelDetails/components/modal/Modal.js +16 -1
  45. package/lib/commonjs/components/ChannelDetails/components/modal/Modal.js.map +1 -1
  46. package/lib/commonjs/components/ChannelDetails/components/modal/ModalHeader.js.map +1 -1
  47. package/lib/commonjs/components/ChannelDetails/components/navigation-section/FileAttachmentItem.js.map +1 -1
  48. package/lib/commonjs/components/ChannelDetails/components/navigation-section/FileAttachmentList.js +9 -4
  49. package/lib/commonjs/components/ChannelDetails/components/navigation-section/FileAttachmentList.js.map +1 -1
  50. package/lib/commonjs/components/ChannelDetails/components/navigation-section/FileAttachmentListLoadingSkeleton.js.map +1 -1
  51. package/lib/commonjs/components/ChannelDetails/components/navigation-section/FileAttachmentListSectionHeader.js.map +1 -1
  52. package/lib/commonjs/components/ChannelDetails/components/navigation-section/MediaItem.js.map +1 -1
  53. package/lib/commonjs/components/ChannelDetails/components/navigation-section/MediaList.js +9 -4
  54. package/lib/commonjs/components/ChannelDetails/components/navigation-section/MediaList.js.map +1 -1
  55. package/lib/commonjs/components/ChannelDetails/components/navigation-section/MediaListLoadingSkeleton.js.map +1 -1
  56. package/lib/commonjs/components/ChannelDetails/components/navigation-section/PinnedMessageItem.js.map +1 -1
  57. package/lib/commonjs/components/ChannelDetails/components/navigation-section/PinnedMessageList.js +9 -4
  58. package/lib/commonjs/components/ChannelDetails/components/navigation-section/PinnedMessageList.js.map +1 -1
  59. package/lib/commonjs/components/ChannelDetails/components/navigation-section/PinnedMessageListLoadingSkeleton.js.map +1 -1
  60. package/lib/commonjs/components/ChannelDetails/components/roles/RoleItem.js +61 -0
  61. package/lib/commonjs/components/ChannelDetails/components/roles/RoleItem.js.map +1 -0
  62. package/lib/commonjs/components/ChannelDetails/components/roles/RoleList.js +38 -0
  63. package/lib/commonjs/components/ChannelDetails/components/roles/RoleList.js.map +1 -0
  64. package/lib/commonjs/components/ChannelDetails/components/roles/index.js +26 -0
  65. package/lib/commonjs/components/ChannelDetails/components/roles/index.js.map +1 -0
  66. package/lib/commonjs/components/ChannelDetails/hooks/members/index.js +4 -4
  67. package/lib/commonjs/components/ChannelDetails/hooks/members/index.js.map +1 -1
  68. package/lib/commonjs/components/ChannelDetails/hooks/members/{useMemberRoleLabel.js → useMemberRoles.js} +27 -17
  69. package/lib/commonjs/components/ChannelDetails/hooks/members/useMemberRoles.js.map +1 -0
  70. package/lib/commonjs/components/ChannelDetails/hooks/useChannelDetailsActionItems.js +5 -4
  71. package/lib/commonjs/components/ChannelDetails/hooks/useChannelDetailsActionItems.js.map +1 -1
  72. package/lib/commonjs/components/ChannelDetails/hooks/useChannelDetailsMemberStatusText.js.map +1 -1
  73. package/lib/commonjs/components/ChannelDetails/hooks/useChannelDetailsMembersPreview.js.map +1 -1
  74. package/lib/commonjs/components/ChannelDetails/hooks/useChannelDetailsNavigationItems.js +3 -5
  75. package/lib/commonjs/components/ChannelDetails/hooks/useChannelDetailsNavigationItems.js.map +1 -1
  76. package/lib/commonjs/components/ChannelDetails/hooks/useEditChannelImage.js +3 -3
  77. package/lib/commonjs/components/ChannelDetails/hooks/useEditChannelImage.js.map +1 -1
  78. package/lib/commonjs/components/ChannelDetails/hooks/useFileAttachmentListSections.js.map +1 -1
  79. package/lib/commonjs/components/ChannelDetails/hooks/useMediaList.js.map +1 -1
  80. package/lib/commonjs/components/ChannelDetails/hooks/useUserActivityStatus.js.map +1 -1
  81. package/lib/commonjs/components/UIComponents/EmptyList.js.map +1 -1
  82. package/lib/commonjs/components/UIComponents/EmptySearchResult.js.map +1 -1
  83. package/lib/commonjs/components/UIComponents/GenericListLoadingSkeleton.js.map +1 -1
  84. package/lib/commonjs/components/UIComponents/SearchInput.js.map +1 -1
  85. package/lib/commonjs/components/UIComponents/SelectionCircle.js.map +1 -1
  86. package/lib/commonjs/components/ui/Avatar/UserAvatar.js +2 -4
  87. package/lib/commonjs/components/ui/Avatar/UserAvatar.js.map +1 -1
  88. package/lib/commonjs/components/ui/Avatar/constants.js +33 -1
  89. package/lib/commonjs/components/ui/Avatar/constants.js.map +1 -1
  90. package/lib/commonjs/components/ui/Badge/OnlineIndicator.js +2 -23
  91. package/lib/commonjs/components/ui/Badge/OnlineIndicator.js.map +1 -1
  92. package/lib/commonjs/contexts/channelAddMembersContext/ChannelAddMembersContext.js +50 -6
  93. package/lib/commonjs/contexts/channelAddMembersContext/ChannelAddMembersContext.js.map +1 -1
  94. package/lib/commonjs/contexts/channelDetailsContext/channelDetailsContext.js +20 -6
  95. package/lib/commonjs/contexts/channelDetailsContext/channelDetailsContext.js.map +1 -1
  96. package/lib/commonjs/contexts/channelEditDetailsContext/ChannelEditDetailsContext.js +60 -6
  97. package/lib/commonjs/contexts/channelEditDetailsContext/ChannelEditDetailsContext.js.map +1 -1
  98. package/lib/commonjs/contexts/channelFileAttachmentListContext/ChannelFileAttachmentListContext.js +4 -3
  99. package/lib/commonjs/contexts/channelFileAttachmentListContext/ChannelFileAttachmentListContext.js.map +1 -1
  100. package/lib/commonjs/contexts/channelMediaListContext/ChannelMediaListContext.js +4 -3
  101. package/lib/commonjs/contexts/channelMediaListContext/ChannelMediaListContext.js.map +1 -1
  102. package/lib/commonjs/contexts/channelMemberListContext/ChannelMemberListContext.js +4 -3
  103. package/lib/commonjs/contexts/channelMemberListContext/ChannelMemberListContext.js.map +1 -1
  104. package/lib/commonjs/contexts/channelPinnedMessageListContext/ChannelPinnedMessageListContext.js +4 -3
  105. package/lib/commonjs/contexts/channelPinnedMessageListContext/ChannelPinnedMessageListContext.js.map +1 -1
  106. package/lib/commonjs/contexts/componentsContext/defaultComponents.js +9 -2
  107. package/lib/commonjs/contexts/componentsContext/defaultComponents.js.map +1 -1
  108. package/lib/commonjs/contexts/themeContext/utils/theme.js +12 -1
  109. package/lib/commonjs/contexts/themeContext/utils/theme.js.map +1 -1
  110. package/lib/commonjs/hooks/index.js +33 -0
  111. package/lib/commonjs/hooks/index.js.map +1 -1
  112. package/lib/commonjs/hooks/useCanAddMembersToChannel.js +8 -0
  113. package/lib/commonjs/hooks/useCanAddMembersToChannel.js.map +1 -0
  114. package/lib/commonjs/hooks/useCanEditChannel.js +8 -0
  115. package/lib/commonjs/hooks/useCanEditChannel.js.map +1 -0
  116. package/lib/commonjs/hooks/useIsDirectChat.js +1 -1
  117. package/lib/commonjs/hooks/useIsDirectChat.js.map +1 -1
  118. package/lib/commonjs/state-store/edit-channel-details-store.js +18 -13
  119. package/lib/commonjs/state-store/edit-channel-details-store.js.map +1 -1
  120. package/lib/commonjs/state-store/index.js +33 -0
  121. package/lib/commonjs/state-store/index.js.map +1 -1
  122. package/lib/commonjs/state-store/selection-store.js.map +1 -1
  123. package/lib/commonjs/state-store/signal-store.js +29 -0
  124. package/lib/commonjs/state-store/signal-store.js.map +1 -0
  125. package/lib/commonjs/version.json +1 -1
  126. package/lib/module/components/ChannelDetails/ChannelDetails.js +16 -37
  127. package/lib/module/components/ChannelDetails/ChannelDetails.js.map +1 -1
  128. package/lib/module/components/ChannelDetails/components/ChannelDetailsActionItem.js.map +1 -1
  129. package/lib/module/components/ChannelDetails/components/ChannelDetailsActionsSection.js +10 -3
  130. package/lib/module/components/ChannelDetails/components/ChannelDetailsActionsSection.js.map +1 -1
  131. package/lib/module/components/ChannelDetails/components/ChannelDetailsEditButton.js +23 -16
  132. package/lib/module/components/ChannelDetails/components/ChannelDetailsEditButton.js.map +1 -1
  133. package/lib/module/components/ChannelDetails/components/ChannelDetailsMemberSection.js +43 -59
  134. package/lib/module/components/ChannelDetails/components/ChannelDetailsMemberSection.js.map +1 -1
  135. package/lib/module/components/ChannelDetails/components/ChannelDetailsNavHeader.js +2 -2
  136. package/lib/module/components/ChannelDetails/components/ChannelDetailsNavHeader.js.map +1 -1
  137. package/lib/module/components/ChannelDetails/components/ChannelDetailsNavigationSection.js +8 -3
  138. package/lib/module/components/ChannelDetails/components/ChannelDetailsNavigationSection.js.map +1 -1
  139. package/lib/module/components/ChannelDetails/components/ChannelDetailsProfile.js.map +1 -1
  140. package/lib/module/components/ChannelDetails/components/ChannelEditDetailsForm.js +35 -0
  141. package/lib/module/components/ChannelDetails/components/ChannelEditDetailsForm.js.map +1 -0
  142. package/lib/module/components/ChannelDetails/components/{ChannelEditDetails.js → ChannelEditDetailsFormContent.js} +5 -5
  143. package/lib/module/components/ChannelDetails/components/ChannelEditDetailsFormContent.js.map +1 -0
  144. package/lib/module/components/ChannelDetails/components/ChannelEditDetailsFormHeader.js +81 -0
  145. package/lib/module/components/ChannelDetails/components/ChannelEditDetailsFormHeader.js.map +1 -0
  146. package/lib/module/components/ChannelDetails/components/ChannelEditImageSheet.js.map +1 -1
  147. package/lib/module/components/ChannelDetails/components/ChannelEditName.js.map +1 -1
  148. package/lib/module/components/ChannelDetails/components/index.js +30 -8
  149. package/lib/module/components/ChannelDetails/components/index.js.map +1 -1
  150. package/lib/module/components/ChannelDetails/components/members/AddMemberSearchResultItem.js.map +1 -1
  151. package/lib/module/components/ChannelDetails/components/members/ChannelAddMembersButton.js +77 -0
  152. package/lib/module/components/ChannelDetails/components/members/ChannelAddMembersButton.js.map +1 -0
  153. package/lib/module/components/ChannelDetails/components/members/ChannelAddMembersForm.js +33 -0
  154. package/lib/module/components/ChannelDetails/components/members/ChannelAddMembersForm.js.map +1 -0
  155. package/lib/{commonjs/components/ChannelDetails/components/members/ChannelAddMembers.js → module/components/ChannelDetails/components/members/ChannelAddMembersFormContent.js} +5 -5
  156. package/lib/module/components/ChannelDetails/components/members/ChannelAddMembersFormContent.js.map +1 -0
  157. package/lib/module/components/ChannelDetails/components/members/ChannelAddMembersFormHeader.js +86 -0
  158. package/lib/module/components/ChannelDetails/components/members/ChannelAddMembersFormHeader.js.map +1 -0
  159. package/lib/module/components/ChannelDetails/components/members/ChannelMemberActionsSheet.js +4 -2
  160. package/lib/module/components/ChannelDetails/components/members/ChannelMemberActionsSheet.js.map +1 -1
  161. package/lib/module/components/ChannelDetails/components/members/ChannelMemberItem.js +12 -20
  162. package/lib/module/components/ChannelDetails/components/members/ChannelMemberItem.js.map +1 -1
  163. package/lib/module/components/ChannelDetails/components/members/ChannelMemberList.js +13 -15
  164. package/lib/module/components/ChannelDetails/components/members/ChannelMemberList.js.map +1 -1
  165. package/lib/module/components/ChannelDetails/components/members/MemberListLoadingSkeleton.js.map +1 -1
  166. package/lib/module/components/ChannelDetails/components/members/UserListLoadingSkeleton.js.map +1 -1
  167. package/lib/module/components/ChannelDetails/components/members/index.js +23 -12
  168. package/lib/module/components/ChannelDetails/components/members/index.js.map +1 -1
  169. package/lib/module/components/ChannelDetails/components/modal/Modal.js +16 -1
  170. package/lib/module/components/ChannelDetails/components/modal/Modal.js.map +1 -1
  171. package/lib/module/components/ChannelDetails/components/modal/ModalHeader.js.map +1 -1
  172. package/lib/module/components/ChannelDetails/components/navigation-section/FileAttachmentItem.js.map +1 -1
  173. package/lib/module/components/ChannelDetails/components/navigation-section/FileAttachmentList.js +9 -4
  174. package/lib/module/components/ChannelDetails/components/navigation-section/FileAttachmentList.js.map +1 -1
  175. package/lib/module/components/ChannelDetails/components/navigation-section/FileAttachmentListLoadingSkeleton.js.map +1 -1
  176. package/lib/module/components/ChannelDetails/components/navigation-section/FileAttachmentListSectionHeader.js.map +1 -1
  177. package/lib/module/components/ChannelDetails/components/navigation-section/MediaItem.js.map +1 -1
  178. package/lib/module/components/ChannelDetails/components/navigation-section/MediaList.js +9 -4
  179. package/lib/module/components/ChannelDetails/components/navigation-section/MediaList.js.map +1 -1
  180. package/lib/module/components/ChannelDetails/components/navigation-section/MediaListLoadingSkeleton.js.map +1 -1
  181. package/lib/module/components/ChannelDetails/components/navigation-section/PinnedMessageItem.js.map +1 -1
  182. package/lib/module/components/ChannelDetails/components/navigation-section/PinnedMessageList.js +9 -4
  183. package/lib/module/components/ChannelDetails/components/navigation-section/PinnedMessageList.js.map +1 -1
  184. package/lib/module/components/ChannelDetails/components/navigation-section/PinnedMessageListLoadingSkeleton.js.map +1 -1
  185. package/lib/module/components/ChannelDetails/components/roles/RoleItem.js +61 -0
  186. package/lib/module/components/ChannelDetails/components/roles/RoleItem.js.map +1 -0
  187. package/lib/module/components/ChannelDetails/components/roles/RoleList.js +38 -0
  188. package/lib/module/components/ChannelDetails/components/roles/RoleList.js.map +1 -0
  189. package/lib/module/components/ChannelDetails/components/roles/index.js +26 -0
  190. package/lib/module/components/ChannelDetails/components/roles/index.js.map +1 -0
  191. package/lib/module/components/ChannelDetails/hooks/members/index.js +4 -4
  192. package/lib/module/components/ChannelDetails/hooks/members/index.js.map +1 -1
  193. package/lib/module/components/ChannelDetails/hooks/members/{useMemberRoleLabel.js → useMemberRoles.js} +27 -17
  194. package/lib/module/components/ChannelDetails/hooks/members/useMemberRoles.js.map +1 -0
  195. package/lib/module/components/ChannelDetails/hooks/useChannelDetailsActionItems.js +5 -4
  196. package/lib/module/components/ChannelDetails/hooks/useChannelDetailsActionItems.js.map +1 -1
  197. package/lib/module/components/ChannelDetails/hooks/useChannelDetailsMemberStatusText.js.map +1 -1
  198. package/lib/module/components/ChannelDetails/hooks/useChannelDetailsMembersPreview.js.map +1 -1
  199. package/lib/module/components/ChannelDetails/hooks/useChannelDetailsNavigationItems.js +3 -5
  200. package/lib/module/components/ChannelDetails/hooks/useChannelDetailsNavigationItems.js.map +1 -1
  201. package/lib/module/components/ChannelDetails/hooks/useEditChannelImage.js +3 -3
  202. package/lib/module/components/ChannelDetails/hooks/useEditChannelImage.js.map +1 -1
  203. package/lib/module/components/ChannelDetails/hooks/useFileAttachmentListSections.js.map +1 -1
  204. package/lib/module/components/ChannelDetails/hooks/useMediaList.js.map +1 -1
  205. package/lib/module/components/ChannelDetails/hooks/useUserActivityStatus.js.map +1 -1
  206. package/lib/module/components/UIComponents/EmptyList.js.map +1 -1
  207. package/lib/module/components/UIComponents/EmptySearchResult.js.map +1 -1
  208. package/lib/module/components/UIComponents/GenericListLoadingSkeleton.js.map +1 -1
  209. package/lib/module/components/UIComponents/SearchInput.js.map +1 -1
  210. package/lib/module/components/UIComponents/SelectionCircle.js.map +1 -1
  211. package/lib/module/components/ui/Avatar/UserAvatar.js +2 -4
  212. package/lib/module/components/ui/Avatar/UserAvatar.js.map +1 -1
  213. package/lib/module/components/ui/Avatar/constants.js +33 -1
  214. package/lib/module/components/ui/Avatar/constants.js.map +1 -1
  215. package/lib/module/components/ui/Badge/OnlineIndicator.js +2 -23
  216. package/lib/module/components/ui/Badge/OnlineIndicator.js.map +1 -1
  217. package/lib/module/contexts/channelAddMembersContext/ChannelAddMembersContext.js +50 -6
  218. package/lib/module/contexts/channelAddMembersContext/ChannelAddMembersContext.js.map +1 -1
  219. package/lib/module/contexts/channelDetailsContext/channelDetailsContext.js +20 -6
  220. package/lib/module/contexts/channelDetailsContext/channelDetailsContext.js.map +1 -1
  221. package/lib/module/contexts/channelEditDetailsContext/ChannelEditDetailsContext.js +60 -6
  222. package/lib/module/contexts/channelEditDetailsContext/ChannelEditDetailsContext.js.map +1 -1
  223. package/lib/module/contexts/channelFileAttachmentListContext/ChannelFileAttachmentListContext.js +4 -3
  224. package/lib/module/contexts/channelFileAttachmentListContext/ChannelFileAttachmentListContext.js.map +1 -1
  225. package/lib/module/contexts/channelMediaListContext/ChannelMediaListContext.js +4 -3
  226. package/lib/module/contexts/channelMediaListContext/ChannelMediaListContext.js.map +1 -1
  227. package/lib/module/contexts/channelMemberListContext/ChannelMemberListContext.js +4 -3
  228. package/lib/module/contexts/channelMemberListContext/ChannelMemberListContext.js.map +1 -1
  229. package/lib/module/contexts/channelPinnedMessageListContext/ChannelPinnedMessageListContext.js +4 -3
  230. package/lib/module/contexts/channelPinnedMessageListContext/ChannelPinnedMessageListContext.js.map +1 -1
  231. package/lib/module/contexts/componentsContext/defaultComponents.js +9 -2
  232. package/lib/module/contexts/componentsContext/defaultComponents.js.map +1 -1
  233. package/lib/module/contexts/themeContext/utils/theme.js +12 -1
  234. package/lib/module/contexts/themeContext/utils/theme.js.map +1 -1
  235. package/lib/module/hooks/index.js +33 -0
  236. package/lib/module/hooks/index.js.map +1 -1
  237. package/lib/module/hooks/useCanAddMembersToChannel.js +8 -0
  238. package/lib/module/hooks/useCanAddMembersToChannel.js.map +1 -0
  239. package/lib/module/hooks/useCanEditChannel.js +8 -0
  240. package/lib/module/hooks/useCanEditChannel.js.map +1 -0
  241. package/lib/module/hooks/useIsDirectChat.js +1 -1
  242. package/lib/module/hooks/useIsDirectChat.js.map +1 -1
  243. package/lib/module/state-store/edit-channel-details-store.js +18 -13
  244. package/lib/module/state-store/edit-channel-details-store.js.map +1 -1
  245. package/lib/module/state-store/index.js +33 -0
  246. package/lib/module/state-store/index.js.map +1 -1
  247. package/lib/module/state-store/selection-store.js.map +1 -1
  248. package/lib/module/state-store/signal-store.js +29 -0
  249. package/lib/module/state-store/signal-store.js.map +1 -0
  250. package/lib/module/version.json +1 -1
  251. package/lib/typescript/components/ChannelDetails/ChannelDetails.d.ts +2 -95
  252. package/lib/typescript/components/ChannelDetails/ChannelDetails.d.ts.map +1 -1
  253. package/lib/typescript/components/ChannelDetails/components/ChannelDetailsActionItem.d.ts +0 -3
  254. package/lib/typescript/components/ChannelDetails/components/ChannelDetailsActionItem.d.ts.map +1 -1
  255. package/lib/typescript/components/ChannelDetails/components/ChannelDetailsActionsSection.d.ts +17 -4
  256. package/lib/typescript/components/ChannelDetails/components/ChannelDetailsActionsSection.d.ts.map +1 -1
  257. package/lib/typescript/components/ChannelDetails/components/ChannelDetailsEditButton.d.ts +8 -4
  258. package/lib/typescript/components/ChannelDetails/components/ChannelDetailsEditButton.d.ts.map +1 -1
  259. package/lib/typescript/components/ChannelDetails/components/ChannelDetailsMemberSection.d.ts +7 -4
  260. package/lib/typescript/components/ChannelDetails/components/ChannelDetailsMemberSection.d.ts.map +1 -1
  261. package/lib/typescript/components/ChannelDetails/components/ChannelDetailsNavHeader.d.ts +3 -4
  262. package/lib/typescript/components/ChannelDetails/components/ChannelDetailsNavHeader.d.ts.map +1 -1
  263. package/lib/typescript/components/ChannelDetails/components/ChannelDetailsNavigationSection.d.ts +13 -4
  264. package/lib/typescript/components/ChannelDetails/components/ChannelDetailsNavigationSection.d.ts.map +1 -1
  265. package/lib/typescript/components/ChannelDetails/components/ChannelDetailsProfile.d.ts +0 -3
  266. package/lib/typescript/components/ChannelDetails/components/ChannelDetailsProfile.d.ts.map +1 -1
  267. package/lib/typescript/components/ChannelDetails/components/ChannelEditDetailsForm.d.ts +20 -0
  268. package/lib/typescript/components/ChannelDetails/components/ChannelEditDetailsForm.d.ts.map +1 -0
  269. package/lib/typescript/components/ChannelDetails/components/ChannelEditDetailsFormContent.d.ts +3 -0
  270. package/lib/typescript/components/ChannelDetails/components/ChannelEditDetailsFormContent.d.ts.map +1 -0
  271. package/lib/typescript/components/ChannelDetails/components/ChannelEditDetailsFormHeader.d.ts +7 -0
  272. package/lib/typescript/components/ChannelDetails/components/ChannelEditDetailsFormHeader.d.ts.map +1 -0
  273. package/lib/typescript/components/ChannelDetails/components/ChannelEditImageSheet.d.ts +0 -3
  274. package/lib/typescript/components/ChannelDetails/components/ChannelEditImageSheet.d.ts.map +1 -1
  275. package/lib/typescript/components/ChannelDetails/components/ChannelEditName.d.ts +0 -3
  276. package/lib/typescript/components/ChannelDetails/components/ChannelEditName.d.ts.map +1 -1
  277. package/lib/typescript/components/ChannelDetails/components/index.d.ts +4 -2
  278. package/lib/typescript/components/ChannelDetails/components/index.d.ts.map +1 -1
  279. package/lib/typescript/components/ChannelDetails/components/members/AddMemberSearchResultItem.d.ts +0 -3
  280. package/lib/typescript/components/ChannelDetails/components/members/AddMemberSearchResultItem.d.ts.map +1 -1
  281. package/lib/typescript/components/ChannelDetails/components/members/ChannelAddMembersButton.d.ts +12 -0
  282. package/lib/typescript/components/ChannelDetails/components/members/ChannelAddMembersButton.d.ts.map +1 -0
  283. package/lib/typescript/components/ChannelDetails/components/members/ChannelAddMembersForm.d.ts +19 -0
  284. package/lib/typescript/components/ChannelDetails/components/members/ChannelAddMembersForm.d.ts.map +1 -0
  285. package/lib/typescript/components/ChannelDetails/components/members/{ChannelAddMembers.d.ts → ChannelAddMembersFormContent.d.ts} +3 -6
  286. package/lib/typescript/components/ChannelDetails/components/members/ChannelAddMembersFormContent.d.ts.map +1 -0
  287. package/lib/typescript/components/ChannelDetails/components/members/ChannelAddMembersFormHeader.d.ts +7 -0
  288. package/lib/typescript/components/ChannelDetails/components/members/ChannelAddMembersFormHeader.d.ts.map +1 -0
  289. package/lib/typescript/components/ChannelDetails/components/members/ChannelMemberActionsSheet.d.ts +10 -4
  290. package/lib/typescript/components/ChannelDetails/components/members/ChannelMemberActionsSheet.d.ts.map +1 -1
  291. package/lib/typescript/components/ChannelDetails/components/members/ChannelMemberItem.d.ts +8 -4
  292. package/lib/typescript/components/ChannelDetails/components/members/ChannelMemberItem.d.ts.map +1 -1
  293. package/lib/typescript/components/ChannelDetails/components/members/ChannelMemberList.d.ts +8 -3
  294. package/lib/typescript/components/ChannelDetails/components/members/ChannelMemberList.d.ts.map +1 -1
  295. package/lib/typescript/components/ChannelDetails/components/members/MemberListLoadingSkeleton.d.ts +0 -3
  296. package/lib/typescript/components/ChannelDetails/components/members/MemberListLoadingSkeleton.d.ts.map +1 -1
  297. package/lib/typescript/components/ChannelDetails/components/members/UserListLoadingSkeleton.d.ts +0 -3
  298. package/lib/typescript/components/ChannelDetails/components/members/UserListLoadingSkeleton.d.ts.map +1 -1
  299. package/lib/typescript/components/ChannelDetails/components/members/index.d.ts +4 -3
  300. package/lib/typescript/components/ChannelDetails/components/members/index.d.ts.map +1 -1
  301. package/lib/typescript/components/ChannelDetails/components/modal/Modal.d.ts +0 -3
  302. package/lib/typescript/components/ChannelDetails/components/modal/Modal.d.ts.map +1 -1
  303. package/lib/typescript/components/ChannelDetails/components/modal/ModalHeader.d.ts +0 -3
  304. package/lib/typescript/components/ChannelDetails/components/modal/ModalHeader.d.ts.map +1 -1
  305. package/lib/typescript/components/ChannelDetails/components/navigation-section/FileAttachmentItem.d.ts +0 -5
  306. package/lib/typescript/components/ChannelDetails/components/navigation-section/FileAttachmentItem.d.ts.map +1 -1
  307. package/lib/typescript/components/ChannelDetails/components/navigation-section/FileAttachmentList.d.ts +8 -4
  308. package/lib/typescript/components/ChannelDetails/components/navigation-section/FileAttachmentList.d.ts.map +1 -1
  309. package/lib/typescript/components/ChannelDetails/components/navigation-section/FileAttachmentListLoadingSkeleton.d.ts +0 -3
  310. package/lib/typescript/components/ChannelDetails/components/navigation-section/FileAttachmentListLoadingSkeleton.d.ts.map +1 -1
  311. package/lib/typescript/components/ChannelDetails/components/navigation-section/FileAttachmentListSectionHeader.d.ts +0 -3
  312. package/lib/typescript/components/ChannelDetails/components/navigation-section/FileAttachmentListSectionHeader.d.ts.map +1 -1
  313. package/lib/typescript/components/ChannelDetails/components/navigation-section/MediaItem.d.ts +0 -5
  314. package/lib/typescript/components/ChannelDetails/components/navigation-section/MediaItem.d.ts.map +1 -1
  315. package/lib/typescript/components/ChannelDetails/components/navigation-section/MediaList.d.ts +8 -4
  316. package/lib/typescript/components/ChannelDetails/components/navigation-section/MediaList.d.ts.map +1 -1
  317. package/lib/typescript/components/ChannelDetails/components/navigation-section/MediaListLoadingSkeleton.d.ts +0 -2
  318. package/lib/typescript/components/ChannelDetails/components/navigation-section/MediaListLoadingSkeleton.d.ts.map +1 -1
  319. package/lib/typescript/components/ChannelDetails/components/navigation-section/PinnedMessageItem.d.ts +0 -3
  320. package/lib/typescript/components/ChannelDetails/components/navigation-section/PinnedMessageItem.d.ts.map +1 -1
  321. package/lib/typescript/components/ChannelDetails/components/navigation-section/PinnedMessageList.d.ts +8 -5
  322. package/lib/typescript/components/ChannelDetails/components/navigation-section/PinnedMessageList.d.ts.map +1 -1
  323. package/lib/typescript/components/ChannelDetails/components/navigation-section/PinnedMessageListLoadingSkeleton.d.ts +0 -3
  324. package/lib/typescript/components/ChannelDetails/components/navigation-section/PinnedMessageListLoadingSkeleton.d.ts.map +1 -1
  325. package/lib/typescript/components/ChannelDetails/components/roles/RoleItem.d.ts +16 -0
  326. package/lib/typescript/components/ChannelDetails/components/roles/RoleItem.d.ts.map +1 -0
  327. package/lib/typescript/components/ChannelDetails/components/roles/RoleList.d.ts +11 -0
  328. package/lib/typescript/components/ChannelDetails/components/roles/RoleList.d.ts.map +1 -0
  329. package/lib/typescript/components/ChannelDetails/components/roles/index.d.ts +3 -0
  330. package/lib/typescript/components/ChannelDetails/components/roles/index.d.ts.map +1 -0
  331. package/lib/typescript/components/ChannelDetails/hooks/members/index.d.ts +1 -1
  332. package/lib/typescript/components/ChannelDetails/hooks/members/index.d.ts.map +1 -1
  333. package/lib/typescript/components/ChannelDetails/hooks/members/useMemberRoles.d.ts +35 -0
  334. package/lib/typescript/components/ChannelDetails/hooks/members/useMemberRoles.d.ts.map +1 -0
  335. package/lib/typescript/components/ChannelDetails/hooks/useChannelDetailsActionItems.d.ts +5 -5
  336. package/lib/typescript/components/ChannelDetails/hooks/useChannelDetailsActionItems.d.ts.map +1 -1
  337. package/lib/typescript/components/ChannelDetails/hooks/useChannelDetailsMemberStatusText.d.ts +0 -1
  338. package/lib/typescript/components/ChannelDetails/hooks/useChannelDetailsMemberStatusText.d.ts.map +1 -1
  339. package/lib/typescript/components/ChannelDetails/hooks/useChannelDetailsMembersPreview.d.ts +0 -3
  340. package/lib/typescript/components/ChannelDetails/hooks/useChannelDetailsMembersPreview.d.ts.map +1 -1
  341. package/lib/typescript/components/ChannelDetails/hooks/useChannelDetailsNavigationItems.d.ts +3 -9
  342. package/lib/typescript/components/ChannelDetails/hooks/useChannelDetailsNavigationItems.d.ts.map +1 -1
  343. package/lib/typescript/components/ChannelDetails/hooks/useEditChannelImage.d.ts +1 -2
  344. package/lib/typescript/components/ChannelDetails/hooks/useEditChannelImage.d.ts.map +1 -1
  345. package/lib/typescript/components/ChannelDetails/hooks/useFileAttachmentListSections.d.ts +0 -3
  346. package/lib/typescript/components/ChannelDetails/hooks/useFileAttachmentListSections.d.ts.map +1 -1
  347. package/lib/typescript/components/ChannelDetails/hooks/useMediaList.d.ts +0 -4
  348. package/lib/typescript/components/ChannelDetails/hooks/useMediaList.d.ts.map +1 -1
  349. package/lib/typescript/components/ChannelDetails/hooks/useUserActivityStatus.d.ts +0 -1
  350. package/lib/typescript/components/ChannelDetails/hooks/useUserActivityStatus.d.ts.map +1 -1
  351. package/lib/typescript/components/UIComponents/EmptyList.d.ts +0 -3
  352. package/lib/typescript/components/UIComponents/EmptyList.d.ts.map +1 -1
  353. package/lib/typescript/components/UIComponents/EmptySearchResult.d.ts +0 -3
  354. package/lib/typescript/components/UIComponents/EmptySearchResult.d.ts.map +1 -1
  355. package/lib/typescript/components/UIComponents/GenericListLoadingSkeleton.d.ts +0 -3
  356. package/lib/typescript/components/UIComponents/GenericListLoadingSkeleton.d.ts.map +1 -1
  357. package/lib/typescript/components/UIComponents/SearchInput.d.ts +0 -3
  358. package/lib/typescript/components/UIComponents/SearchInput.d.ts.map +1 -1
  359. package/lib/typescript/components/UIComponents/SelectionCircle.d.ts +0 -3
  360. package/lib/typescript/components/UIComponents/SelectionCircle.d.ts.map +1 -1
  361. package/lib/typescript/components/ui/Avatar/UserAvatar.d.ts.map +1 -1
  362. package/lib/typescript/components/ui/Avatar/constants.d.ts +10 -1
  363. package/lib/typescript/components/ui/Avatar/constants.d.ts.map +1 -1
  364. package/lib/typescript/components/ui/Badge/OnlineIndicator.d.ts.map +1 -1
  365. package/lib/typescript/contexts/channelAddMembersContext/ChannelAddMembersContext.d.ts +18 -9
  366. package/lib/typescript/contexts/channelAddMembersContext/ChannelAddMembersContext.d.ts.map +1 -1
  367. package/lib/typescript/contexts/channelDetailsContext/channelDetailsContext.d.ts +14 -15
  368. package/lib/typescript/contexts/channelDetailsContext/channelDetailsContext.d.ts.map +1 -1
  369. package/lib/typescript/contexts/channelEditDetailsContext/ChannelEditDetailsContext.d.ts +28 -13
  370. package/lib/typescript/contexts/channelEditDetailsContext/ChannelEditDetailsContext.d.ts.map +1 -1
  371. package/lib/typescript/contexts/channelFileAttachmentListContext/ChannelFileAttachmentListContext.d.ts +2 -11
  372. package/lib/typescript/contexts/channelFileAttachmentListContext/ChannelFileAttachmentListContext.d.ts.map +1 -1
  373. package/lib/typescript/contexts/channelMediaListContext/ChannelMediaListContext.d.ts +2 -11
  374. package/lib/typescript/contexts/channelMediaListContext/ChannelMediaListContext.d.ts.map +1 -1
  375. package/lib/typescript/contexts/channelMemberListContext/ChannelMemberListContext.d.ts +2 -11
  376. package/lib/typescript/contexts/channelMemberListContext/ChannelMemberListContext.d.ts.map +1 -1
  377. package/lib/typescript/contexts/channelPinnedMessageListContext/ChannelPinnedMessageListContext.d.ts +2 -11
  378. package/lib/typescript/contexts/channelPinnedMessageListContext/ChannelPinnedMessageListContext.d.ts.map +1 -1
  379. package/lib/typescript/contexts/componentsContext/defaultComponents.d.ts +21 -14
  380. package/lib/typescript/contexts/componentsContext/defaultComponents.d.ts.map +1 -1
  381. package/lib/typescript/contexts/themeContext/ThemeContext.d.ts +12 -1
  382. package/lib/typescript/contexts/themeContext/ThemeContext.d.ts.map +1 -1
  383. package/lib/typescript/contexts/themeContext/utils/theme.d.ts +12 -1
  384. package/lib/typescript/contexts/themeContext/utils/theme.d.ts.map +1 -1
  385. package/lib/typescript/hooks/index.d.ts +3 -0
  386. package/lib/typescript/hooks/index.d.ts.map +1 -1
  387. package/lib/typescript/hooks/useCanAddMembersToChannel.d.ts +6 -0
  388. package/lib/typescript/hooks/useCanAddMembersToChannel.d.ts.map +1 -0
  389. package/lib/typescript/hooks/useCanEditChannel.d.ts +6 -0
  390. package/lib/typescript/hooks/useCanEditChannel.d.ts.map +1 -0
  391. package/lib/typescript/hooks/useIsDirectChat.d.ts +1 -1
  392. package/lib/typescript/hooks/useIsDirectChat.d.ts.map +1 -1
  393. package/lib/typescript/state-store/edit-channel-details-store.d.ts +10 -11
  394. package/lib/typescript/state-store/edit-channel-details-store.d.ts.map +1 -1
  395. package/lib/typescript/state-store/index.d.ts +3 -0
  396. package/lib/typescript/state-store/index.d.ts.map +1 -1
  397. package/lib/typescript/state-store/selection-store.d.ts +0 -6
  398. package/lib/typescript/state-store/selection-store.d.ts.map +1 -1
  399. package/lib/typescript/state-store/signal-store.d.ts +9 -0
  400. package/lib/typescript/state-store/signal-store.d.ts.map +1 -0
  401. package/package.json +1 -1
  402. package/src/components/ChannelDetails/ChannelDetails.tsx +14 -160
  403. package/src/components/ChannelDetails/__tests__/ChannelDetails.test.tsx +51 -38
  404. package/src/components/ChannelDetails/__tests__/ChannelDetailsActionsSection.test.tsx +1 -1
  405. package/src/components/ChannelDetails/__tests__/ChannelDetailsEditButton.test.tsx +52 -22
  406. package/src/components/ChannelDetails/__tests__/ChannelDetailsMemberSection.test.tsx +10 -45
  407. package/src/components/ChannelDetails/__tests__/ChannelDetailsNavHeader.test.tsx +4 -4
  408. package/src/components/ChannelDetails/__tests__/ChannelDetailsNavigationSection.test.tsx +6 -3
  409. package/src/components/ChannelDetails/__tests__/ChannelDetailsProfile.test.tsx +1 -1
  410. package/src/components/ChannelDetails/__tests__/{ChannelEditDetailsModal.test.tsx → ChannelEditDetailsForm.test.tsx} +30 -35
  411. package/src/components/ChannelDetails/__tests__/{ChannelEditDetails.test.tsx → ChannelEditDetailsFormContent.test.tsx} +8 -8
  412. package/src/components/ChannelDetails/__tests__/ChannelEditImageSheet.test.tsx +1 -1
  413. package/src/components/ChannelDetails/__tests__/ChannelEditName.test.tsx +1 -1
  414. package/src/components/ChannelDetails/__tests__/members/ChannelAddMembersButton.test.tsx +163 -0
  415. package/src/components/ChannelDetails/__tests__/members/{ChannelAddMembersModal.test.tsx → ChannelAddMembersForm.test.tsx} +23 -25
  416. package/src/components/ChannelDetails/__tests__/members/{ChannelAddMembers.test.tsx → ChannelAddMembersFormContent.test.tsx} +5 -3
  417. package/src/components/ChannelDetails/__tests__/members/ChannelMemberActionsSheet.test.tsx +8 -3
  418. package/src/components/ChannelDetails/__tests__/members/ChannelMemberItem.test.tsx +11 -11
  419. package/src/components/ChannelDetails/__tests__/members/ChannelMemberList.test.tsx +35 -21
  420. package/src/components/ChannelDetails/__tests__/members/useMemberRoles.test.tsx +122 -0
  421. package/src/components/ChannelDetails/__tests__/useChannelDetailsActionItems.test.tsx +13 -9
  422. package/src/components/ChannelDetails/__tests__/useEditChannelImage.test.tsx +10 -3
  423. package/src/components/ChannelDetails/components/ChannelDetailsActionItem.tsx +0 -3
  424. package/src/components/ChannelDetails/components/ChannelDetailsActionsSection.tsx +26 -6
  425. package/src/components/ChannelDetails/components/ChannelDetailsEditButton.tsx +34 -18
  426. package/src/components/ChannelDetails/components/ChannelDetailsMemberSection.tsx +51 -59
  427. package/src/components/ChannelDetails/components/ChannelDetailsNavHeader.tsx +8 -5
  428. package/src/components/ChannelDetails/components/ChannelDetailsNavigationSection.tsx +18 -5
  429. package/src/components/ChannelDetails/components/ChannelDetailsProfile.tsx +0 -3
  430. package/src/components/ChannelDetails/components/ChannelEditDetailsForm.tsx +48 -0
  431. package/src/components/ChannelDetails/components/{ChannelEditDetails.tsx → ChannelEditDetailsFormContent.tsx} +1 -4
  432. package/src/components/ChannelDetails/components/ChannelEditDetailsFormHeader.tsx +65 -0
  433. package/src/components/ChannelDetails/components/ChannelEditImageSheet.tsx +0 -3
  434. package/src/components/ChannelDetails/components/ChannelEditName.tsx +0 -3
  435. package/src/components/ChannelDetails/components/__tests__/navigation-section/FileAttachmentList.test.tsx +1 -2
  436. package/src/components/ChannelDetails/components/__tests__/navigation-section/MediaList.test.tsx +2 -2
  437. package/src/components/ChannelDetails/components/__tests__/navigation-section/PinnedMessageList.test.tsx +1 -2
  438. package/src/components/ChannelDetails/components/index.ts +4 -2
  439. package/src/components/ChannelDetails/components/members/AddMemberSearchResultItem.tsx +0 -3
  440. package/src/components/ChannelDetails/components/members/ChannelAddMembersButton.tsx +83 -0
  441. package/src/components/ChannelDetails/components/members/ChannelAddMembersForm.tsx +41 -0
  442. package/src/components/ChannelDetails/components/members/{ChannelAddMembers.tsx → ChannelAddMembersFormContent.tsx} +4 -5
  443. package/src/components/ChannelDetails/components/members/ChannelAddMembersFormHeader.tsx +75 -0
  444. package/src/components/ChannelDetails/components/members/ChannelMemberActionsSheet.tsx +17 -5
  445. package/src/components/ChannelDetails/components/members/ChannelMemberItem.tsx +16 -29
  446. package/src/components/ChannelDetails/components/members/ChannelMemberList.tsx +26 -19
  447. package/src/components/ChannelDetails/components/members/MemberListLoadingSkeleton.tsx +0 -3
  448. package/src/components/ChannelDetails/components/members/UserListLoadingSkeleton.tsx +0 -3
  449. package/src/components/ChannelDetails/components/members/index.ts +4 -3
  450. package/src/components/ChannelDetails/components/modal/Modal.tsx +19 -6
  451. package/src/components/ChannelDetails/components/modal/ModalHeader.tsx +0 -3
  452. package/src/components/ChannelDetails/components/navigation-section/FileAttachmentItem.tsx +0 -5
  453. package/src/components/ChannelDetails/components/navigation-section/FileAttachmentList.tsx +11 -7
  454. package/src/components/ChannelDetails/components/navigation-section/FileAttachmentListLoadingSkeleton.tsx +0 -3
  455. package/src/components/ChannelDetails/components/navigation-section/FileAttachmentListSectionHeader.tsx +0 -3
  456. package/src/components/ChannelDetails/components/navigation-section/MediaItem.tsx +0 -5
  457. package/src/components/ChannelDetails/components/navigation-section/MediaList.tsx +16 -7
  458. package/src/components/ChannelDetails/components/navigation-section/MediaListLoadingSkeleton.tsx +0 -2
  459. package/src/components/ChannelDetails/components/navigation-section/PinnedMessageItem.tsx +0 -3
  460. package/src/components/ChannelDetails/components/navigation-section/PinnedMessageList.tsx +11 -7
  461. package/src/components/ChannelDetails/components/navigation-section/PinnedMessageListLoadingSkeleton.tsx +0 -3
  462. package/src/components/ChannelDetails/components/roles/RoleItem.tsx +74 -0
  463. package/src/components/ChannelDetails/components/roles/RoleList.tsx +51 -0
  464. package/src/components/ChannelDetails/components/roles/__tests__/RoleItem.test.tsx +58 -0
  465. package/src/components/ChannelDetails/components/roles/__tests__/RoleList.test.tsx +31 -0
  466. package/src/components/ChannelDetails/components/roles/index.ts +2 -0
  467. package/src/components/ChannelDetails/hooks/members/index.ts +1 -1
  468. package/src/components/ChannelDetails/hooks/members/useMemberRoles.ts +63 -0
  469. package/src/components/ChannelDetails/hooks/useChannelDetailsActionItems.ts +9 -5
  470. package/src/components/ChannelDetails/hooks/useChannelDetailsMemberStatusText.ts +0 -1
  471. package/src/components/ChannelDetails/hooks/useChannelDetailsMembersPreview.ts +0 -3
  472. package/src/components/ChannelDetails/hooks/useChannelDetailsNavigationItems.ts +5 -11
  473. package/src/components/ChannelDetails/hooks/useEditChannelImage.ts +3 -4
  474. package/src/components/ChannelDetails/hooks/useFileAttachmentListSections.ts +0 -3
  475. package/src/components/ChannelDetails/hooks/useMediaList.ts +0 -4
  476. package/src/components/ChannelDetails/hooks/useUserActivityStatus.ts +0 -1
  477. package/src/components/UIComponents/EmptyList.tsx +0 -3
  478. package/src/components/UIComponents/EmptySearchResult.tsx +0 -3
  479. package/src/components/UIComponents/GenericListLoadingSkeleton.tsx +0 -3
  480. package/src/components/UIComponents/SearchInput.tsx +0 -3
  481. package/src/components/UIComponents/SelectionCircle.tsx +0 -3
  482. package/src/components/ui/Avatar/UserAvatar.tsx +8 -4
  483. package/src/components/ui/Avatar/constants.ts +48 -1
  484. package/src/components/ui/Badge/OnlineIndicator.tsx +10 -24
  485. package/src/contexts/channelAddMembersContext/ChannelAddMembersContext.tsx +76 -12
  486. package/src/contexts/channelDetailsContext/channelDetailsContext.tsx +24 -19
  487. package/src/contexts/channelEditDetailsContext/ChannelEditDetailsContext.tsx +101 -18
  488. package/src/contexts/channelFileAttachmentListContext/ChannelFileAttachmentListContext.tsx +5 -13
  489. package/src/contexts/channelMediaListContext/ChannelMediaListContext.tsx +5 -13
  490. package/src/contexts/channelMemberListContext/ChannelMemberListContext.tsx +5 -13
  491. package/src/contexts/channelPinnedMessageListContext/ChannelPinnedMessageListContext.tsx +5 -13
  492. package/src/contexts/componentsContext/defaultComponents.ts +18 -4
  493. package/src/contexts/themeContext/utils/theme.ts +24 -2
  494. package/src/hooks/__tests__/useCanAddMembersToChannel.test.tsx +43 -0
  495. package/src/hooks/__tests__/useCanEditChannel.test.tsx +43 -0
  496. package/src/hooks/index.ts +3 -0
  497. package/src/hooks/useCanAddMembersToChannel.ts +9 -0
  498. package/src/hooks/useCanEditChannel.ts +9 -0
  499. package/src/hooks/useIsDirectChat.ts +2 -2
  500. package/src/state-store/__tests__/edit-channel-details-store.test.ts +72 -17
  501. package/src/state-store/__tests__/signal-store.test.ts +35 -0
  502. package/src/state-store/edit-channel-details-store.ts +22 -17
  503. package/src/state-store/index.ts +3 -0
  504. package/src/state-store/selection-store.ts +0 -6
  505. package/src/state-store/signal-store.ts +18 -0
  506. package/src/version.json +1 -1
  507. package/lib/commonjs/components/ChannelDetails/components/ChannelEditDetails.js.map +0 -1
  508. package/lib/commonjs/components/ChannelDetails/components/ChannelEditDetailsModal.js +0 -152
  509. package/lib/commonjs/components/ChannelDetails/components/ChannelEditDetailsModal.js.map +0 -1
  510. package/lib/commonjs/components/ChannelDetails/components/members/ChannelAddMembers.js.map +0 -1
  511. package/lib/commonjs/components/ChannelDetails/components/members/ChannelAddMembersModal.js +0 -133
  512. package/lib/commonjs/components/ChannelDetails/components/members/ChannelAddMembersModal.js.map +0 -1
  513. package/lib/commonjs/components/ChannelDetails/components/members/ChannelAllMembersModal.js +0 -64
  514. package/lib/commonjs/components/ChannelDetails/components/members/ChannelAllMembersModal.js.map +0 -1
  515. package/lib/commonjs/components/ChannelDetails/hooks/members/useMemberRoleLabel.js.map +0 -1
  516. package/lib/module/components/ChannelDetails/components/ChannelEditDetails.js.map +0 -1
  517. package/lib/module/components/ChannelDetails/components/ChannelEditDetailsModal.js +0 -152
  518. package/lib/module/components/ChannelDetails/components/ChannelEditDetailsModal.js.map +0 -1
  519. package/lib/module/components/ChannelDetails/components/members/ChannelAddMembers.js.map +0 -1
  520. package/lib/module/components/ChannelDetails/components/members/ChannelAddMembersModal.js +0 -133
  521. package/lib/module/components/ChannelDetails/components/members/ChannelAddMembersModal.js.map +0 -1
  522. package/lib/module/components/ChannelDetails/components/members/ChannelAllMembersModal.js +0 -64
  523. package/lib/module/components/ChannelDetails/components/members/ChannelAllMembersModal.js.map +0 -1
  524. package/lib/module/components/ChannelDetails/hooks/members/useMemberRoleLabel.js.map +0 -1
  525. package/lib/typescript/components/ChannelDetails/components/ChannelEditDetails.d.ts +0 -6
  526. package/lib/typescript/components/ChannelDetails/components/ChannelEditDetails.d.ts.map +0 -1
  527. package/lib/typescript/components/ChannelDetails/components/ChannelEditDetailsModal.d.ts +0 -18
  528. package/lib/typescript/components/ChannelDetails/components/ChannelEditDetailsModal.d.ts.map +0 -1
  529. package/lib/typescript/components/ChannelDetails/components/members/ChannelAddMembers.d.ts.map +0 -1
  530. package/lib/typescript/components/ChannelDetails/components/members/ChannelAddMembersModal.d.ts +0 -18
  531. package/lib/typescript/components/ChannelDetails/components/members/ChannelAddMembersModal.d.ts.map +0 -1
  532. package/lib/typescript/components/ChannelDetails/components/members/ChannelAllMembersModal.d.ts +0 -17
  533. package/lib/typescript/components/ChannelDetails/components/members/ChannelAllMembersModal.d.ts.map +0 -1
  534. package/lib/typescript/components/ChannelDetails/hooks/members/useMemberRoleLabel.d.ts +0 -10
  535. package/lib/typescript/components/ChannelDetails/hooks/members/useMemberRoleLabel.d.ts.map +0 -1
  536. package/src/components/ChannelDetails/__tests__/members/ChannelAllMembersModal.test.tsx +0 -159
  537. package/src/components/ChannelDetails/__tests__/members/useMemberRoleLabel.test.tsx +0 -130
  538. package/src/components/ChannelDetails/components/ChannelEditDetailsModal.tsx +0 -152
  539. package/src/components/ChannelDetails/components/members/ChannelAddMembersModal.tsx +0 -126
  540. package/src/components/ChannelDetails/components/members/ChannelAllMembersModal.tsx +0 -71
  541. package/src/components/ChannelDetails/hooks/members/useMemberRoleLabel.ts +0 -32
@@ -17,7 +17,7 @@ import { TranslationProvider } from '../../../contexts/translationContext/Transl
17
17
  import { generateFileReference } from '../../../mock-builders/attachments';
18
18
  import { NativeHandlers } from '../../../native';
19
19
  import { EditChannelDetailsStore } from '../../../state-store/edit-channel-details-store';
20
- import { ChannelEditDetails } from '../components/ChannelEditDetails';
20
+ import { ChannelEditDetailsFormContent } from '../components/ChannelEditDetailsFormContent';
21
21
  import type { ChannelEditImageSheetProps } from '../components/ChannelEditImageSheet';
22
22
 
23
23
  type SheetProbeRecord = ChannelEditImageSheetProps;
@@ -80,10 +80,10 @@ const renderComponent = ({ channel }: { channel: Channel }) => {
80
80
  { client: { on: () => ({ unsubscribe: () => undefined }), userID: 'me' } } as never
81
81
  }
82
82
  >
83
- <ChannelDetailsContextProvider value={{ channel }}>
84
- <ChannelEditDetailsContext.Provider value={{ store }}>
83
+ <ChannelDetailsContextProvider channel={channel}>
84
+ <ChannelEditDetailsContext.Provider value={{ store, submit: jest.fn() }}>
85
85
  <WithComponents overrides={{ ChannelEditImageSheet: SheetProbe }}>
86
- <ChannelEditDetails />
86
+ <ChannelEditDetailsFormContent />
87
87
  </WithComponents>
88
88
  </ChannelEditDetailsContext.Provider>
89
89
  </ChannelDetailsContextProvider>
@@ -96,7 +96,7 @@ const renderComponent = ({ channel }: { channel: Channel }) => {
96
96
 
97
97
  const latestSheetProps = () => sheetCalls[sheetCalls.length - 1];
98
98
 
99
- describe('ChannelEditDetails', () => {
99
+ describe('ChannelEditDetailsFormContent', () => {
100
100
  beforeEach(() => {
101
101
  sheetCalls.length = 0;
102
102
  });
@@ -128,14 +128,14 @@ describe('ChannelEditDetails', () => {
128
128
  { client: { on: () => ({ unsubscribe: () => undefined }), userID: 'me' } } as never
129
129
  }
130
130
  >
131
- <ChannelDetailsContextProvider value={{ channel: buildChannel() }}>
131
+ <ChannelDetailsContextProvider channel={buildChannel()}>
132
132
  <ChannelEditDetailsContext.Provider
133
- value={{ store: new EditChannelDetailsStore(buildChannel()) }}
133
+ value={{ store: new EditChannelDetailsStore(buildChannel()), submit: jest.fn() }}
134
134
  >
135
135
  <WithComponents
136
136
  overrides={{ ChannelEditImageSheet: SheetProbe, ChannelEditName: NameProbe }}
137
137
  >
138
- <ChannelEditDetails />
138
+ <ChannelEditDetailsFormContent />
139
139
  </WithComponents>
140
140
  </ChannelEditDetailsContext.Provider>
141
141
  </ChannelDetailsContextProvider>
@@ -97,7 +97,7 @@ const renderSheet = ({
97
97
  userLanguage: 'en',
98
98
  }}
99
99
  >
100
- <ChannelEditDetailsContext.Provider value={{ store }}>
100
+ <ChannelEditDetailsContext.Provider value={{ store, submit: jest.fn() }}>
101
101
  <WithComponents overrides={{ ChannelDetailsActionItem: ActionItemProbe }}>
102
102
  <ChannelEditImageSheet onClose={onClose} visible={visible} />
103
103
  </WithComponents>
@@ -37,7 +37,7 @@ const renderComponent = ({ channel }: { channel: Channel }) => {
37
37
  { client: { on: () => ({ unsubscribe: () => undefined }), userID: 'me' } } as never
38
38
  }
39
39
  >
40
- <ChannelEditDetailsContext.Provider value={{ store }}>
40
+ <ChannelEditDetailsContext.Provider value={{ store, submit: jest.fn() }}>
41
41
  <ChannelEditName />
42
42
  </ChannelEditDetailsContext.Provider>
43
43
  </ChatContext.Provider>
@@ -0,0 +1,163 @@
1
+ import React from 'react';
2
+ import { StyleSheet } from 'react-native';
3
+
4
+ import { fireEvent, render, screen } from '@testing-library/react-native';
5
+
6
+ type ReactTestInstance = ReturnType<typeof screen.getByTestId>;
7
+ import type { Channel } from 'stream-chat';
8
+
9
+ import { AccessibilityProvider } from '../../../../contexts/accessibilityContext/AccessibilityContext';
10
+ import { ChannelDetailsContextProvider } from '../../../../contexts/channelDetailsContext/channelDetailsContext';
11
+ import {
12
+ allOwnCapabilities,
13
+ OwnCapabilitiesContextValue,
14
+ OwnCapability,
15
+ } from '../../../../contexts/ownCapabilitiesContext/OwnCapabilitiesContext';
16
+ import { ThemeProvider } from '../../../../contexts/themeContext/ThemeContext';
17
+ import { defaultTheme } from '../../../../contexts/themeContext/utils/theme';
18
+ import { TranslationProvider } from '../../../../contexts/translationContext/TranslationContext';
19
+ import { ChannelAddMembersButton } from '../../components/members/ChannelAddMembersButton';
20
+
21
+ // Replace the modal wrapper with a lightweight probe that renders regardless of `visible`
22
+ // (and ignores its children, so the real add-members form never mounts). This lets tests
23
+ // distinguish "modal mounted" from "modal not mounted" and observe its open/closed state.
24
+ jest.mock('../../components/modal/Modal', () => ({
25
+ ChannelDetailsModal: ({ visible }: { visible: boolean }) => {
26
+ const { Text: RNText } = require('react-native');
27
+ return <RNText testID='add-members-modal'>{visible ? 'visible' : 'hidden'}</RNText>;
28
+ },
29
+ }));
30
+
31
+ const buildChannel = (overrides?: Partial<OwnCapabilitiesContextValue>): Channel => {
32
+ const ownCapabilities = overrides
33
+ ? Object.entries(overrides)
34
+ .filter(([, enabled]) => enabled)
35
+ .map(([key]) => allOwnCapabilities[key as OwnCapability])
36
+ : undefined;
37
+ return {
38
+ cid: 'messaging:test',
39
+ data: ownCapabilities ? { own_capabilities: ownCapabilities } : {},
40
+ on: () => ({ unsubscribe: () => undefined }),
41
+ state: { members: {} },
42
+ } as unknown as Channel;
43
+ };
44
+
45
+ const TEST_ID = 'channel-details-add-members-button';
46
+
47
+ // Walks up the rendered tree to confirm some host ancestor received `width: 'auto'`
48
+ // (the forwarded style overriding the Button's default `width: '100%'`).
49
+ const hasAncestorWithStyle = (instance: ReactTestInstance | null): boolean => {
50
+ for (let node = instance; node; node = node.parent) {
51
+ if (typeof node.type === 'string') {
52
+ const flattened = StyleSheet.flatten(node.props.style) ?? {};
53
+ if (flattened.width === 'auto') {
54
+ return true;
55
+ }
56
+ }
57
+ }
58
+ return false;
59
+ };
60
+
61
+ const renderButton = ({
62
+ capabilities,
63
+ onPress,
64
+ style,
65
+ variant,
66
+ }: {
67
+ capabilities?: Partial<OwnCapabilitiesContextValue>;
68
+ onPress?: () => void;
69
+ style?: React.ComponentProps<typeof ChannelAddMembersButton>['style'];
70
+ variant?: 'icon' | 'text';
71
+ } = {}) =>
72
+ render(
73
+ <ThemeProvider theme={defaultTheme}>
74
+ <AccessibilityProvider value={{ enabled: true }}>
75
+ <TranslationProvider
76
+ value={{
77
+ t: ((key: string) => key) as never,
78
+ tDateTimeParser: ((input: unknown) => input) as never,
79
+ userLanguage: 'en',
80
+ }}
81
+ >
82
+ <ChannelDetailsContextProvider channel={buildChannel(capabilities)}>
83
+ <ChannelAddMembersButton
84
+ onPress={onPress}
85
+ style={style}
86
+ testID={TEST_ID}
87
+ variant={variant}
88
+ />
89
+ </ChannelDetailsContextProvider>
90
+ </TranslationProvider>
91
+ </AccessibilityProvider>
92
+ </ThemeProvider>,
93
+ );
94
+
95
+ describe('ChannelAddMembersButton', () => {
96
+ it('renders nothing when the user lacks the update-channel-members capability', () => {
97
+ renderButton();
98
+
99
+ expect(screen.queryByTestId(TEST_ID)).toBeNull();
100
+ });
101
+
102
+ it('renders the text variant when the user has the capability', () => {
103
+ renderButton({ capabilities: { updateChannelMembers: true }, variant: 'text' });
104
+
105
+ expect(screen.getByTestId(TEST_ID)).toBeTruthy();
106
+ expect(screen.getByText('Add')).toBeTruthy();
107
+ });
108
+
109
+ it('renders the icon variant when the user has the capability', () => {
110
+ renderButton({ capabilities: { updateChannelMembers: true }, variant: 'icon' });
111
+
112
+ expect(screen.getByTestId(TEST_ID)).toBeTruthy();
113
+ // The icon variant has no visible label.
114
+ expect(screen.queryByText('Add')).toBeNull();
115
+ });
116
+
117
+ it('defaults to the text variant', () => {
118
+ renderButton({ capabilities: { updateChannelMembers: true } });
119
+
120
+ expect(screen.getByText('Add')).toBeTruthy();
121
+ });
122
+
123
+ it.each(['text', 'icon'] as const)(
124
+ 'forwards the style prop to the underlying Button (%s variant)',
125
+ (variant) => {
126
+ renderButton({
127
+ capabilities: { updateChannelMembers: true },
128
+ style: { width: 'auto' },
129
+ variant,
130
+ });
131
+
132
+ // The style lands on the Button's outer wrapper View, a host ancestor of the
133
+ // testID-carrying Pressable. Search ancestors for the one that received it.
134
+ expect(hasAncestorWithStyle(screen.getByTestId(TEST_ID))).toBe(true);
135
+ },
136
+ );
137
+
138
+ it('invokes the onPress override and does not open the modal', () => {
139
+ const onPress = jest.fn();
140
+
141
+ renderButton({ capabilities: { updateChannelMembers: true }, onPress });
142
+
143
+ fireEvent.press(screen.getByTestId(TEST_ID));
144
+
145
+ expect(onPress).toHaveBeenCalledTimes(1);
146
+ });
147
+
148
+ it('mounts the built-in modal and opens it on press when no override is provided', () => {
149
+ renderButton({ capabilities: { updateChannelMembers: true } });
150
+
151
+ expect(screen.getByTestId('add-members-modal')).toHaveTextContent('hidden');
152
+
153
+ fireEvent.press(screen.getByTestId(TEST_ID));
154
+
155
+ expect(screen.getByTestId('add-members-modal')).toHaveTextContent('visible');
156
+ });
157
+
158
+ it('does not mount the built-in modal when a custom onPress is provided', () => {
159
+ renderButton({ capabilities: { updateChannelMembers: true }, onPress: jest.fn() });
160
+
161
+ expect(screen.queryByTestId('add-members-modal')).toBeNull();
162
+ });
163
+ });
@@ -21,13 +21,13 @@ import { TranslationProvider } from '../../../../contexts/translationContext/Tra
21
21
  import { useChannelActions } from '../../../../hooks/actions/useChannelActions';
22
22
  import { generateMember } from '../../../../mock-builders/generator/member';
23
23
  import { generateUser } from '../../../../mock-builders/generator/user';
24
- import { ChannelAddMembersModal } from '../../components/members/ChannelAddMembersModal';
24
+ import { ChannelAddMembersForm } from '../../components/members/ChannelAddMembersForm';
25
25
 
26
26
  jest.mock('../../../../hooks/actions/useChannelActions');
27
27
  const mockedUseChannelActions = jest.mocked(useChannelActions);
28
28
 
29
- // Stands in for the real ChannelAddMembers list: drives the shared selection store
30
- // directly instead of running the search source / list.
29
+ // Stands in for the real ChannelAddMembersFormContent list: drives the shared
30
+ // selection store directly instead of running the search source / list.
31
31
  const AddMembersProbe = () => {
32
32
  const { selectionStore } = useChannelAddMembersContext();
33
33
  return (
@@ -76,16 +76,14 @@ const applyCapabilities = (
76
76
  return channel;
77
77
  };
78
78
 
79
- const renderModal = ({
79
+ const renderForm = ({
80
80
  capabilities,
81
81
  channel,
82
82
  onClose = jest.fn(),
83
- visible = true,
84
83
  }: {
85
84
  channel: Channel;
86
85
  capabilities?: Partial<OwnCapabilitiesContextValue>;
87
86
  onClose?: () => void;
88
- visible?: boolean;
89
87
  }) =>
90
88
  render(
91
89
  <ThemeProvider theme={defaultTheme}>
@@ -100,11 +98,9 @@ const renderModal = ({
100
98
  <ChatContext.Provider
101
99
  value={{ client: { notifications: new NotificationManager(), userID: 'me' } } as never}
102
100
  >
103
- <ChannelDetailsContextProvider
104
- value={{ channel: applyCapabilities(channel, capabilities) }}
105
- >
106
- <WithComponents overrides={{ ChannelAddMembers: AddMembersProbe }}>
107
- <ChannelAddMembersModal onClose={onClose} visible={visible} />
101
+ <ChannelDetailsContextProvider channel={applyCapabilities(channel, capabilities)}>
102
+ <WithComponents overrides={{ ChannelAddMembersFormContent: AddMembersProbe }}>
103
+ <ChannelAddMembersForm onClose={onClose} />
108
104
  </WithComponents>
109
105
  </ChannelDetailsContextProvider>
110
106
  </ChatContext.Provider>
@@ -118,13 +114,11 @@ const makeMembers = (count: number) =>
118
114
  generateMember({ user: generateUser({ id: `u-${idx}`, name: `User ${idx}` }) }),
119
115
  );
120
116
 
121
- describe('ChannelAddMembersModal', () => {
117
+ describe('ChannelAddMembersForm', () => {
122
118
  let addMembersSpy: jest.Mock;
123
119
 
124
120
  beforeEach(() => {
125
- addMembersSpy = jest.fn(async (_ids: string[], options?: { onSuccess?: () => unknown }) => {
126
- await options?.onSuccess?.();
127
- });
121
+ addMembersSpy = jest.fn().mockResolvedValue(undefined);
128
122
  mockedUseChannelActions.mockReturnValue({
129
123
  addMembers: addMembersSpy,
130
124
  } as unknown as ReturnType<typeof useChannelActions>);
@@ -135,10 +129,10 @@ describe('ChannelAddMembersModal', () => {
135
129
  mockedUseChannelActions.mockReset();
136
130
  });
137
131
 
138
- it('enables the confirm button only while ChannelAddMembers reports a selection', () => {
132
+ it('enables the confirm button only while the form content reports a selection', () => {
139
133
  const channel = buildChannel(makeMembers(3), 3);
140
134
 
141
- renderModal({ channel });
135
+ renderForm({ channel });
142
136
 
143
137
  const confirm = screen.getByTestId('channel-details-add-members-confirm-button');
144
138
  expect(confirm.props.accessibilityState).toMatchObject({ disabled: true });
@@ -154,11 +148,11 @@ describe('ChannelAddMembersModal', () => {
154
148
  ).toMatchObject({ disabled: true });
155
149
  });
156
150
 
157
- it('calls addMembers from useChannelActions with the selected user ids and closes the sheet on confirm', async () => {
151
+ it('calls addMembers from useChannelActions with the selected user ids and closes the form on confirm', async () => {
158
152
  const channel = buildChannel(makeMembers(3), 3);
159
153
  const onClose = jest.fn();
160
154
 
161
- renderModal({ channel, onClose });
155
+ renderForm({ channel, onClose });
162
156
 
163
157
  fireEvent.press(screen.getByTestId('probe-select-one'));
164
158
 
@@ -169,7 +163,7 @@ describe('ChannelAddMembersModal', () => {
169
163
 
170
164
  expect(addMembersSpy).toHaveBeenCalledWith(
171
165
  ['picked-1'],
172
- expect.objectContaining({ onSuccess: expect.any(Function) }),
166
+ expect.objectContaining({ onFailure: expect.any(Function) }),
173
167
  );
174
168
  expect(channel.addMembers).not.toHaveBeenCalled();
175
169
  await waitFor(() => expect(onClose).toHaveBeenCalledTimes(1));
@@ -179,19 +173,23 @@ describe('ChannelAddMembersModal', () => {
179
173
  const channel = buildChannel(makeMembers(3), 3);
180
174
  const onClose = jest.fn();
181
175
 
182
- renderModal({ channel, onClose });
176
+ renderForm({ channel, onClose });
183
177
 
184
178
  fireEvent.press(screen.getByLabelText('a11y/Close'));
185
179
  expect(onClose).toHaveBeenCalledTimes(1);
186
180
  });
187
181
 
188
- it('keeps the sheet open and re-enables confirm when addMembers does not invoke onSuccess', async () => {
182
+ it('keeps the form open and re-enables confirm when addMembers invokes onFailure', async () => {
189
183
  const warnSpy = jest.spyOn(console, 'warn').mockImplementation(() => undefined);
190
- addMembersSpy.mockResolvedValueOnce(undefined);
184
+ addMembersSpy.mockImplementationOnce(
185
+ async (_ids: string[], options?: { onFailure?: (error: unknown) => unknown }) => {
186
+ await options?.onFailure?.(new Error('failed'));
187
+ },
188
+ );
191
189
  const channel = buildChannel(makeMembers(3), 3);
192
190
  const onClose = jest.fn();
193
191
 
194
- renderModal({ channel, onClose });
192
+ renderForm({ channel, onClose });
195
193
 
196
194
  fireEvent.press(screen.getByTestId('probe-select-one'));
197
195
 
@@ -203,7 +201,7 @@ describe('ChannelAddMembersModal', () => {
203
201
 
204
202
  expect(addMembersSpy).toHaveBeenCalledWith(
205
203
  ['picked-1'],
206
- expect.objectContaining({ onSuccess: expect.any(Function) }),
204
+ expect.objectContaining({ onFailure: expect.any(Function) }),
207
205
  );
208
206
  expect(onClose).not.toHaveBeenCalled();
209
207
  expect(screen.getByTestId('add-members-probe')).toBeTruthy();
@@ -11,7 +11,7 @@ import { TranslationProvider } from '../../../../contexts/translationContext/Tra
11
11
  import { generateUser } from '../../../../mock-builders/generator/user';
12
12
  import { SelectionStore } from '../../../../state-store/selection-store';
13
13
  import type { AddMemberSearchResultItemProps } from '../../components/members/AddMemberSearchResultItem';
14
- import { ChannelAddMembers } from '../../components/members/ChannelAddMembers';
14
+ import { ChannelAddMembersFormContent } from '../../components/members/ChannelAddMembersFormContent';
15
15
 
16
16
  const mockRowProbe: AddMemberSearchResultItemProps[] = [];
17
17
 
@@ -98,13 +98,15 @@ const tree = (
98
98
  }}
99
99
  >
100
100
  <ChannelAddMembersContext.Provider value={{ searchSource, selectionStore } as never}>
101
- <ChannelAddMembers additionalFlatListProps={props.additionalFlatListProps as never} />
101
+ <ChannelAddMembersFormContent
102
+ additionalFlatListProps={props.additionalFlatListProps as never}
103
+ />
102
104
  </ChannelAddMembersContext.Provider>
103
105
  </TranslationProvider>
104
106
  </ThemeProvider>
105
107
  );
106
108
 
107
- describe('ChannelAddMembers', () => {
109
+ describe('ChannelAddMembersFormContent', () => {
108
110
  beforeEach(() => {
109
111
  mockRowProbe.length = 0;
110
112
  });
@@ -81,7 +81,7 @@ const renderSheet = ({
81
81
  } as never
82
82
  }
83
83
  >
84
- <ChannelDetailsContextProvider value={{ channel }}>
84
+ <ChannelDetailsContextProvider channel={channel}>
85
85
  <WithComponents overrides={{ ChannelDetailsActionItem: ActionItemProbe }}>
86
86
  <ChannelMemberActionsSheet member={member} onClose={onClose} visible={visible} />
87
87
  </WithComponents>
@@ -168,9 +168,14 @@ describe('ChannelMemberActionsSheet', () => {
168
168
  userLanguage: 'en',
169
169
  }}
170
170
  >
171
- <ChannelDetailsContextProvider value={{ channel, getChannelMemberActionItems }}>
171
+ <ChannelDetailsContextProvider channel={channel}>
172
172
  <WithComponents overrides={{ ChannelDetailsActionItem: ActionItemProbe }}>
173
- <ChannelMemberActionsSheet member={member} onClose={jest.fn()} visible />
173
+ <ChannelMemberActionsSheet
174
+ getChannelMemberActionItems={getChannelMemberActionItems}
175
+ member={member}
176
+ onClose={jest.fn()}
177
+ visible
178
+ />
174
179
  </WithComponents>
175
180
  </ChannelDetailsContextProvider>
176
181
  </TranslationProvider>
@@ -12,8 +12,8 @@ import { defaultTheme } from '../../../../contexts/themeContext/utils/theme';
12
12
  import { TranslationProvider } from '../../../../contexts/translationContext/TranslationContext';
13
13
  import { generateMember } from '../../../../mock-builders/generator/member';
14
14
  import { generateUser } from '../../../../mock-builders/generator/user';
15
- import type { GetMemberRoleLabel } from '../../ChannelDetails';
16
15
  import { ChannelMemberItem } from '../../components/members/ChannelMemberItem';
16
+ import type { GetMemberRoles } from '../../hooks/members/useMemberRoles';
17
17
 
18
18
  Dayjs.extend(relativeTime);
19
19
 
@@ -36,13 +36,13 @@ const defaultChannel = {
36
36
  const renderRow = ({
37
37
  channel = defaultChannel,
38
38
  currentUserId,
39
- getMemberRoleLabel,
39
+ getMemberRoles,
40
40
  mutedUsers = [],
41
41
  ...props
42
42
  }: React.ComponentProps<typeof ChannelMemberItem> & {
43
43
  channel?: Channel;
44
44
  currentUserId?: string;
45
- getMemberRoleLabel?: GetMemberRoleLabel;
45
+ getMemberRoles?: GetMemberRoles;
46
46
  mutedUsers?: Array<{ target: { id: string }; user: { id: string } }>;
47
47
  }) =>
48
48
  render(
@@ -70,8 +70,8 @@ const renderRow = ({
70
70
  } as never
71
71
  }
72
72
  >
73
- <ChannelDetailsContextProvider value={{ channel, getMemberRoleLabel }}>
74
- <ChannelMemberItem {...props} />
73
+ <ChannelDetailsContextProvider channel={channel}>
74
+ <ChannelMemberItem getMemberRoles={getMemberRoles} {...props} />
75
75
  </ChannelDetailsContextProvider>
76
76
  </ChatContext.Provider>
77
77
  </TranslationProvider>
@@ -96,7 +96,7 @@ describe('ChannelMemberItem accessibility', () => {
96
96
 
97
97
  it('includes the role label in the accessible label between name and status', () => {
98
98
  renderRow({
99
- getMemberRoleLabel: () => 'Admin',
99
+ getMemberRoles: () => [{ key: 'admin', label: 'Admin' }],
100
100
  member: memberFor(),
101
101
  });
102
102
  expect(screen.getByLabelText('Alice, Admin, Offline')).toBeTruthy();
@@ -131,7 +131,7 @@ describe('ChannelMemberItem muted indicator', () => {
131
131
  describe('ChannelMemberItem large variant', () => {
132
132
  it('renders the role label in the large profile header', () => {
133
133
  renderRow({
134
- getMemberRoleLabel: () => 'Admin',
134
+ getMemberRoles: () => [{ key: 'admin', label: 'Admin' }],
135
135
  member: memberFor(),
136
136
  size: 'lg',
137
137
  });
@@ -162,17 +162,17 @@ describe('ChannelMemberItem activity status', () => {
162
162
  });
163
163
 
164
164
  describe('ChannelMemberItem role label rendering', () => {
165
- it('renders the role label string returned by useMemberRoleLabel', () => {
165
+ it('renders a badge for each role returned by useMemberRoles', () => {
166
166
  renderRow({
167
- getMemberRoleLabel: () => 'Admin',
167
+ getMemberRoles: () => [{ key: 'admin', label: 'Admin' }],
168
168
  member: memberFor(),
169
169
  });
170
170
  expect(screen.getByText('Admin')).toBeTruthy();
171
171
  });
172
172
 
173
- it('renders no role label when the hook returns null', () => {
173
+ it('renders no role badges when the hook returns an empty array', () => {
174
174
  renderRow({
175
- getMemberRoleLabel: () => null,
175
+ getMemberRoles: () => [],
176
176
  member: memberFor(),
177
177
  });
178
178
  expect(screen.queryByText('Admin')).toBeNull();
@@ -27,6 +27,12 @@ const mockProviderProbe: { channel: unknown }[] = [];
27
27
  const mockNotificationTargetProbe: { hostId?: string; panel?: string }[] = [];
28
28
  const mockAddNotification = jest.fn();
29
29
 
30
+ let mockMemberCount = 1;
31
+
32
+ jest.mock('../../../../hooks/useChannelMemberCount', () => ({
33
+ useChannelMemberCount: () => mockMemberCount,
34
+ }));
35
+
30
36
  jest.mock('../../../Notifications/hooks/useNotificationApi', () => ({
31
37
  useNotificationApi: () => ({ addNotification: mockAddNotification }),
32
38
  }));
@@ -66,7 +72,6 @@ jest.mock('../../../../contexts/channelMemberListContext/ChannelMemberListContex
66
72
  return children;
67
73
  },
68
74
  useChannelMemberListContext: () => ({
69
- channel: mockChannel,
70
75
  searchSource: mockCurrentSearchSource,
71
76
  }),
72
77
  }));
@@ -94,6 +99,7 @@ jest.mock('../../../UIComponents/SearchInput', () => {
94
99
  });
95
100
 
96
101
  type FakeSearchSource = {
102
+ resetStateAndActivate: jest.Mock;
97
103
  search: jest.Mock;
98
104
  state: StateStore<
99
105
  Pick<
@@ -122,6 +128,7 @@ const makeSearchSource = (
122
128
  // The component calls state.partialNext on search input change; spy on it.
123
129
  jest.spyOn(state, 'partialNext');
124
130
  return {
131
+ resetStateAndActivate: jest.fn(),
125
132
  search: jest.fn(),
126
133
  state: state as FakeSearchSource['state'],
127
134
  };
@@ -147,7 +154,6 @@ const tree = (
147
154
  searchSource: FakeSearchSource,
148
155
  props: {
149
156
  additionalFlatListProps?: object;
150
- onMemberPress?: (member: ChannelMemberResponse) => void;
151
157
  } = {},
152
158
  ) => {
153
159
  mockCurrentSearchSource = searchSource;
@@ -161,12 +167,7 @@ const tree = (
161
167
  }}
162
168
  >
163
169
  <ChannelDetailsContextProvider
164
- value={
165
- {
166
- channel: mockChannel,
167
- onMemberPress: props.onMemberPress,
168
- } as unknown as ChannelDetailsContextValue
169
- }
170
+ channel={mockChannel as unknown as ChannelDetailsContextValue['channel']}
170
171
  >
171
172
  <WithComponents
172
173
  overrides={{
@@ -188,6 +189,7 @@ describe('ChannelMemberList', () => {
188
189
  mockSheetProbe.length = 0;
189
190
  mockProviderProbe.length = 0;
190
191
  mockNotificationTargetProbe.length = 0;
192
+ mockMemberCount = 1;
191
193
  });
192
194
 
193
195
  afterEach(() => jest.clearAllMocks());
@@ -298,7 +300,7 @@ describe('ChannelMemberList', () => {
298
300
  expect(screen.queryByTestId('channel-member-list')).toBeNull();
299
301
  });
300
302
 
301
- it('opens the per-member actions sheet on press when no onMemberPress override is provided, and closes it', () => {
303
+ it('opens the per-member actions sheet on press, and closes it', () => {
302
304
  const bob = generateMember({ user: generateUser({ id: 'bob', name: 'Bob' }) });
303
305
  render(tree(makeSearchSource({ items: [bob] })));
304
306
 
@@ -311,18 +313,6 @@ describe('ChannelMemberList', () => {
311
313
  expect(screen.queryByTestId('member-actions-sheet-probe')).toBeNull();
312
314
  });
313
315
 
314
- it('calls onMemberPress instead of opening the sheet when an override is provided', () => {
315
- const alice = generateMember({ user: generateUser({ id: 'alice', name: 'Alice' }) });
316
- const onMemberPress = jest.fn();
317
- render(tree(makeSearchSource({ items: [alice] }), { onMemberPress }));
318
-
319
- fireEvent.press(screen.getByTestId('member-alice'));
320
-
321
- expect(onMemberPress).toHaveBeenCalledTimes(1);
322
- expect(onMemberPress.mock.calls[0][0].user?.id).toBe('alice');
323
- expect(screen.queryByTestId('member-actions-sheet-probe')).toBeNull();
324
- });
325
-
326
316
  it('targets the channel-details panel with a channel-scoped notification host', () => {
327
317
  render(tree(makeSearchSource()));
328
318
 
@@ -360,4 +350,28 @@ describe('ChannelMemberList', () => {
360
350
 
361
351
  expect(mockAddNotification).not.toHaveBeenCalled();
362
352
  });
353
+
354
+ it('refreshes the list when the member count changes and there is no search query', () => {
355
+ const searchSource = makeSearchSource({ searchQuery: '' });
356
+ const { rerender } = render(tree(searchSource));
357
+ expect(searchSource.search).toHaveBeenCalledTimes(1);
358
+ searchSource.search.mockClear();
359
+
360
+ mockMemberCount = 2;
361
+ rerender(tree(searchSource));
362
+
363
+ expect(searchSource.search).toHaveBeenCalledTimes(1);
364
+ expect(searchSource.search).toHaveBeenCalledWith();
365
+ });
366
+
367
+ it('does not refresh the list when the member count changes while a search query is active', () => {
368
+ const searchSource = makeSearchSource({ searchQuery: 'alice' });
369
+ const { rerender } = render(tree(searchSource));
370
+ searchSource.search.mockClear();
371
+
372
+ mockMemberCount = 2;
373
+ rerender(tree(searchSource));
374
+
375
+ expect(searchSource.search).not.toHaveBeenCalled();
376
+ });
363
377
  });