@planningcenter/chat-react-native 3.2.0-rc.2 → 3.2.0-rc.20

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 (344) hide show
  1. package/build/components/conversation/message_form.d.ts +2 -2
  2. package/build/components/conversation/message_form.d.ts.map +1 -1
  3. package/build/components/conversation/message_form.js +95 -41
  4. package/build/components/conversation/message_form.js.map +1 -1
  5. package/build/components/conversations/action_toggle_button.d.ts +1 -1
  6. package/build/components/conversations/action_toggle_button.d.ts.map +1 -1
  7. package/build/components/conversations/action_toggle_button.js +2 -1
  8. package/build/components/conversations/action_toggle_button.js.map +1 -1
  9. package/build/components/conversations/conversation_actions.d.ts.map +1 -1
  10. package/build/components/conversations/conversation_actions.js +25 -11
  11. package/build/components/conversations/conversation_actions.js.map +1 -1
  12. package/build/components/conversations/conversations.d.ts +3 -6
  13. package/build/components/conversations/conversations.d.ts.map +1 -1
  14. package/build/components/conversations/conversations.js +8 -18
  15. package/build/components/conversations/conversations.js.map +1 -1
  16. package/build/components/display/action_button.d.ts +2 -1
  17. package/build/components/display/action_button.d.ts.map +1 -1
  18. package/build/components/display/action_button.js +3 -4
  19. package/build/components/display/action_button.js.map +1 -1
  20. package/build/components/display/banner.d.ts +6 -1
  21. package/build/components/display/banner.d.ts.map +1 -1
  22. package/build/components/display/banner.js +2 -2
  23. package/build/components/display/banner.js.map +1 -1
  24. package/build/components/display/banner_collapsible.d.ts +1 -1
  25. package/build/components/display/banner_collapsible.d.ts.map +1 -1
  26. package/build/components/display/banner_collapsible.js +2 -2
  27. package/build/components/display/banner_collapsible.js.map +1 -1
  28. package/build/components/display/child_notice.d.ts +3 -1
  29. package/build/components/display/child_notice.d.ts.map +1 -1
  30. package/build/components/display/child_notice.js +2 -2
  31. package/build/components/display/child_notice.js.map +1 -1
  32. package/build/components/display/person.d.ts +3 -1
  33. package/build/components/display/person.d.ts.map +1 -1
  34. package/build/components/display/person.js +2 -2
  35. package/build/components/display/person.js.map +1 -1
  36. package/build/components/primitive/banner_primitive.d.ts +3 -0
  37. package/build/components/primitive/banner_primitive.d.ts.map +1 -1
  38. package/build/components/primitive/banner_primitive.js +4 -5
  39. package/build/components/primitive/banner_primitive.js.map +1 -1
  40. package/build/contexts/api_provider.d.ts +1 -1
  41. package/build/contexts/api_provider.d.ts.map +1 -1
  42. package/build/contexts/api_provider.js +3 -3
  43. package/build/contexts/api_provider.js.map +1 -1
  44. package/build/contexts/chat_context.d.ts +5 -3
  45. package/build/contexts/chat_context.d.ts.map +1 -1
  46. package/build/contexts/chat_context.js +8 -3
  47. package/build/contexts/chat_context.js.map +1 -1
  48. package/build/contexts/conversations_context.d.ts +14 -0
  49. package/build/contexts/conversations_context.d.ts.map +1 -0
  50. package/build/contexts/conversations_context.js +38 -0
  51. package/build/contexts/conversations_context.js.map +1 -0
  52. package/build/hooks/groups/use_group_members_for_new_conversation.d.ts +226 -0
  53. package/build/hooks/groups/use_group_members_for_new_conversation.d.ts.map +1 -0
  54. package/build/hooks/groups/use_group_members_for_new_conversation.js +54 -0
  55. package/build/hooks/groups/use_group_members_for_new_conversation.js.map +1 -0
  56. package/build/hooks/groups/use_groups_conversation_create.d.ts +9 -0
  57. package/build/hooks/groups/use_groups_conversation_create.d.ts.map +1 -0
  58. package/build/hooks/groups/use_groups_conversation_create.js +36 -0
  59. package/build/hooks/groups/use_groups_conversation_create.js.map +1 -0
  60. package/build/hooks/use_api.d.ts +41 -41
  61. package/build/hooks/use_api.d.ts.map +1 -1
  62. package/build/hooks/use_api.js +5 -0
  63. package/build/hooks/use_api.js.map +1 -1
  64. package/build/hooks/use_api_client.d.ts.map +1 -1
  65. package/build/hooks/use_api_client.js +5 -3
  66. package/build/hooks/use_api_client.js.map +1 -1
  67. package/build/hooks/use_chat_permissions.d.ts +14 -14
  68. package/build/hooks/use_conversations.d.ts +6 -32
  69. package/build/hooks/use_conversations.d.ts.map +1 -1
  70. package/build/hooks/use_conversations.js +15 -14
  71. package/build/hooks/use_conversations.js.map +1 -1
  72. package/build/hooks/use_conversations_actions.d.ts +221 -0
  73. package/build/hooks/use_conversations_actions.d.ts.map +1 -0
  74. package/build/hooks/use_conversations_actions.js +93 -0
  75. package/build/hooks/use_conversations_actions.js.map +1 -0
  76. package/build/hooks/use_conversations_cache.d.ts +18 -0
  77. package/build/hooks/use_conversations_cache.d.ts.map +1 -0
  78. package/build/hooks/{use_conversation_jolt_events.js → use_conversations_cache.js} +27 -17
  79. package/build/hooks/use_conversations_cache.js.map +1 -0
  80. package/build/hooks/use_conversations_jolt_events.d.ts +3 -0
  81. package/build/hooks/use_conversations_jolt_events.d.ts.map +1 -0
  82. package/build/hooks/use_conversations_jolt_events.js +12 -0
  83. package/build/hooks/use_conversations_jolt_events.js.map +1 -0
  84. package/build/hooks/use_giphy.d.ts +9 -0
  85. package/build/hooks/use_giphy.d.ts.map +1 -0
  86. package/build/hooks/use_giphy.js +63 -0
  87. package/build/hooks/use_giphy.js.map +1 -0
  88. package/build/hooks/use_groups.d.ts +26 -26
  89. package/build/hooks/use_groups_groups.d.ts +26 -26
  90. package/build/hooks/use_jolt.d.ts.map +1 -1
  91. package/build/hooks/use_jolt.js +42 -20
  92. package/build/hooks/use_jolt.js.map +1 -1
  93. package/build/hooks/use_message_create.d.ts +11 -0
  94. package/build/hooks/use_message_create.d.ts.map +1 -0
  95. package/build/hooks/use_message_create.js +35 -0
  96. package/build/hooks/use_message_create.js.map +1 -0
  97. package/build/hooks/use_suspense_api.d.ts.map +1 -1
  98. package/build/hooks/use_suspense_api.js +5 -0
  99. package/build/hooks/use_suspense_api.js.map +1 -1
  100. package/build/hooks/use_teams.d.ts +26 -26
  101. package/build/index.d.ts +2 -2
  102. package/build/index.d.ts.map +1 -1
  103. package/build/index.js +2 -2
  104. package/build/index.js.map +1 -1
  105. package/build/navigation/index.d.ts +65 -38
  106. package/build/navigation/index.d.ts.map +1 -1
  107. package/build/navigation/index.js +29 -10
  108. package/build/navigation/index.js.map +1 -1
  109. package/build/screens/conversation_details_screen.js +2 -2
  110. package/build/screens/conversation_details_screen.js.map +1 -1
  111. package/build/screens/conversation_filter_recipients/components/checkbox_row.d.ts +10 -0
  112. package/build/screens/conversation_filter_recipients/components/checkbox_row.d.ts.map +1 -0
  113. package/build/screens/conversation_filter_recipients/components/checkbox_row.js +74 -0
  114. package/build/screens/conversation_filter_recipients/components/checkbox_row.js.map +1 -0
  115. package/build/screens/conversation_filter_recipients/components/header_row.d.ts +10 -0
  116. package/build/screens/conversation_filter_recipients/components/header_row.d.ts.map +1 -0
  117. package/build/screens/conversation_filter_recipients/components/header_row.js +69 -0
  118. package/build/screens/conversation_filter_recipients/components/header_row.js.map +1 -0
  119. package/build/screens/conversation_filter_recipients/components/navigation_header.d.ts +5 -0
  120. package/build/screens/conversation_filter_recipients/components/navigation_header.d.ts.map +1 -0
  121. package/build/screens/conversation_filter_recipients/components/navigation_header.js +46 -0
  122. package/build/screens/conversation_filter_recipients/components/navigation_header.js.map +1 -0
  123. package/build/screens/conversation_filter_recipients/context/conversation_filter_recipients_context.d.ts +17 -0
  124. package/build/screens/conversation_filter_recipients/context/conversation_filter_recipients_context.d.ts.map +1 -0
  125. package/build/screens/conversation_filter_recipients/context/conversation_filter_recipients_context.js +37 -0
  126. package/build/screens/conversation_filter_recipients/context/conversation_filter_recipients_context.js.map +1 -0
  127. package/build/screens/{create → conversation_filter_recipients}/conversation_filter_recipients_screen.d.ts +1 -3
  128. package/build/screens/conversation_filter_recipients/conversation_filter_recipients_screen.d.ts.map +1 -0
  129. package/build/screens/conversation_filter_recipients/conversation_filter_recipients_screen.js +87 -0
  130. package/build/screens/conversation_filter_recipients/conversation_filter_recipients_screen.js.map +1 -0
  131. package/build/screens/conversation_filter_recipients/hooks/use_flattened_array_of_service_types_with_teams.d.ts +10 -0
  132. package/build/screens/conversation_filter_recipients/hooks/use_flattened_array_of_service_types_with_teams.d.ts.map +1 -0
  133. package/build/screens/conversation_filter_recipients/hooks/use_flattened_array_of_service_types_with_teams.js +32 -0
  134. package/build/screens/conversation_filter_recipients/hooks/use_flattened_array_of_service_types_with_teams.js.map +1 -0
  135. package/build/screens/conversation_filter_recipients/hooks/use_service_types_with_teams.d.ts +8 -0
  136. package/build/screens/conversation_filter_recipients/hooks/use_service_types_with_teams.d.ts.map +1 -0
  137. package/build/screens/conversation_filter_recipients/hooks/use_service_types_with_teams.js +65 -0
  138. package/build/screens/conversation_filter_recipients/hooks/use_service_types_with_teams.js.map +1 -0
  139. package/build/screens/conversation_filter_recipients/types.d.ts +38 -0
  140. package/build/screens/conversation_filter_recipients/types.d.ts.map +1 -0
  141. package/build/screens/conversation_filter_recipients/types.js +6 -0
  142. package/build/screens/conversation_filter_recipients/types.js.map +1 -0
  143. package/build/screens/conversation_filters/hooks/filters.d.ts +40 -40
  144. package/build/screens/conversation_filters/hooks/filters.js +1 -1
  145. package/build/screens/conversation_filters/hooks/filters.js.map +1 -1
  146. package/build/screens/conversation_new/components/form_list.d.ts +12 -0
  147. package/build/screens/conversation_new/components/form_list.d.ts.map +1 -0
  148. package/build/screens/conversation_new/components/form_list.js +42 -0
  149. package/build/screens/conversation_new/components/form_list.js.map +1 -0
  150. package/build/screens/conversation_new/components/groups_form.d.ts +7 -0
  151. package/build/screens/conversation_new/components/groups_form.d.ts.map +1 -0
  152. package/build/screens/conversation_new/components/groups_form.js +105 -0
  153. package/build/screens/conversation_new/components/groups_form.js.map +1 -0
  154. package/build/screens/conversation_new/components/source_app_error_card.d.ts +2 -0
  155. package/build/screens/conversation_new/components/source_app_error_card.d.ts.map +1 -0
  156. package/build/screens/conversation_new/components/source_app_error_card.js +16 -0
  157. package/build/screens/conversation_new/components/source_app_error_card.js.map +1 -0
  158. package/build/screens/conversation_new/components/team_form.d.ts +8 -0
  159. package/build/screens/conversation_new/components/team_form.d.ts.map +1 -0
  160. package/build/screens/conversation_new/components/team_form.js +11 -0
  161. package/build/screens/conversation_new/components/team_form.js.map +1 -0
  162. package/build/screens/conversation_new/conversation_new_screen.d.ts +15 -0
  163. package/build/screens/conversation_new/conversation_new_screen.d.ts.map +1 -0
  164. package/build/screens/conversation_new/conversation_new_screen.js +16 -0
  165. package/build/screens/conversation_new/conversation_new_screen.js.map +1 -0
  166. package/build/screens/conversation_screen.d.ts +1 -0
  167. package/build/screens/conversation_screen.d.ts.map +1 -1
  168. package/build/screens/conversation_screen.js +1 -1
  169. package/build/screens/conversation_screen.js.map +1 -1
  170. package/build/screens/conversation_select_recipients/components/groups_without_chat_disclaimer_row.d.ts +2 -0
  171. package/build/screens/conversation_select_recipients/components/groups_without_chat_disclaimer_row.d.ts.map +1 -0
  172. package/build/screens/conversation_select_recipients/components/groups_without_chat_disclaimer_row.js +17 -0
  173. package/build/screens/conversation_select_recipients/components/groups_without_chat_disclaimer_row.js.map +1 -0
  174. package/build/screens/conversation_select_recipients/components/recipient_link_row.d.ts +12 -0
  175. package/build/screens/conversation_select_recipients/components/recipient_link_row.d.ts.map +1 -0
  176. package/build/screens/conversation_select_recipients/components/recipient_link_row.js +61 -0
  177. package/build/screens/conversation_select_recipients/components/recipient_link_row.js.map +1 -0
  178. package/build/screens/conversation_select_recipients/components/view_more_link_row.d.ts +7 -0
  179. package/build/screens/conversation_select_recipients/components/view_more_link_row.d.ts.map +1 -0
  180. package/build/screens/conversation_select_recipients/components/view_more_link_row.js +21 -0
  181. package/build/screens/conversation_select_recipients/components/view_more_link_row.js.map +1 -0
  182. package/build/screens/conversation_select_recipients/conversation_select_group_recipients_screen.d.ts +4 -0
  183. package/build/screens/conversation_select_recipients/conversation_select_group_recipients_screen.d.ts.map +1 -0
  184. package/build/screens/conversation_select_recipients/conversation_select_group_recipients_screen.js +48 -0
  185. package/build/screens/conversation_select_recipients/conversation_select_group_recipients_screen.js.map +1 -0
  186. package/build/screens/conversation_select_recipients/conversation_select_recipients_screen.d.ts +4 -0
  187. package/build/screens/conversation_select_recipients/conversation_select_recipients_screen.d.ts.map +1 -0
  188. package/build/screens/conversation_select_recipients/conversation_select_recipients_screen.js +86 -0
  189. package/build/screens/conversation_select_recipients/conversation_select_recipients_screen.js.map +1 -0
  190. package/build/screens/conversation_select_recipients/types/screen_props.d.ts +9 -0
  191. package/build/screens/conversation_select_recipients/types/screen_props.d.ts.map +1 -0
  192. package/build/screens/conversation_select_recipients/types/screen_props.js +2 -0
  193. package/build/screens/conversation_select_recipients/types/screen_props.js.map +1 -0
  194. package/build/screens/conversations/components/list_header_component.d.ts.map +1 -1
  195. package/build/screens/conversations/components/list_header_component.js +5 -1
  196. package/build/screens/conversations/components/list_header_component.js.map +1 -1
  197. package/build/screens/conversations/conversations_screen.d.ts +2 -1
  198. package/build/screens/conversations/conversations_screen.d.ts.map +1 -1
  199. package/build/screens/conversations/conversations_screen.js +35 -11
  200. package/build/screens/conversations/conversations_screen.js.map +1 -1
  201. package/build/screens/message_actions_screen.d.ts +2 -2
  202. package/build/screens/message_actions_screen.d.ts.map +1 -1
  203. package/build/screens/message_actions_screen.js.map +1 -1
  204. package/build/screens/send_giphy_screen.d.ts +10 -0
  205. package/build/screens/send_giphy_screen.d.ts.map +1 -0
  206. package/build/screens/send_giphy_screen.js +126 -0
  207. package/build/screens/send_giphy_screen.js.map +1 -0
  208. package/build/types/resources/groups/groups_group_resource.d.ts +1 -1
  209. package/build/types/resources/groups/groups_group_resource.js.map +1 -1
  210. package/build/types/resources/groups/groups_member_resource_with_person.d.ts +14 -0
  211. package/build/types/resources/groups/groups_member_resource_with_person.d.ts.map +1 -0
  212. package/build/types/resources/groups/groups_member_resource_with_person.js +2 -0
  213. package/build/types/resources/groups/groups_member_resource_with_person.js.map +1 -0
  214. package/build/types/resources/member.d.ts +0 -10
  215. package/build/types/resources/member.d.ts.map +1 -1
  216. package/build/types/resources/member.js.map +1 -1
  217. package/build/types/resources/oauth_token.d.ts +4 -4
  218. package/build/types/resources/oauth_token.d.ts.map +1 -1
  219. package/build/types/resources/oauth_token.js.map +1 -1
  220. package/build/utils/cache/page_mutations.d.ts +18 -0
  221. package/build/utils/cache/page_mutations.d.ts.map +1 -1
  222. package/build/utils/cache/page_mutations.js +13 -0
  223. package/build/utils/cache/page_mutations.js.map +1 -1
  224. package/build/utils/client/client.d.ts +4 -8
  225. package/build/utils/client/client.d.ts.map +1 -1
  226. package/build/utils/client/client.js +10 -9
  227. package/build/utils/client/client.js.map +1 -1
  228. package/build/utils/destructure_chat_group_graph_id.d.ts +10 -0
  229. package/build/utils/destructure_chat_group_graph_id.d.ts.map +1 -0
  230. package/build/utils/destructure_chat_group_graph_id.js +8 -0
  231. package/build/utils/destructure_chat_group_graph_id.js.map +1 -0
  232. package/build/utils/index.d.ts +1 -0
  233. package/build/utils/index.d.ts.map +1 -1
  234. package/build/utils/index.js +1 -0
  235. package/build/utils/index.js.map +1 -1
  236. package/build/utils/request/conversation.d.ts +1 -3
  237. package/build/utils/request/conversation.d.ts.map +1 -1
  238. package/build/utils/request/conversation.js +37 -30
  239. package/build/utils/request/conversation.js.map +1 -1
  240. package/build/utils/session.d.ts +6 -2
  241. package/build/utils/session.d.ts.map +1 -1
  242. package/build/utils/session.js +6 -1
  243. package/build/utils/session.js.map +1 -1
  244. package/build/utils/uri.d.ts +10 -2
  245. package/build/utils/uri.d.ts.map +1 -1
  246. package/build/utils/uri.js +24 -6
  247. package/build/utils/uri.js.map +1 -1
  248. package/build/vendor/tapestry/alias_tokens_color_map.d.ts +2 -0
  249. package/build/vendor/tapestry/alias_tokens_color_map.d.ts.map +1 -1
  250. package/build/vendor/tapestry/alias_tokens_color_map.js +2 -0
  251. package/build/vendor/tapestry/alias_tokens_color_map.js.map +1 -1
  252. package/package.json +4 -3
  253. package/src/__tests__/hooks/useTheme.tsx +1 -1
  254. package/src/__tests__/utils/cache/page_mutations.ts +49 -15
  255. package/src/__tests__/{client.ts → utils/client.ts} +7 -115
  256. package/src/__tests__/{session.ts → utils/session.ts} +4 -4
  257. package/src/__tests__/utils/uri.ts +107 -0
  258. package/src/components/conversation/message_form.tsx +127 -58
  259. package/src/components/conversations/action_toggle_button.tsx +2 -1
  260. package/src/components/conversations/conversation_actions.tsx +41 -14
  261. package/src/components/conversations/conversations.tsx +39 -52
  262. package/src/components/display/action_button.tsx +4 -3
  263. package/src/components/display/banner.tsx +7 -1
  264. package/src/components/display/banner_collapsible.tsx +6 -1
  265. package/src/components/display/child_notice.tsx +9 -3
  266. package/src/components/display/person.tsx +4 -3
  267. package/src/components/primitive/banner_primitive.tsx +12 -6
  268. package/src/contexts/api_provider.tsx +3 -3
  269. package/src/contexts/chat_context.tsx +13 -6
  270. package/src/contexts/conversations_context.tsx +69 -0
  271. package/src/hooks/groups/use_group_members_for_new_conversation.ts +62 -0
  272. package/src/hooks/groups/use_groups_conversation_create.ts +50 -0
  273. package/src/hooks/use_api.ts +11 -5
  274. package/src/hooks/use_api_client.ts +7 -3
  275. package/src/hooks/use_conversations.ts +34 -16
  276. package/src/hooks/use_conversations_actions.ts +108 -0
  277. package/src/hooks/{use_conversation_jolt_events.ts → use_conversations_cache.ts} +35 -20
  278. package/src/hooks/use_conversations_jolt_events.ts +21 -0
  279. package/src/hooks/use_giphy.ts +97 -0
  280. package/src/hooks/use_jolt.ts +56 -20
  281. package/src/hooks/use_message_create.ts +55 -0
  282. package/src/hooks/use_suspense_api.ts +6 -0
  283. package/src/index.tsx +2 -1
  284. package/src/navigation/index.tsx +39 -10
  285. package/src/screens/conversation_details_screen.tsx +2 -2
  286. package/src/screens/conversation_filter_recipients/components/checkbox_row.tsx +101 -0
  287. package/src/screens/conversation_filter_recipients/components/header_row.tsx +99 -0
  288. package/src/screens/conversation_filter_recipients/components/navigation_header.tsx +68 -0
  289. package/src/screens/conversation_filter_recipients/context/conversation_filter_recipients_context.tsx +53 -0
  290. package/src/screens/conversation_filter_recipients/conversation_filter_recipients_screen.tsx +120 -0
  291. package/src/screens/conversation_filter_recipients/hooks/use_flattened_array_of_service_types_with_teams.tsx +50 -0
  292. package/src/screens/conversation_filter_recipients/hooks/use_service_types_with_teams.ts +90 -0
  293. package/src/screens/conversation_filter_recipients/types.tsx +47 -0
  294. package/src/screens/conversation_filters/hooks/filters.ts +1 -1
  295. package/src/screens/conversation_new/components/form_list.tsx +67 -0
  296. package/src/screens/conversation_new/components/groups_form.tsx +163 -0
  297. package/src/screens/conversation_new/components/source_app_error_card.tsx +24 -0
  298. package/src/screens/conversation_new/components/team_form.tsx +18 -0
  299. package/src/screens/conversation_new/conversation_new_screen.tsx +29 -0
  300. package/src/screens/conversation_screen.tsx +2 -1
  301. package/src/screens/conversation_select_recipients/components/groups_without_chat_disclaimer_row.tsx +21 -0
  302. package/src/screens/conversation_select_recipients/components/recipient_link_row.tsx +91 -0
  303. package/src/screens/conversation_select_recipients/components/view_more_link_row.tsx +30 -0
  304. package/src/screens/conversation_select_recipients/conversation_select_group_recipients_screen.tsx +79 -0
  305. package/src/screens/conversation_select_recipients/conversation_select_recipients_screen.tsx +121 -0
  306. package/src/screens/conversation_select_recipients/types/screen_props.tsx +11 -0
  307. package/src/screens/conversations/components/list_header_component.tsx +6 -1
  308. package/src/screens/conversations/conversations_screen.tsx +39 -17
  309. package/src/screens/message_actions_screen.tsx +2 -2
  310. package/src/screens/send_giphy_screen.tsx +184 -0
  311. package/src/types/resources/groups/groups_group_resource.ts +1 -1
  312. package/src/types/resources/groups/groups_member_resource_with_person.ts +13 -0
  313. package/src/types/resources/member.ts +0 -11
  314. package/src/types/resources/oauth_token.ts +4 -4
  315. package/src/utils/cache/page_mutations.ts +22 -0
  316. package/src/utils/client/client.ts +13 -13
  317. package/src/utils/destructure_chat_group_graph_id.ts +25 -0
  318. package/src/utils/index.ts +1 -0
  319. package/src/utils/request/conversation.ts +39 -34
  320. package/src/utils/session.ts +10 -4
  321. package/src/utils/uri.ts +30 -6
  322. package/src/vendor/tapestry/alias_tokens_color_map.ts +3 -0
  323. package/build/contexts/swipeable_active_conversation.d.ts +0 -11
  324. package/build/contexts/swipeable_active_conversation.d.ts.map +0 -1
  325. package/build/contexts/swipeable_active_conversation.js +0 -16
  326. package/build/contexts/swipeable_active_conversation.js.map +0 -1
  327. package/build/hooks/use_conversation_jolt_events.d.ts +0 -2
  328. package/build/hooks/use_conversation_jolt_events.d.ts.map +0 -1
  329. package/build/hooks/use_conversation_jolt_events.js.map +0 -1
  330. package/build/screens/create/conversation_create_screen.d.ts +0 -9
  331. package/build/screens/create/conversation_create_screen.d.ts.map +0 -1
  332. package/build/screens/create/conversation_create_screen.js +0 -122
  333. package/build/screens/create/conversation_create_screen.js.map +0 -1
  334. package/build/screens/create/conversation_filter_recipients_screen.d.ts.map +0 -1
  335. package/build/screens/create/conversation_filter_recipients_screen.js +0 -52
  336. package/build/screens/create/conversation_filter_recipients_screen.js.map +0 -1
  337. package/build/screens/create/conversation_select_recipients_screen.d.ts +0 -8
  338. package/build/screens/create/conversation_select_recipients_screen.d.ts.map +0 -1
  339. package/build/screens/create/conversation_select_recipients_screen.js +0 -97
  340. package/build/screens/create/conversation_select_recipients_screen.js.map +0 -1
  341. package/src/contexts/swipeable_active_conversation.tsx +0 -27
  342. package/src/screens/create/conversation_create_screen.tsx +0 -151
  343. package/src/screens/create/conversation_filter_recipients_screen.tsx +0 -79
  344. package/src/screens/create/conversation_select_recipients_screen.tsx +0 -128
