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
@@ -0,0 +1,31 @@
1
+ import React from 'react';
2
+
3
+ import { render, screen } from '@testing-library/react-native';
4
+
5
+ import { ThemeProvider } from '../../../../../contexts';
6
+ import { defaultTheme } from '../../../../../contexts/themeContext/utils/theme';
7
+ import type { RoleLabel } from '../../../hooks/members/useMemberRoles';
8
+ import { RoleList } from '../RoleList';
9
+
10
+ const renderList = (roles: RoleLabel[]) =>
11
+ render(
12
+ <ThemeProvider theme={defaultTheme}>
13
+ <RoleList roles={roles} />
14
+ </ThemeProvider>,
15
+ );
16
+
17
+ describe('RoleList', () => {
18
+ it('renders a badge for each role', () => {
19
+ renderList([
20
+ { key: 'owner', label: 'Owner' },
21
+ { key: 'admin', label: 'Admin' },
22
+ ]);
23
+ expect(screen.getByText('Owner')).toBeTruthy();
24
+ expect(screen.getByText('Admin')).toBeTruthy();
25
+ });
26
+
27
+ it('renders nothing when there are no roles', () => {
28
+ const { toJSON } = renderList([]);
29
+ expect(toJSON()).toBeNull();
30
+ });
31
+ });
@@ -0,0 +1,2 @@
1
+ export * from './RoleItem';
2
+ export * from './RoleList';
@@ -1 +1 @@
1
- export * from './useMemberRoleLabel';
1
+ export * from './useMemberRoles';
@@ -0,0 +1,63 @@
1
+ import type { Channel, ChannelMemberResponse } from 'stream-chat';
2
+
3
+ import { useChannelDetailsContext } from '../../../../contexts/channelDetailsContext/channelDetailsContext';
4
+ import type { TranslationContextValue } from '../../../../contexts/translationContext/TranslationContext';
5
+ import { useTranslationContext } from '../../../../contexts/translationContext/TranslationContext';
6
+
7
+ /**
8
+ * A single role shown next to a member row.
9
+ *
10
+ * - `key` is the raw role identifier (`'owner'`, `'admin'`, `'moderator'`, …).
11
+ * - `label` is the translated, user-facing text.
12
+ */
13
+ export type RoleLabel = {
14
+ key: string;
15
+ label: string;
16
+ };
17
+
18
+ /**
19
+ * Override the roles shown next to each member in the channel details screen.
20
+ *
21
+ * Receives `defaultRoleLabels` — the roles the default implementation computed for this member —
22
+ * so a custom implementation can reuse or extend them (e.g. `[...defaultRoleLabels, customRole]`),
23
+ * and returns the list of roles to render (or an empty array to render none). The default
24
+ * implementation marks members as `owner` (channel creator), `admin` (`user.role === 'admin'`)
25
+ * and `moderator` (`channel_role === 'channel_moderator'`), returning every role that applies.
26
+ */
27
+ export type GetMemberRoles = (params: {
28
+ channel: Channel;
29
+ defaultRoleLabels: RoleLabel[];
30
+ member: ChannelMemberResponse;
31
+ t: TranslationContextValue['t'];
32
+ }) => RoleLabel[];
33
+
34
+ /**
35
+ * Resolves the trailing role badges for a channel member row in the channel details screen.
36
+ *
37
+ * Returns every applicable role in the order Owner > Admin > Moderator. When a member matches
38
+ * none of the rules (and no custom `getMemberRoles` is provided), returns an empty array.
39
+ */
40
+ export const useMemberRoles = (
41
+ member: ChannelMemberResponse,
42
+ getMemberRoles?: GetMemberRoles,
43
+ ): RoleLabel[] => {
44
+ const { channel } = useChannelDetailsContext();
45
+ const { t } = useTranslationContext();
46
+
47
+ const defaultRoleLabels: RoleLabel[] = [];
48
+ const userId = member.user?.id;
49
+ if (userId && userId === channel?.data?.created_by?.id) {
50
+ defaultRoleLabels.push({ key: 'owner', label: t('Owner') });
51
+ }
52
+ if (member.user?.role === 'admin') {
53
+ defaultRoleLabels.push({ key: 'admin', label: t('Admin') });
54
+ }
55
+ if (member.channel_role === 'channel_moderator') {
56
+ defaultRoleLabels.push({ key: 'moderator', label: t('Moderator') });
57
+ }
58
+
59
+ if (getMemberRoles) {
60
+ return getMemberRoles({ channel, defaultRoleLabels, member, t }) ?? [];
61
+ }
62
+ return defaultRoleLabels;
63
+ };
@@ -3,14 +3,18 @@ import { useMemo } from 'react';
3
3
  import { useChannelDetailsContext } from '../../../contexts/channelDetailsContext/channelDetailsContext';