@@ -1,13 +1,12 @@
1
- import { useTheme as useNavigationTheme } from '@react-navigation/native'
2
- import { InfiniteData, useMutation, useQueryClient } from '@tanstack/react-query'
3
- import React from 'react'
1
+ import { useNavigation, useTheme as useNavigationTheme, useRoute } from '@react-navigation/native'
2
+ import React, { useContext, useEffect, useState } from 'react'
4
3
  import { StyleSheet, TextInput, View, ViewProps } from 'react-native'
5
- import { IconButton } from '../../components'
4
+ import { IconButton, Text } from '../../components'
6
5
  import { useTheme } from '../../hooks'
7
- import { useApiClient } from '../../hooks/use_api_client'
8
- import { getMessagesQueryKey, getMessagesRequestArgs } from '../../hooks/use_conversation_messages'
9
- import { ApiCollection, ApiResource, ConversationResource, MessageResource } from '../../types'
10
- import { updateOrCreateRecordInPagesData } from '../../utils'
6
+ import { ConversationResource } from '../../types'
7
+ import { useMessageCreate } from '../../hooks/use_message_create'
8
+ import { ConversationScreenProps } from '../../screens/conversation_screen'
9
+ import { ChatContext } from '../../contexts/chat_context'
11
10
 
12
11
  export const MessageForm = {
13
12
  Root: MessageFormRoot,
@@ -26,51 +25,77 @@ const MessageFormContext = React.createContext({
26
25
  setText: (_text: string) => {},
27
26
  onSubmit: () => {},
28
27
  disabled: false,
28
+ canGiphy: false,
29
+ usingGiphy: false,
30
+ setUsingGiphy: (_usingGiphy: boolean) => {},
29
31
  })
30
32
 
31
33
  function MessageFormRoot({ conversation, children }: MessagesFormRootProps) {
34
+ const { giphyApiKey } = useContext(ChatContext)
35
+ const canGiphy = !!giphyApiKey
32
36
  const styles = useMessageFormStyles()
33
37
  const [text, setText] = React.useState('')
34
- const apiClient = useApiClient()
35
- const queryClient = useQueryClient()
36
-
37
- const { mutate, isPending } = useMutation({
38
- mutationFn: async () => {
39
- const requestParams = getMessagesRequestArgs({ conversation_id: conversation.id })
40
- const fieldsWithValueJoined = Object.fromEntries(
41
- Object.entries(requestParams.data.fields).map(([k, v]) => [k, v.join(',')])
42
- )
43
-
44
- return apiClient.chat.post<ApiResource<MessageResource>>({
45
- url: `/me/conversations/${conversation.id}/messages`,
46
- data: {
47
- ...requestParams.data,
48
- data: {
49
- type: 'Message',
50
- attributes: { text },
51
- },
52
- fields: fieldsWithValueJoined,
53
- },
54
- })
55
- },
56
- onSuccess: (result: ApiResource<MessageResource>) => {
57
- const updatedMessage = result.data
58
- type QueryData = InfiniteData<ApiCollection<MessageResource>>
59
- const queryKey = getMessagesQueryKey({ conversation_id: conversation.id })
60
-
38
+ const [usingGiphy, setUsingGiphy] = useState(false)
39
+ const navigation = useNavigation()
40
+ const route = useRoute() as ConversationScreenProps['route']
41
+ const { status, isPending, reset, mutate } = useMessageCreate({ conversationId: conversation.id })
42
+
43
+ useEffect(() => {
44
+ if (canGiphy && !usingGiphy && text.startsWith('/giphy ')) {
45
+ setUsingGiphy(true)
61
46
  setText('')
62
- queryClient.setQueryData<QueryData>(queryKey, data =>
63
- updateOrCreateRecordInPagesData({
64
- data,
65
- record: updatedMessage,
66
- })
67
- )
68
- },
69
- })
47
+ }
48
+ }, [canGiphy, text, usingGiphy])
49
+
50
+ useEffect(() => {
51
+ switch (status) {
52
+ case 'success':
53
+ setText('')
54
+ reset()
55
+ break
56
+ }
57
+ }, [reset, status])
58
+
59
+ useEffect(() => {
60
+ if (route.params.clear_input) {
61
+ setText('')
62
+ setUsingGiphy(false)
63
+ navigation.setParams({ ...route.params, clear_input: false })
64
+ }
65
+ }, [navigation, route.params])
66
+
67
+ const canSubmit = (() => {
68
+ if (isPending) return false
69
+ if (text.length > 0) return true
70
+ return false
71
+ })()
72
+ const disabled = !canSubmit
73
+
74
+ const handleSubmit = () => {
75
+ if (!canSubmit) return
76
+
77
+ if (canGiphy && usingGiphy) {
78
+ TextInput.State.blurTextInput(TextInput.State.currentlyFocusedInput())
79
+ navigation.navigate('SendGiphy', {
80
+ conversation_id: conversation.id,
81
+ search_term: text,
82
+ })
83
+ } else {
84
+ mutate({ text })
85
+ }
86
+ }
70
87
 
71
88
  return (
72
89
  <MessageFormContext.Provider
73
- value={{ text, setText, onSubmit: () => mutate(), disabled: isPending }}
90
+ value={{
91
+ text,
92
+ setText,
93
+ onSubmit: handleSubmit,
94
+ disabled,
95
+ canGiphy,
96
+ usingGiphy,
97
+ setUsingGiphy,
98
+ }}
74
99
  >
75
100
  <View style={styles.textInputContainer}>{children}</View>
76
101
  </MessageFormContext.Provider>
@@ -79,38 +104,51 @@ function MessageFormRoot({ conversation, children }: MessagesFormRootProps) {
79
104
 
80
105
  function MessageFormInput() {
81
106
  const styles = useMessageFormStyles()
82
- const { text, setText, onSubmit } = React.useContext(MessageFormContext)
107
+ const { text, setText, onSubmit, usingGiphy } = React.useContext(MessageFormContext)
83
108
 
84
109
  return (
85
- <TextInput
86
- aria-disabled={true}
87
- placeholder="Send a message"
88
- onChangeText={setText}
89
- value={text}
90
- style={styles.textInput}
91
- onSubmitEditing={onSubmit}
92
- />
110
+ <View style={styles.textInput}>
111
+ {usingGiphy ? (
112
+ <View style={styles.giphyBadge}>
113
+ <Text>/Giphy</Text>
114
+ </View>
115
+ ) : null}
116
+
117
+ <TextInput
118
+ aria-disabled={true}
119
+ placeholder="Send a message"
120
+ onChangeText={setText}
121
+ value={text}
122
+ onSubmitEditing={onSubmit}
123
+ />
124
+ </View>
93
125
  )
94
126
  }
95
127
 
96
128
  function MessageFormSubmitBtn() {
97
129
  const styles = useMessageFormStyles()
98
- const { onSubmit, disabled } = React.useContext(MessageFormContext)
130
+ const { onSubmit, disabled, usingGiphy } = React.useContext(MessageFormContext)
99
131
 
100
132
  return (
101
133
  <IconButton
102
134
  disabled={disabled}
103
- accessibilityLabel="Send message"
135
+ accessibilityLabel={usingGiphy ? 'Search Giphy' : 'Send message'}
104
136
  size="md"
105
137
  appearance="neutral"
106
138
  style={styles.textInputSend}
107
- name={'general.upArrow'}
139
+ name={usingGiphy ? 'general.search' : 'general.upArrow'}
108
140
  onPress={onSubmit}
109
141
  />
110
142
  )
111
143
  }
112
144
 
113
145
  function MessageFormAttachmentPicker() {
146
+ const { usingGiphy } = React.useContext(MessageFormContext)
147
+
148
+ if (usingGiphy) {
149
+ return null
150
+ }
151
+
114
152
  return (
115
153
  <IconButton
116
154
  accessibilityLabel="Shazam"
@@ -122,8 +160,32 @@ function MessageFormAttachmentPicker() {
122
160
  }
123
161
 
124
162
  function MessageFormCommands() {
163
+ const { canGiphy, usingGiphy, setUsingGiphy } = React.useContext(MessageFormContext)
164
+
165
+ if (!canGiphy) {
166
+ return null
167
+ }
168
+
169
+ if (usingGiphy) {
170
+ return (
171
+ <IconButton
172
+ accessibilityLabel="Exit Giphy Search"
173
+ size="md"
174
+ appearance="neutral"
175
+ name={'general.x'}
176
+ onPress={() => setUsingGiphy(false)}
177
+ />
178
+ )
179
+ }
180
+
125
181
  return (
126
- <IconButton accessibilityLabel="Shazam" size="md" appearance="neutral" name={'general.bolt'} />
182
+ <IconButton
183
+ accessibilityLabel="Search Giphy"
184
+ size="md"
185
+ appearance="neutral"
186
+ name={'general.bolt'}
187
+ onPress={() => setUsingGiphy(true)}
188
+ />
127
189
  )
128
190
  }
129
191
 
@@ -148,12 +210,19 @@ const useMessageFormStyles = () => {
148
210
  paddingHorizontal: 20,
149
211
  borderColor: theme.colors.fillColorNeutral050Base,
150
212
  flex: 1,
213
+ flexDirection: 'row',
214
+ gap: 12,
215
+ },
216
+ giphyBadge: {
217
+ backgroundColor: theme.colors.fillColorNeutral050Base,
218
+ borderRadius: 24,
219
+ padding: 8,
220
+ paddingHorizontal: 12,
151
221
  },
152
222
  textInputSend: {
153
223
  borderRadius: 24,
154
224
  height: 36,
155
225
  width: 36,
156
- backgroundColor: theme.colors.fillColorNeutral040,
157
226
  },
158
227
  })
159
228
  }
@@ -1,5 +1,6 @@
1
1
  import React from 'react'
2
- import { Pressable, StyleSheet, type PressableProps } from 'react-native'
2
+ import { StyleSheet } from 'react-native'
3
+ import { Pressable, type PressableProps } from 'react-native-gesture-handler'
3
4
  import { Icon, IconString, Spinner, Text } from '../display'
4
5
  import { useCreateAndroidRippleColor, useTheme } from '../../hooks'
5
6
  import { platformFontWeightMedium, platformPressedOpacityStyle } from '../../utils/styles'
@@ -1,13 +1,17 @@
1
1
  import React, { ReactNode, useCallback, useEffect, useRef, useState } from 'react'
2
- import { Platform, View, StyleSheet, ViewStyle, Pressable } from 'react-native'
2
+ import { Platform, Pressable, StyleSheet, View, ViewStyle } from 'react-native'
3
3
  import ReanimatedSwipeable, {
4
4
  SwipeableMethods,
5
5
  } from 'react-native-gesture-handler/ReanimatedSwipeable'
6
+ import { useConversationsContext } from '../../contexts/conversations_context'
6
7
  import { useTheme } from '../../hooks'
7
- import { ActionToggleButton } from './action_toggle_button'
8
- import { tokens } from '../../vendor/tapestry/tokens'
8
+ import {
9
+ useConversationsMarkRead,
10
+ useConversationsMute,
11
+ } from '../../hooks/use_conversations_actions'
9
12
  import { ConversationResource } from '../../types'
10
- import { useConversationActionsContext } from '../../contexts/swipeable_active_conversation'
13
+ import { tokens } from '../../vendor/tapestry/tokens'
14
+ import { ActionToggleButton } from './action_toggle_button'
11
15
 
12
16
  export function ConversationActions({
13
17
  children,
@@ -22,7 +26,7 @@ export function ConversationActions({
22
26
  }) {
23
27
  const swipeableRef = useRef<SwipeableMethods>(null)
24
28
  const styles = useStyles()
25
- const { activeConversationId, setActiveConversationId } = useConversationActionsContext()
29
+ const { activeConversationId, setActiveConversationId } = useConversationsContext()
26
30
  const [disabled, setDisabled] = useState(false)
27
31
  const overshootLeft = Platform.OS === 'ios'
28
32
 
@@ -75,23 +79,45 @@ interface LeftActionsProps {
75
79
 
76
80
  function LeftActions({ conversation, onClose }: LeftActionsProps) {
77
81
  const styles = useStyles()
78
- const [muted, setMuted] = useState(conversation.muted)
82
+ const emptyConversation = conversation.lastMessageCreatedAt === null
83
+
84
+ const muteToggleContent = {
85
+ true: { iconName: 'general.bell', label: 'Unmute' },
86
+ false: { iconName: 'general.bellMuted', label: 'Mute' },
87
+ } as const
88
+
89
+ const latestMessageUnreadToggleContent = {
90
+ true: { iconName: 'general.outlinedTextMessage', label: 'Mark read' },
91
+ false: { iconName: 'general.textMessageNotifications', label: 'Mark unread' },
92
+ } as const
93
+ const { muted, setMuted, isPending } = useConversationsMute({ conversation })
94
+ const { read, markRead, isPending: markReadPending } = useConversationsMarkRead({ conversation })
79
95
 
80
96
  const handleMute = useCallback(() => {
81
97
  setMuted(!muted)
82
98
  onClose()
83
- }, [muted, onClose])
99
+ }, [muted, onClose, setMuted])
100
+
101
+ const handleLatestMessageUnread = useCallback(() => {
102
+ markRead(!read)
103
+ onClose()
104
+ }, [read, onClose, markRead])
84
105
 
85
106
  return (
86
107
  <View style={styles.actionButtonContainer}>
87
108
  <ActionToggleButton
88
- loading={false}
109
+ loading={markReadPending}
110
+ disabled={emptyConversation}
111
+ toggled={!read}
112
+ onPress={handleLatestMessageUnread}
113
+ toggleContent={latestMessageUnreadToggleContent}
114
+ backgroundColor={tokens.fillColorInteractionSwipeDefault}
115
+ />
116
+ <ActionToggleButton
117
+ loading={isPending}
89
118
  toggled={muted}
90
- toggleContent={{
91
- true: { iconName: 'general.bellMuted', label: 'Mute' },
92
- false: { iconName: 'general.bell', label: 'Unmute' },
93
- }}
94
- onPress={() => handleMute()}
119
+ onPress={handleMute}
120
+ toggleContent={muteToggleContent}
95
121
  backgroundColor={tokens.fillColorInteractionSwipeSecondary}
96
122
  />
97
123
  </View>
@@ -99,6 +125,7 @@ function LeftActions({ conversation, onClose }: LeftActionsProps) {
99
125
  }
100
126
 
101
127
  const ACTION_BUTTON_WIDTH = 120
128
+ const ACTION_BUTTON_COUNT = 2
102
129
 
103
130
  const useStyles = () => {
104
131
  const { colors } = useTheme()
@@ -109,7 +136,7 @@ const useStyles = () => {
109
136
  actionButtonContainer: {
110
137
  flexDirection: 'row',
111
138
  alignItems: 'center',
112
- width: ACTION_BUTTON_WIDTH,
139
+ width: ACTION_BUTTON_WIDTH * ACTION_BUTTON_COUNT,
113
140
  alignContent: 'stretch',
114
141
  },
115
142
  swipeableContainer: {
@@ -2,71 +2,58 @@ import { useNavigation } from '@react-navigation/native'
2
2
  import { FlashList } from '@shopify/flash-list'
3
3
  import React from 'react'
4
4
  import { StyleSheet, View } from 'react-native'
5
+ import { useConversationsContext } from '../../contexts/conversations_context'
5
6
  import { useTheme } from '../../hooks'
6
- import { useConversationsJoltEvents } from '../../hooks/use_conversation_jolt_events'
7
- import { useConversations } from '../../hooks/use_conversations'
8
7
  import { Text } from '../display'
9
- import { ConversationRequestArgs } from '../../utils/request/conversation'
10
8
  import { ConversationPreview } from './conversation_preview'
11
- import { ConversationActionsProvider } from '../../contexts/swipeable_active_conversation'
12
9
 
13
- type ListHeaderComponent =
14
- | React.ComponentType<any>
15
- | React.ReactElement<any, string | React.JSXElementConstructor<any>>
16
- | null
17
-
18
- interface ConversationsProps extends Partial<Omit<ConversationRequestArgs, 'group'>> {
19
- chat_group_graph_id?: string
20
- ListHeaderComponent?: ListHeaderComponent
10
+ interface ConversationsProps {
11
+ ListHeaderComponent?:
12
+ | React.ComponentType<any>
13
+ | React.ReactElement<any, string | React.JSXElementConstructor<any>>
14
+ | null
15
+ | undefined
21
16
  }
22
17
 
23
- export const Conversations = ({
24
- ListHeaderComponent,
25
- filter,
26
- chat_group_graph_id,
27
- gids,
28
- group_source_app_name,
29
- }: ConversationsProps) => {
18
+ export const Conversations = ({ ListHeaderComponent }: ConversationsProps) => {
30
19
  const styles = useStyles()
31
20
 
32
- const { conversations, fetchNextPage, refetch, isRefetching, isFetched } = useConversations({
33
- filter,
34
- group: chat_group_graph_id,
35
- gids,
36
- group_source_app_name,
37
- })
21
+ const {
22
+ conversations,
23
+ fetchNextPage,
24
+ refetch,
25
+ isRefetching,
26
+ isFetched,
27
+ args: { chat_group_graph_id },
28
+ } = useConversationsContext()
38
29
  const navigation = useNavigation()
39
30
 
40
- useConversationsJoltEvents()
41
-
42
31
  const showBadges = !chat_group_graph_id
43
32
 
44
33
  return (
45
- <ConversationActionsProvider>
46
- <View style={styles.container}>
47
- <FlashList
48
- data={conversations}
49
- estimatedItemSize={97}
50
- contentContainerStyle={styles.contentContainer}
51
- onRefresh={refetch}
52
- refreshing={!isFetched && isRefetching}
53
- ListHeaderComponent={ListHeaderComponent}
54
- ListEmptyComponent={
55
- <View style={styles.listEmpty}>
56
- <Text variant="secondary">No conversations found</Text>
57
- </View>
58
- }
59
- renderItem={({ item }) => (
60
- <ConversationPreview
61
- conversation={item}
62
- onPress={() => navigation.navigate('Conversation', { conversation_id: item.id })}
63
- showBadges={showBadges}
64
- />
65
- )}
66
- onEndReached={() => fetchNextPage()}
67
- />
68
- </View>
69
- </ConversationActionsProvider>
34
+ <View style={styles.container}>
35
+ <FlashList
36
+ data={conversations}
37
+ estimatedItemSize={97}
38
+ contentContainerStyle={styles.contentContainer}
39
+ onRefresh={refetch}
40
+ refreshing={!isFetched && isRefetching}
41
+ ListHeaderComponent={ListHeaderComponent}
42
+ ListEmptyComponent={
43
+ <View style={styles.listEmpty}>
44
+ <Text variant="secondary">No conversations found</Text>
45
+ </View>
46
+ }
47
+ renderItem={({ item }) => (
48
+ <ConversationPreview
49
+ conversation={item}
50
+ onPress={() => navigation.navigate('Conversation', { conversation_id: item.id })}
51
+ showBadges={showBadges}
52
+ />
53
+ )}
54
+ onEndReached={() => fetchNextPage()}
55
+ />
56
+ </View>
70
57
  )
71
58
  }
72
59
 
@@ -8,11 +8,13 @@ import { Text } from './text'
8
8
 
9
9
  export const ActionButton = ({
10
10
  visible = true,
11
+ disabled = false,
11
12
  onPress,
12
13
  title,
13
14
  infoText,
14
15
  }: {
15
16
  visible?: boolean
17
+ disabled?: boolean
16
18
  onPress: () => void
17
19
  title: string
18
20
  infoText?: string
@@ -32,11 +34,11 @@ export const ActionButton = ({
32
34
  return (
33
35
  <Animated.View style={styles.container}>
34
36
  {Boolean(infoText) && (
35
- <Text style={styles.infoText} variant="tertiary">
37
+ <Text style={styles.infoText} variant="footnote">
36
38
  {infoText}
37
39
  </Text>
38
40
  )}
39
- <Button variant="fill" size="lg" onPress={onPress} title={title} />
41
+ <Button variant="fill" size="lg" onPress={onPress} title={title} disabled={disabled} />
40
42
  </Animated.View>
41
43
  )
42
44
  }
@@ -56,7 +58,6 @@ const useStyles = () => {
56
58
  },
57
59
  infoText: {
58
60
  textAlign: 'center',
59
- color: colors.textColorDefaultSecondary,
60
61
  },
61
62
  })
62
63
  }
@@ -3,6 +3,7 @@ import BannerPrimitive, {
3
3
  type BannerStatusIconProps,
4
4
  type BannerRootProps,
5
5
  } from '../primitive/banner_primitive'
6
+ import { ViewStyle } from 'react-native'
6
7
 
7
8
  type descriptionUnion = string | ReactElement | undefined
8
9
 
@@ -29,6 +30,10 @@ export interface BannerProps {
29
30
  * Hides the status icon. By default, the status icon is shown.
30
31
  */
31
32
  showIcon?: boolean
33
+ /**
34
+ * Adds a style to the banner.
35
+ */
36
+ style?: ViewStyle
32
37
  }
33
38
 
34
39
  export function Banner({
@@ -37,12 +42,13 @@ export function Banner({
37
42
  heading,
38
43
  iconName,
39
44
  showIcon = true,
45
+ style,
40
46
  }: BannerProps) {
41
47
  if (!description && !heading) return null
42
48
 
43
49
  return (
44
50
  <BannerPrimitive.Root appearance={appearance}>
45
- <BannerPrimitive.StaticLayout>
51
+ <BannerPrimitive.StaticLayout style={style}>
46
52
  {showIcon && <BannerPrimitive.StatusIcon iconName={iconName} />}
47
53
  <BannerPrimitive.Content>
48
54
  {Boolean(heading) && <BannerPrimitive.Heading>{heading}</BannerPrimitive.Heading>}
@@ -20,6 +20,7 @@ export function BannerCollapsible({
20
20
  heading,
21
21
  iconName,
22
22
  showIcon = true,
23
+ style,
23
24
  }: BannerCollapsibleProps) {
24
25
  const [expanded, setExpanded] = React.useState(false)
25
26
 
@@ -31,7 +32,11 @@ export function BannerCollapsible({
31
32
 
32
33
  return (
33
34
  <BannerPrimitive.Root appearance={appearance}>
34
- <BannerPrimitive.CollapsibleLayout onPress={toggleCollapsible} expanded={expanded}>
35
+ <BannerPrimitive.CollapsibleLayout
36
+ onPress={toggleCollapsible}
37
+ expanded={expanded}
38
+ style={style}
39
+ >
35
40
  {showIcon && <BannerPrimitive.StatusIcon iconName={iconName} />}
36
41
  <BannerPrimitive.Content>
37
42
  {Boolean(heading) && <BannerPrimitive.Heading>{heading}</BannerPrimitive.Heading>}
@@ -2,7 +2,7 @@ import React from 'react'
2
2
  import { MemberResource } from '../../types'
3
3
  import { BannerCollapsible } from './banner_collapsible'
4
4
  import BannerPrimitive from '../primitive/banner_primitive'
5
- import { View, StyleSheet } from 'react-native'
5
+ import { View, StyleSheet, type ViewStyle } from 'react-native'
6
6
  import { Avatar } from './avatar'
7
7
  import { platformFontWeightMedium, pluralize } from '../../utils'
8
8
  import { Text } from './text'
@@ -13,14 +13,20 @@ import { Text } from './text'
13
13
 
14
14
  interface ChildNoticeProps {
15
15
  childMembers: MemberResource[]
16
+ style?: ViewStyle
16
17
  }
17
18
 
18
- export function ChildNotice({ childMembers }: ChildNoticeProps) {
19
+ export function ChildNotice({ childMembers, style }: ChildNoticeProps) {
19
20
  const styles = useStyles()
20
21
  const heading = `${pluralize(childMembers.length, 'member')} under age 13`
21
22
 
22
23
  return (
23
- <BannerCollapsible appearance="warning" iconName="general.shieldExclamation" heading={heading}>
24
+ <BannerCollapsible
25
+ appearance="warning"
26
+ iconName="general.shieldExclamation"
27
+ heading={heading}
28
+ style={style}
29
+ >
24
30
  <BannerPrimitive.Text>
25
31
  Under age members cannot chat. They won't see conversations or notifications.
26
32
  </BannerPrimitive.Text>
@@ -1,5 +1,5 @@
1
1
  import React from 'react'
2
- import { StyleSheet, View } from 'react-native'
2
+ import { StyleSheet, View, type ViewStyle } from 'react-native'
3
3
  import { platformFontWeightMedium } from '../../utils/styles'
4
4
  import { MemberResource } from '../../types'
5
5
  import { Avatar } from './avatar'
@@ -13,13 +13,14 @@ import { space } from '../../utils'
13
13
 
14
14
  interface PersonProps {
15
15
  person: MemberResource
16
+ style?: ViewStyle
16
17
  }
17
18
 
18
- export function Person({ person }: PersonProps) {
19
+ export function Person({ person, style }: PersonProps) {
19
20
  const styles = useStyles()
20
21
 
21
22
  return (
22
- <View style={styles.wrapper}>
23
+ <View style={[styles.wrapper, style]}>
23
24
  <Avatar sourceUri={person.avatar} />
24
25
  <View style={styles.content}>
25
26
  <Text style={styles.name}>{person.name}</Text>
@@ -1,5 +1,5 @@
1
1
  import React, { createContext, FC, ReactNode, useContext } from 'react'
2
- import { Pressable, StyleSheet, View } from 'react-native'
2
+ import { Pressable, StyleSheet, View, ViewStyle } from 'react-native'
3
3
  import {
4
4
  useStatusColorAppearanceMap,
5
5
  type StatusAppearanceUnion,
@@ -94,13 +94,14 @@ BannerRoot.displayName = 'Banner.Root'
94
94
 
95
95
  interface BannerStaticLayoutProps {
96
96
  children: ReactNode
97
+ style?: ViewStyle
97
98
  }
98
99
 
99
- function BannerStaticLayout({ children }: BannerStaticLayoutProps) {
100
+ function BannerStaticLayout({ children, style }: BannerStaticLayoutProps) {
100
101
  const { appearance } = useBannerContext()
101
102
  const styles = useStyles({ appearance })
102
103
 
103
- return <View style={styles.staticLayout}>{children}</View>
104
+ return <View style={[styles.staticLayout, style]}>{children}</View>
104
105
  }
105
106
 
106
107
  BannerStaticLayout.displayName = 'Banner.StaticLayout'
@@ -113,9 +114,15 @@ interface BannerCollapsibleLayoutProps {
113
114
  children: ReactNode
114
115
  expanded?: boolean
115
116
  onPress?: () => void
117
+ style?: ViewStyle
116
118
  }
117
119
 
118
- function BannerCollapsibleLayout({ children, expanded, onPress }: BannerCollapsibleLayoutProps) {
120
+ function BannerCollapsibleLayout({
121
+ children,
122
+ expanded,
123
+ onPress,
124
+ style,
125
+ }: BannerCollapsibleLayoutProps) {
119
126
  const { appearance = 'neutral' } = useBannerContext()
120
127
  const styles = useStyles({ appearance })
121
128
  const iconName = expanded ? 'general.upCaret' : 'general.downCaret'
@@ -127,7 +134,7 @@ function BannerCollapsibleLayout({ children, expanded, onPress }: BannerCollapsi
127
134
  return (
128
135
  <Pressable
129
136
  onPress={onPress}
130
- style={({ pressed }) => [styles.staticLayout, pressed && platformPressedOpacityStyle]}
137
+ style={({ pressed }) => [styles.staticLayout, pressed && platformPressedOpacityStyle, style]}
131
138
  android_ripple={{ color: androidRippleColor, borderless: false, foreground: true }}
132
139
  accessibilityState={{ expanded }}
133
140
  accessibilityRole="button"
@@ -271,7 +278,6 @@ const useStyles = ({ appearance = 'neutral' }: Styles = {}) => {
271
278
  padding: space(1.5),
272
279
  gap: space(1),
273
280
  borderRadius: tokens.borderRadiusMd,
274
- flex: 1,
275
281
  },
276
282
  content: {
277
283
  gap: space(0.5),