4
4
  import {
5
5
  ChannelActionItem,
6
+ GetChannelActionItems,
6
7
  useChannelActionItems,
7
8
  } from '../../../hooks/actions/useChannelActionItems';
8
9
 
9
- /**
10
- * @experimental This hook is experimental and is subject to change.
11
- */
12
- export const useChannelDetailsActionItems = (): ChannelActionItem[] => {
13
- const { channel, getChannelActionItems, onChannelDismiss } = useChannelDetailsContext();
10
+ export const useChannelDetailsActionItems = ({
11
+ getChannelActionItems,
12
+ onChannelDismiss,
13
+ }: {
14
+ getChannelActionItems?: GetChannelActionItems;
15
+ onChannelDismiss?: () => void;
16
+ } = {}): ChannelActionItem[] => {
17
+ const { channel } = useChannelDetailsContext();
14
18
 
15
19
  const items = useChannelActionItems({ channel, getChannelActionItems, surface: 'details' });
16
20
 
@@ -12,7 +12,6 @@ import { useChannelOnlineMemberCount } from '../../ChannelList/hooks/useChannelO
12
12
  * Resolves the subtitle status line shown under the channel title.
13
13
  * - Direct chats: `t('Online')` when the other member is online, otherwise an empty string.
14
14
  * - Group chats: `t('{{memberCount}} members, {{onlineCount}} online')`.
15
- * @experimental This hook is experimental and is subject to change.
16
15
  */
17
16
  export const useChannelDetailsMemberStatusText = (channel: Channel): string => {
18
17
  const { t } = useTranslationContext();
@@ -13,9 +13,6 @@ export type ChannelDetailsMembersPreview = {
13
13
  visible: ChannelMemberResponse[];
14
14
  };
15
15
 
16
- /**
17
- * @experimental This hook is experimental and is subject to change.
18
- */
19
16
  export const useChannelDetailsMembersPreview = (
20
17
  channel: Channel,
21
18
  max: number = DEFAULT_VISIBLE_MEMBER_COUNT,
@@ -1,6 +1,5 @@
1
1
  import React, { useMemo } from 'react';
2
2
 
3
- import { useChannelDetailsContext } from '../../../contexts/channelDetailsContext/channelDetailsContext';
4
3
  import type { TranslationContextValue } from '../../../contexts/translationContext/TranslationContext';
5
4
  import { useTranslationContext } from '../../../contexts/translationContext/TranslationContext';
6
5
  import { Picture } from '../../../icons';
@@ -13,8 +12,6 @@ import type { IconProps } from '../../../icons/utils/base';
13
12
  * Identifies a navigation row. The literals are the built-in sections rendered by default;
14
13
  * consumers can also add their own rows with arbitrary section identifiers via `getNavigationItems`,
15
14
  * so any string is allowed.
16
- *
17
- * @experimental This type is experimental and is subject to change.
18
15
  */
19
16
  export type ChannelDetailsNavigationSectionType =
20
17
  | 'pinned-messages'
@@ -24,8 +21,6 @@ export type ChannelDetailsNavigationSectionType =
24
21
 
25
22
  /**
26
23
  * A single row in the channel details navigation section.
27
- *
28
- * @experimental This type is experimental and is subject to change.
29
24
  */
30
25
  export type ChannelDetailsNavigationItem = {
31
26
  /** Icon rendered at the start of the row and reused in the built-in modal header. */
@@ -66,8 +61,6 @@ export type ChannelDetailsNavigationItemsContext = {
66
61
  * `defaultItems` to set a row's `onPress` (e.g. to push your own screen), or add/remove rows. Any
67
62
  * row whose `onPress` you leave unset keeps its built-in behavior (opening the built-in modal) —
68
63
  * including sections added in future SDK versions.
69
- *
70
- * @experimental This type is experimental and is subject to change.
71
64
  */
72
65
  export type GetChannelDetailsNavigationItems = (params: {
73
66
  context: ChannelDetailsNavigationItemsContext;
@@ -83,12 +76,13 @@ export const getChannelDetailsNavigationItems: GetChannelDetailsNavigationItems
83
76
  * plain array — the section component owns the built-in modal and supplies the default open-modal
84
77
  * behavior for any row without a custom `onPress`. Customize the rows by passing `getNavigationItems`
85
78
  * to `ChannelDetails` (see {@link GetChannelDetailsNavigationItems}).
86
- *
87
- * @experimental This hook is experimental and is subject to change.
88
79
  */
89
- export const useChannelDetailsNavigationItems = (): ChannelDetailsNavigationItem[] => {
80
+ export const useChannelDetailsNavigationItems = ({
81
+ getNavigationItems = getChannelDetailsNavigationItems,
82
+ }: {
83
+ getNavigationItems?: GetChannelDetailsNavigationItems;
84
+ } = {}): ChannelDetailsNavigationItem[] => {
90
85
  const { t } = useTranslationContext();
91
- const { getNavigationItems = getChannelDetailsNavigationItems } = useChannelDetailsContext();
92
86
 
93
87
  const context = useMemo<ChannelDetailsNavigationItemsContext>(() => ({ t }), [t]);
94
88
 
@@ -1,7 +1,7 @@
1
1
  import { useCallback } from 'react';
2
2
  import { Alert, Linking } from 'react-native';
3
3
 
4
- import { useChannelDetailsContext } from '../../../contexts/channelDetailsContext/channelDetailsContext';
4
+ import { useChannelEditDetailsContext } from '../../../contexts/channelEditDetailsContext/ChannelEditDetailsContext';
5
5
  import { useTranslationContext } from '../../../contexts/translationContext/TranslationContext';
6
6
  import { NativeHandlers } from '../../../native';
7
7
  import type { File } from '../../../types/types';
@@ -31,11 +31,10 @@ export type UseEditChannelImageResult = {
31
31
  * hook intentionally does NOT upload the picked file; the consumer receives a
32
32
  * `File` and decides what to do with it.
33
33
  *
34
- * Reads `compressImageQuality` from `ChannelDetailsContext`.
35
- * @experimental This hook is experimental and is subject to change.
34
+ * Reads `compressImageQuality` from `ChannelEditDetailsContext`.
36
35
  */
37
36
  export const useEditChannelImage = (): UseEditChannelImageResult => {
38
- const { compressImageQuality } = useChannelDetailsContext();
37
+ const { compressImageQuality } = useChannelEditDetailsContext();
39
38
  const { t } = useTranslationContext();
40
39
 
41
40
  const takePhoto = useCallback(async (): Promise<File | undefined> => {
@@ -14,8 +14,6 @@ import { getDateString } from '../../../utils/i18n/getDateString';
14
14
  /**
15
15
  * A single file/audio attachment paired with the message it belongs to. The file attachment list
16
16
  * renders one row per attachment, so a message with multiple file attachments yields multiple rows.
17
- *
18
- * @experimental This type is experimental and is subject to change.
19
17
  */
20
18
  export type FileAttachmentTile = { attachment: Attachment; message: MessageResponse };
21
19
 
@@ -42,7 +40,6 @@ const getFileAttachments = (message: MessageResponse): Attachment[] =>
42
40
  * pipeline used by message timestamps (see `useUserActivityStatus`), so the format
43
41
  * follows the configured locale and can be customized via the
44
42
  * `timestamp/FileAttachmentListSection` translation key.
45
- * @experimental This hook is experimental and is subject to change.
46
43
  */
47
44
  export const useFileAttachmentListSections = (
48
45
  messages?: MessageResponse[],
@@ -7,8 +7,6 @@ import { FileTypes } from '../../../types/types';
7
7
  /**
8
8
  * A single image/video attachment paired with the message it belongs to. The media grid renders
9
9
  * one tile per attachment, so a message with multiple media attachments yields multiple tiles.
10
- *
11
- * @experimental This type is experimental and is subject to change.
12
10
  */
13
11
  export type MediaTile = {
14
12
  attachment: Attachment;
@@ -44,8 +42,6 @@ const getMediaTiles = (messages: MessageResponse[] | undefined): MediaTile[] =>
44
42
  * Gathers and filters the image/video attachments from a list of messages into a flat list of
45
43
  * media tiles, ready to render in the media grid. Scraped/OG link-preview attachments and
46
44
  * non-media attachments are excluded.
47
- *
48
- * @experimental This hook is experimental and is subject to change.
49
45
  */
50
46
  export const useMediaList = (messages?: MessageResponse[]): MediaTile[] =>
51
47
  useMemo(() => getMediaTiles(messages), [messages]);
@@ -14,7 +14,6 @@ import { getDateString } from '../../../utils/i18n/getDateString';
14
14
  *
15
15
  * The relative time is produced through the shared `getDateString` + translation-key
16
16
  * pipeline used by message timestamps, so the format follows the configured locale.
17
- * @experimental This hook is experimental and is subject to change.
18
17
  */
19
18
  export const useUserActivityStatus = (user?: UserResponse): string => {
20
19
  const { t, tDateTimeParser } = useTranslationContext();
@@ -20,9 +20,6 @@ export type EmptyListProps = {
20
20
  subtitle?: string;
21
21
  };
22
22
 
23
- /**
24
- * @experimental This component is experimental and is subject to change.
25
- */
26
23
  export const EmptyList = ({ icon: Icon, subtitle, title }: EmptyListProps) => {
27
24
  const {
28
25
  theme: {
@@ -9,9 +9,6 @@ export type EmptySearchResultProps = {
9
9
  label: string;
10
10
  };
11
11
 
12
- /**
13
- * @experimental This component is experimental and is subject to change.
14
- */
15
12
  export const EmptySearchResult = ({ label }: EmptySearchResultProps) => {
16
13
  const {
17
14
  theme: {
@@ -56,9 +56,6 @@ const SkeletonRow = ({ skeleton }: { skeleton: ListLoadingSkeletonTheme }) => {
56
56
  );
57
57
  };
58
58
 
59
- /**
60
- * @experimental This component is experimental and is subject to change.
61
- */
62
59
  export const GenericListLoadingSkeleton = ({
63
60
  skeleton,
64
61
  testID,
@@ -13,9 +13,6 @@ import { Input, InputProps } from '../ui/Input/Input';
13
13
 
14
14
  export type SearchInputProps = Partial<InputProps>;
15
15
 
16
- /**
17
- * @experimental This component is experimental and is subject to change.
18
- */
19
16
  export const SearchInput = ({ onChangeText, ...props }: SearchInputProps) => {
20
17
  const { t } = useTranslationContext();
21
18
  const {
@@ -9,9 +9,6 @@ export type SelectionCircleProps = {
9
9
  selected: boolean;
10
10
  };
11
11
 
12
- /**
13
- * @experimental This component is experimental and is subject to change.
14
- */
15
12
  export const SelectionCircle = ({ selected }: SelectionCircleProps) => {
16
13
  const {
17
14
  theme: {
@@ -5,7 +5,13 @@ import { StyleProp, StyleSheet, Text, View, ViewStyle } from 'react-native';
5
5
  import { UserResponse } from 'stream-chat';
6
6
 
7
7
  import { Avatar, AvatarProps } from './Avatar';
8
- import { fontSizes, iconSizes, indicatorSizes, numberOfInitials } from './constants';
8
+ import {
9
+ fontSizes,
10
+ iconSizes,
11
+ indicatorPositions,
12
+ indicatorSizes,
13
+ numberOfInitials,
14
+ } from './constants';
9
15
 
10
16
  import { useTheme } from '../../../contexts/themeContext/ThemeContext';
11
17
  import { PeopleIcon } from '../../../icons/users';
@@ -57,7 +63,7 @@ export const UserAvatar = (props: UserAvatarProps) => {
57
63
  style={style}
58
64
  />
59
65
  {showOnlineIndicator ? (
60
- <View style={styles.onlineIndicatorWrapper}>
66
+ <View style={[styles.onlineIndicatorWrapper, indicatorPositions[size]]}>
61
67
  <OnlineIndicator online={true} size={indicatorSizes[size]} />
62
68
  </View>
63
69
  ) : null}
@@ -71,8 +77,6 @@ const useStyles = () => {
71
77
  StyleSheet.create({
72
78
  onlineIndicatorWrapper: {
73
79
  position: 'absolute',
74
- right: -2,
75
- top: -2,
76
80
  },
77
81
  }),
78
82
  [],
@@ -41,6 +41,45 @@ const indicatorSizes: Record<UserAvatarProps['size'], OnlineIndicatorProps['size
41
41
  xs: 'sm',
42
42
  };
43
43
 
44
+ const onlineIndicatorSizes: Record<
45
+ OnlineIndicatorProps['size'],
46
+ { borderWidth: number; height: number; width: number }
47
+ > = {
48
+ xl: {
49
+ borderWidth: 2,
50
+ height: 16,
51
+ width: 16,
52
+ },
53
+ lg: {
54
+ borderWidth: 2,
55
+ height: 14,
56
+ width: 14,
57
+ },
58
+ md: {
59
+ borderWidth: 2,
60
+ height: 12,
61
+ width: 12,
62
+ },
63
+ sm: {
64
+ borderWidth: 1,
65
+ height: 8,
66
+ width: 8,
67
+ },
68
+ };
69
+
70
+ // Anchors the presence dot on the avatar's circular edge at 45°:
71
+ // offset = avatarWidth / 2 * (1 - Math.SQRT1_2) - indicatorDiameter / 2 (rounded to px)
72
+ const indicatorPositions = (Object.keys(avatarSizes) as UserAvatarProps['size'][]).reduce(
73
+ (acc, size) => {
74
+ const avatarDiameter = avatarSizes[size].width;
75
+ const indicatorDiameter = onlineIndicatorSizes[indicatorSizes[size]].width;
76
+ const offset = Math.round((avatarDiameter / 2) * (1 - Math.SQRT1_2) - indicatorDiameter / 2);
77
+ acc[size] = { right: offset, top: offset };
78
+ return acc;
79
+ },
80
+ {} as Record<UserAvatarProps['size'], { right: number; top: number }>,
81
+ );
82
+
44
83
  const iconSizes: Record<UserAvatarProps['size'], number> = {
45
84
  xs: 10,
46
85
  sm: 12,
@@ -99,4 +138,12 @@ const numberOfInitials: Record<UserAvatarProps['size'], number> = {
99
138
  '2xl': 2,
100
139
  };
101
140
 
102
- export { indicatorSizes, iconSizes, fontSizes, numberOfInitials, avatarSizes };
141
+ export {
142
+ indicatorSizes,
143
+ onlineIndicatorSizes,
144
+ indicatorPositions,
145
+ iconSizes,
146
+ fontSizes,
147
+ numberOfInitials,
148
+ avatarSizes,
149
+ };
@@ -3,38 +3,24 @@ import { StyleSheet, View } from 'react-native';
3
3
 
4
4
  import { useTheme } from '../../../contexts/themeContext/ThemeContext';
5
5
  import { primitives } from '../../../theme';
6
+ import { onlineIndicatorSizes } from '../Avatar/constants';
6
7
 
7
8
  export type OnlineIndicatorProps = {
8
9
  online: boolean;
9
10
  size: 'xl' | 'lg' | 'sm' | 'md';
10
11
  };
11
12
 
12
- const sizes = {
13
- xl: {
14
- borderWidth: 2,
15
- height: 16,
16
- width: 16,
17
- },
18
- lg: {
19
- borderWidth: 2,
20
- height: 14,
21
- width: 14,
22
- },
23
- md: {
24
- borderWidth: 2,
25
- height: 12,
26
- width: 12,
27
- },
28
- sm: {
29
- borderWidth: 1,
30
- height: 8,
31
- width: 8,
32
- },
33
- };
34
-
35
13
  export const OnlineIndicator = ({ online, size = 'md' }: OnlineIndicatorProps) => {
36
14
  const styles = useStyles();
37
- return <View style={[styles.indicator, sizes[size], online ? styles.online : styles.offline]} />;
15
+ return (
16
+ <View
17
+ style={[
18
+ styles.indicator,
19
+ onlineIndicatorSizes[size],
20
+ online ? styles.online : styles.offline,
21
+ ]}
22
+ />
23
+ );
38
24
  };
39
25
 
40
26
  const useStyles = () => {
@@ -1,31 +1,62 @@
1
- import React, { PropsWithChildren, useContext, useState } from 'react';
1
+ import React, { PropsWithChildren, useContext, useMemo, useState } from 'react';
2
2
 
3
3
  import { UserSearchSource } from 'stream-chat';
4
4
 
5
5
  import { useChatContext } from '..';
6
+ import { NotificationTargetProvider } from '../../components/Notifications/NotificationTargetContext';
7
+ import { useChannelActions } from '../../hooks/actions/useChannelActions';
8
+ import { useStableCallback } from '../../hooks/useStableCallback';
6
9
  import { SelectionStore } from '../../state-store/selection-store';
10
+ import { useChannelDetailsContext } from '../channelDetailsContext/channelDetailsContext';
7
11
  import { DEFAULT_BASE_CONTEXT_VALUE } from '../utils/defaultBaseContextValue';
8
12
  import { isTestEnvironment } from '../utils/isTestEnvironment';
9
13
 
10
- /**
11
- * @experimental This API is experimental and is subject to change.
12
- */
13
14
  export type ChannelAddMembersContextValue = {
14
15
  selectionStore: SelectionStore;
15
16
  searchSource: UserSearchSource;
17
+ /**
18
+ * Adds the currently selected members to the channel. Resolves on success and
19
+ * rejects if the request fails.
20
+ */
21
+ submit: () => Promise<void>;
16
22
  };
17
23
 
24
+ /**
25
+ * Props for the {@link ChannelAddMembersProvider} that seed the add-members
26
+ * configuration into the context.
27
+ */
28
+ export type ChannelAddMembersProviderProps = PropsWithChildren<{
29
+ /**
30
+ * A custom `UserSearchSource` used to query and paginate the users to add.
31
+ * Overrides the source the provider creates by default (pre-configured to
32
+ * autocomplete by `name`). The provider uses it as-is, so the consumer owns
33
+ * its activation/sorting.
34
+ */
35
+ searchSource?: UserSearchSource;
36
+ }>;
37
+
18
38
  export const ChannelAddMembersContext = React.createContext(
19
39
  DEFAULT_BASE_CONTEXT_VALUE as ChannelAddMembersContextValue,
20
40
  );
21
41
 
22
42
  /**
23
- * @experimental This API is experimental and is subject to change.
43
+ * Builds the {@link ChannelAddMembersContextValue}. Rendered inside the
44
+ * {@link NotificationTargetProvider} so that notifications emitted by `submit`
45
+ * (via {@link useChannelActions}) resolve to the add-members host.
24
46
  */
25
- export const ChannelAddMembersProvider = ({ children }: PropsWithChildren<unknown>) => {
47
+ const ChannelAddMembersContextProviderInner = ({
48
+ children,
49
+ searchSource: searchSourceProp,
50
+ }: ChannelAddMembersProviderProps) => {
26
51
  const { client } = useChatContext();
52
+ const { channel } = useChannelDetailsContext();
53
+ const { addMembers } = useChannelActions(channel);
27
54
  const [selectionStore] = useState(() => new SelectionStore());
28
55
  const [searchSource] = useState(() => {
56
+ // A custom source is used as-is; the consumer owns its activation/sorting.
57
+ if (searchSourceProp) {
58
+ return searchSourceProp;
59
+ }
29
60
  const source = new UserSearchSource(
30
61
  client,
31
62
  { pageSize: 25, allowEmptySearchString: true, resetOnNewSearchQuery: false },
@@ -48,16 +79,49 @@ export const ChannelAddMembersProvider = ({ children }: PropsWithChildren<unknow
48
79
  return source;
49
80
  });
50
81
 
82
+ const submit = useStableCallback(async () => {
83
+ const ids = Array.from(selectionStore.state.getLatestValue().selectedIds);
84
+ let failed = false;
85
+ let firstError: unknown;
86
+ await addMembers(ids, {
87
+ onFailure: (error) => {
88
+ failed = true;
89
+ firstError = error;
90
+ },
91
+ });
92
+ if (failed) {
93
+ throw firstError;
94
+ }
95
+ });
96
+
97
+ const value = useMemo(
98
+ () => ({ selectionStore, searchSource, submit }),
99
+ [selectionStore, searchSource, submit],
100
+ );
101
+
51
102
  return (
52
- <ChannelAddMembersContext.Provider value={{ selectionStore, searchSource }}>
53
- {children}
54
- </ChannelAddMembersContext.Provider>
103
+ <ChannelAddMembersContext.Provider value={value}>{children}</ChannelAddMembersContext.Provider>
104
+ );
105
+ };
106
+
107
+ export const ChannelAddMembersProvider = ({
108
+ children,
109
+ searchSource,
110
+ }: ChannelAddMembersProviderProps) => {
111
+ const { channel } = useChannelDetailsContext();
112
+
113
+ return (
114
+ <NotificationTargetProvider
115
+ hostId={`channel-add-members:${channel.cid}`}
116
+ panel='channel-details'
117
+ >
118
+ <ChannelAddMembersContextProviderInner searchSource={searchSource}>
119
+ {children}
120
+ </ChannelAddMembersContextProviderInner>
121
+ </NotificationTargetProvider>
55
122
  );
56
123
  };
57
124
 
58
- /**
59
- * @experimental This API is experimental and is subject to change.
60
- */
61
125
  export const useChannelAddMembersContext = () => {
62
126
  const contextValue = useContext(
63
127
  ChannelAddMembersContext,
@@ -1,35 +1,40 @@
1
- import React, { PropsWithChildren, useContext } from 'react';
1
+ import React, { PropsWithChildren, useCallback, useContext, useMemo, useState } from 'react';
2
2
 
3
- import { ChannelDetailsProps } from '../../components';
3
+ import type { Channel } from 'stream-chat';
4
4
 
5
+ import { SignalStore } from '../../state-store/signal-store';
5
6
  import { DEFAULT_BASE_CONTEXT_VALUE } from '../utils/defaultBaseContextValue';
6
7
  import { isTestEnvironment } from '../utils/isTestEnvironment';
7
8
 
8
- /**
9
- * @experimental This API is experimental and is subject to change.
10
- */
11
- export type ChannelDetailsContextValue = ChannelDetailsProps;
9
+ export type ChannelDetailsContextValue = {
10
+ channel: Channel;
11
+ /**
12
+ * Signals all ChannelDetails modals to close themselves.
13
+ */
14
+ closeModals: () => void;
15
+ signalStore: SignalStore;
16
+ };
12
17
  export const ChannelDetailsContext = React.createContext(
13
18
  DEFAULT_BASE_CONTEXT_VALUE as ChannelDetailsContextValue,
14
19
  );
15
20
 
16
- /**
17
- * @experimental This API is experimental and is subject to change.
18
- */
19
21
  export const ChannelDetailsContextProvider = ({
22
+ channel,
20
23
  children,
21
- value,
22
24
  }: PropsWithChildren<{
23
- value: ChannelDetailsContextValue;
24
- }>) => (
25
- <ChannelDetailsContext.Provider value={value as unknown as ChannelDetailsContextValue}>
26
- {children}
27
- </ChannelDetailsContext.Provider>
28
- );
25
+ channel: Channel;
26
+ }>) => {
27
+ const [signalStore] = useState(() => new SignalStore());
28
+ const closeModals = useCallback(() => signalStore.signal(), [signalStore]);
29
+
30
+ const value = useMemo(
31
+ () => ({ channel, closeModals, signalStore }),
32
+ [channel, closeModals, signalStore],
33
+ );
34
+
35
+ return <ChannelDetailsContext.Provider value={value}>{children}</ChannelDetailsContext.Provider>;
36
+ };
29
37
 
30
- /**
31
- * @experimental This API is experimental and is subject to change.
32
- */
33
38
  export const useChannelDetailsContext = () => {
34
39
  const contextValue = useContext(ChannelDetailsContext) as unknown as ChannelDetailsContextValue;
35
40