@planningcenter/chat-react-native 3.2.0-rc.0 → 3.2.0-rc.10

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 (337) 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/conversation/message_reaction.d.ts +2 -2
  6. package/build/components/conversations/action_toggle_button.d.ts +21 -0
  7. package/build/components/conversations/action_toggle_button.d.ts.map +1 -0
  8. package/build/components/conversations/action_toggle_button.js +48 -0
  9. package/build/components/conversations/action_toggle_button.js.map +1 -0
  10. package/build/components/conversations/conversation_actions.d.ts +10 -0
  11. package/build/components/conversations/conversation_actions.d.ts.map +1 -0
  12. package/build/components/conversations/conversation_actions.js +84 -0
  13. package/build/components/conversations/conversation_actions.js.map +1 -0
  14. package/build/components/conversations/conversation_preview.d.ts +2 -1
  15. package/build/components/conversations/conversation_preview.d.ts.map +1 -1
  16. package/build/components/conversations/conversation_preview.js +27 -9
  17. package/build/components/conversations/conversation_preview.js.map +1 -1
  18. package/build/components/conversations/conversations.d.ts +2 -3
  19. package/build/components/conversations/conversations.d.ts.map +1 -1
  20. package/build/components/conversations/conversations.js +5 -11
  21. package/build/components/conversations/conversations.js.map +1 -1
  22. package/build/components/conversations/mute_indicator.d.ts +5 -0
  23. package/build/components/conversations/mute_indicator.d.ts.map +1 -0
  24. package/build/components/conversations/mute_indicator.js +19 -0
  25. package/build/components/conversations/mute_indicator.js.map +1 -0
  26. package/build/components/conversations/unread_count_badge.d.ts +2 -1
  27. package/build/components/conversations/unread_count_badge.d.ts.map +1 -1
  28. package/build/components/conversations/unread_count_badge.js +9 -1
  29. package/build/components/conversations/unread_count_badge.js.map +1 -1
  30. package/build/components/display/action_button.js +1 -2
  31. package/build/components/display/action_button.js.map +1 -1
  32. package/build/components/display/badge.d.ts +5 -4
  33. package/build/components/display/badge.d.ts.map +1 -1
  34. package/build/components/display/badge.js +5 -2
  35. package/build/components/display/badge.js.map +1 -1
  36. package/build/components/display/button.d.ts +3 -2
  37. package/build/components/display/button.d.ts.map +1 -1
  38. package/build/components/display/button.js.map +1 -1
  39. package/build/components/display/icon.d.ts +14 -1
  40. package/build/components/display/icon.d.ts.map +1 -1
  41. package/build/components/display/icon.js +9 -0
  42. package/build/components/display/icon.js.map +1 -1
  43. package/build/components/display/icon_button.d.ts +2 -2
  44. package/build/components/display/icon_button.d.ts.map +1 -1
  45. package/build/components/display/icon_button.js.map +1 -1
  46. package/build/components/display/index.d.ts +1 -0
  47. package/build/components/display/index.d.ts.map +1 -1
  48. package/build/components/display/index.js +1 -0
  49. package/build/components/display/index.js.map +1 -1
  50. package/build/components/display/person.d.ts +3 -1
  51. package/build/components/display/person.d.ts.map +1 -1
  52. package/build/components/display/person.js +2 -2
  53. package/build/components/display/person.js.map +1 -1
  54. package/build/components/display/text.js.map +1 -1
  55. package/build/components/display/toggle_button.d.ts +43 -0
  56. package/build/components/display/toggle_button.d.ts.map +1 -0
  57. package/build/components/display/toggle_button.js +67 -0
  58. package/build/components/display/toggle_button.js.map +1 -0
  59. package/build/components/display/utils/button_colors.d.ts +3 -3
  60. package/build/components/display/utils/button_colors.d.ts.map +1 -1
  61. package/build/components/display/utils/button_colors.js +1 -1
  62. package/build/components/display/utils/button_colors.js.map +1 -1
  63. package/build/components/page/error_boundary.d.ts +1 -1
  64. package/build/components/primitive/avatar_primitive.d.ts.map +1 -1
  65. package/build/components/primitive/avatar_primitive.js +3 -2
  66. package/build/components/primitive/avatar_primitive.js.map +1 -1
  67. package/build/components/primitive/banner_primitive.d.ts +2 -1
  68. package/build/components/primitive/banner_primitive.d.ts.map +1 -1
  69. package/build/components/primitive/banner_primitive.js +0 -1
  70. package/build/components/primitive/banner_primitive.js.map +1 -1
  71. package/build/contexts/api_provider.js.map +1 -1
  72. package/build/contexts/chat_context.d.ts +2 -0
  73. package/build/contexts/chat_context.d.ts.map +1 -1
  74. package/build/contexts/chat_context.js +6 -1
  75. package/build/contexts/chat_context.js.map +1 -1
  76. package/build/contexts/conversations_context.d.ts +14 -0
  77. package/build/contexts/conversations_context.d.ts.map +1 -0
  78. package/build/contexts/conversations_context.js +38 -0
  79. package/build/contexts/conversations_context.js.map +1 -0
  80. package/build/hooks/groups/use_group_members_for_new_conversation.d.ts +214 -0
  81. package/build/hooks/groups/use_group_members_for_new_conversation.d.ts.map +1 -0
  82. package/build/hooks/groups/use_group_members_for_new_conversation.js +50 -0
  83. package/build/hooks/groups/use_group_members_for_new_conversation.js.map +1 -0
  84. package/build/hooks/use_conversation.d.ts +1 -1
  85. package/build/hooks/use_conversation.d.ts.map +1 -1
  86. package/build/hooks/use_conversation.js +1 -1
  87. package/build/hooks/use_conversation.js.map +1 -1
  88. package/build/hooks/use_conversations.d.ts +6 -32
  89. package/build/hooks/use_conversations.d.ts.map +1 -1
  90. package/build/hooks/use_conversations.js +15 -14
  91. package/build/hooks/use_conversations.js.map +1 -1
  92. package/build/hooks/use_conversations_actions.d.ts +221 -0
  93. package/build/hooks/use_conversations_actions.d.ts.map +1 -0
  94. package/build/hooks/use_conversations_actions.js +93 -0
  95. package/build/hooks/use_conversations_actions.js.map +1 -0
  96. package/build/hooks/use_conversations_cache.d.ts +18 -0
  97. package/build/hooks/use_conversations_cache.d.ts.map +1 -0
  98. package/build/hooks/{use_conversation_jolt_events.js → use_conversations_cache.js} +27 -17
  99. package/build/hooks/use_conversations_cache.js.map +1 -0
  100. package/build/hooks/use_conversations_jolt_events.d.ts +3 -0
  101. package/build/hooks/use_conversations_jolt_events.d.ts.map +1 -0
  102. package/build/hooks/use_conversations_jolt_events.js +12 -0
  103. package/build/hooks/use_conversations_jolt_events.js.map +1 -0
  104. package/build/hooks/use_create_android_ripple_color.d.ts +1 -1
  105. package/build/hooks/use_create_android_ripple_color.d.ts.map +1 -1
  106. package/build/hooks/use_giphy.d.ts +9 -0
  107. package/build/hooks/use_giphy.d.ts.map +1 -0
  108. package/build/hooks/use_giphy.js +63 -0
  109. package/build/hooks/use_giphy.js.map +1 -0
  110. package/build/hooks/use_jolt.d.ts.map +1 -1
  111. package/build/hooks/use_jolt.js +39 -10
  112. package/build/hooks/use_jolt.js.map +1 -1
  113. package/build/hooks/use_message_create.d.ts +11 -0
  114. package/build/hooks/use_message_create.d.ts.map +1 -0
  115. package/build/hooks/use_message_create.js +35 -0
  116. package/build/hooks/use_message_create.js.map +1 -0
  117. package/build/navigation/index.d.ts +24 -7
  118. package/build/navigation/index.d.ts.map +1 -1
  119. package/build/navigation/index.js +26 -9
  120. package/build/navigation/index.js.map +1 -1
  121. package/build/screens/conversation_filter_recipients/conversation_filter_recipients_screen.d.ts.map +1 -0
  122. package/build/screens/conversation_filter_recipients/conversation_filter_recipients_screen.js.map +1 -0
  123. package/build/screens/conversation_filters/components/conversation_filters.js.map +1 -1
  124. package/build/screens/conversation_filters/components/rows.d.ts +2 -1
  125. package/build/screens/conversation_filters/components/rows.d.ts.map +1 -1
  126. package/build/screens/conversation_filters/components/rows.js +19 -14
  127. package/build/screens/conversation_filters/components/rows.js.map +1 -1
  128. package/build/screens/conversation_filters/hooks/filters.js +1 -1
  129. package/build/screens/conversation_filters/hooks/filters.js.map +1 -1
  130. package/build/screens/conversation_new/components/form_list.d.ts +12 -0
  131. package/build/screens/conversation_new/components/form_list.d.ts.map +1 -0
  132. package/build/screens/conversation_new/components/form_list.js +42 -0
  133. package/build/screens/conversation_new/components/form_list.js.map +1 -0
  134. package/build/screens/conversation_new/components/groups_form.d.ts +7 -0
  135. package/build/screens/conversation_new/components/groups_form.d.ts.map +1 -0
  136. package/build/screens/conversation_new/components/groups_form.js +128 -0
  137. package/build/screens/conversation_new/components/groups_form.js.map +1 -0
  138. package/build/screens/conversation_new/components/member_error_card.d.ts +5 -0
  139. package/build/screens/conversation_new/components/member_error_card.d.ts.map +1 -0
  140. package/build/screens/conversation_new/components/member_error_card.js +17 -0
  141. package/build/screens/conversation_new/components/member_error_card.js.map +1 -0
  142. package/build/screens/conversation_new/components/source_app_error_card.d.ts +2 -0
  143. package/build/screens/conversation_new/components/source_app_error_card.d.ts.map +1 -0
  144. package/build/screens/conversation_new/components/source_app_error_card.js +16 -0
  145. package/build/screens/conversation_new/components/source_app_error_card.js.map +1 -0
  146. package/build/screens/conversation_new/components/team_form.d.ts +8 -0
  147. package/build/screens/conversation_new/components/team_form.d.ts.map +1 -0
  148. package/build/screens/conversation_new/components/team_form.js +11 -0
  149. package/build/screens/conversation_new/components/team_form.js.map +1 -0
  150. package/build/screens/conversation_new/conversation_new_screen.d.ts +12 -0
  151. package/build/screens/conversation_new/conversation_new_screen.d.ts.map +1 -0
  152. package/build/screens/conversation_new/conversation_new_screen.js +16 -0
  153. package/build/screens/conversation_new/conversation_new_screen.js.map +1 -0
  154. package/build/screens/conversation_new/utils/fake_member_data.d.ts +3 -0
  155. package/build/screens/conversation_new/utils/fake_member_data.d.ts.map +1 -0
  156. package/build/screens/conversation_new/utils/fake_member_data.js +129 -0
  157. package/build/screens/conversation_new/utils/fake_member_data.js.map +1 -0
  158. package/build/screens/conversation_screen.d.ts +1 -0
  159. package/build/screens/conversation_screen.d.ts.map +1 -1
  160. package/build/screens/conversation_screen.js +1 -1
  161. package/build/screens/conversation_screen.js.map +1 -1
  162. package/build/screens/conversation_select_recipients/conversation_select_recipients_screen.d.ts.map +1 -0
  163. package/build/screens/{create → conversation_select_recipients}/conversation_select_recipients_screen.js +6 -5
  164. package/build/screens/conversation_select_recipients/conversation_select_recipients_screen.js.map +1 -0
  165. package/build/screens/conversations/components/chat_group_badge.d.ts +3 -0
  166. package/build/screens/conversations/components/chat_group_badge.d.ts.map +1 -0
  167. package/build/screens/conversations/components/chat_group_badge.js +40 -0
  168. package/build/screens/conversations/components/chat_group_badge.js.map +1 -0
  169. package/build/screens/conversations/components/list_header_component.d.ts +3 -0
  170. package/build/screens/conversations/components/list_header_component.d.ts.map +1 -0
  171. package/build/screens/conversations/components/list_header_component.js +92 -0
  172. package/build/screens/conversations/components/list_header_component.js.map +1 -0
  173. package/build/screens/{conversations_screen.d.ts → conversations/conversations_screen.d.ts} +1 -1
  174. package/build/screens/conversations/conversations_screen.d.ts.map +1 -0
  175. package/build/screens/conversations/conversations_screen.js +28 -0
  176. package/build/screens/conversations/conversations_screen.js.map +1 -0
  177. package/build/screens/design_system_screen.d.ts.map +1 -1
  178. package/build/screens/design_system_screen.js +10 -1
  179. package/build/screens/design_system_screen.js.map +1 -1
  180. package/build/screens/message_actions_screen.d.ts +2 -2
  181. package/build/screens/message_actions_screen.d.ts.map +1 -1
  182. package/build/screens/message_actions_screen.js +1 -1
  183. package/build/screens/message_actions_screen.js.map +1 -1
  184. package/build/screens/send_giphy_screen.d.ts +10 -0
  185. package/build/screens/send_giphy_screen.d.ts.map +1 -0
  186. package/build/screens/send_giphy_screen.js +98 -0
  187. package/build/screens/send_giphy_screen.js.map +1 -0
  188. package/build/types/resources/groups/groups_group_resource.d.ts +1 -1
  189. package/build/types/resources/groups/groups_group_resource.js.map +1 -1
  190. package/build/types/resources/groups/groups_member_resource_with_person.d.ts +14 -0
  191. package/build/types/resources/groups/groups_member_resource_with_person.d.ts.map +1 -0
  192. package/build/types/resources/groups/groups_member_resource_with_person.js +2 -0
  193. package/build/types/resources/groups/groups_member_resource_with_person.js.map +1 -0
  194. package/build/types/resources/member.d.ts +0 -10
  195. package/build/types/resources/member.d.ts.map +1 -1
  196. package/build/types/resources/member.js.map +1 -1
  197. package/build/utils/cache/page_mutations.d.ts +18 -0
  198. package/build/utils/cache/page_mutations.d.ts.map +1 -1
  199. package/build/utils/cache/page_mutations.js +13 -0
  200. package/build/utils/cache/page_mutations.js.map +1 -1
  201. package/build/utils/client/client.d.ts +2 -2
  202. package/build/utils/client/client.d.ts.map +1 -1
  203. package/build/utils/client/client.js +12 -4
  204. package/build/utils/client/client.js.map +1 -1
  205. package/build/utils/client/request_helpers.d.ts +15 -8
  206. package/build/utils/client/request_helpers.d.ts.map +1 -1
  207. package/build/utils/client/request_helpers.js +2 -1
  208. package/build/utils/client/request_helpers.js.map +1 -1
  209. package/build/utils/client/transform_request_data.d.ts +11 -6
  210. package/build/utils/client/transform_request_data.d.ts.map +1 -1
  211. package/build/utils/client/transform_request_data.js +1 -1
  212. package/build/utils/client/transform_request_data.js.map +1 -1
  213. package/build/utils/client/transform_response.d.ts +1 -1
  214. package/build/utils/client/transform_response.d.ts.map +1 -1
  215. package/build/utils/client/transform_response.js +2 -0
  216. package/build/utils/client/transform_response.js.map +1 -1
  217. package/build/utils/client/utils.d.ts +3 -3
  218. package/build/utils/client/utils.d.ts.map +1 -1
  219. package/build/utils/client/utils.js +6 -6
  220. package/build/utils/client/utils.js.map +1 -1
  221. package/build/utils/date.d.ts.map +1 -1
  222. package/build/utils/date.js +1 -0
  223. package/build/utils/date.js.map +1 -1
  224. package/build/utils/deepCamelCaseKeys.d.ts.map +1 -1
  225. package/build/utils/deepCamelCaseKeys.js +3 -1
  226. package/build/utils/deepCamelCaseKeys.js.map +1 -1
  227. package/build/utils/parse_simple_markdown.d.ts +1 -1
  228. package/build/utils/parse_simple_markdown.d.ts.map +1 -1
  229. package/build/utils/parse_simple_markdown.js +2 -1
  230. package/build/utils/parse_simple_markdown.js.map +1 -1
  231. package/build/utils/request/conversation.d.ts +1 -3
  232. package/build/utils/request/conversation.d.ts.map +1 -1
  233. package/build/utils/request/conversation.js +37 -30
  234. package/build/utils/request/conversation.js.map +1 -1
  235. package/build/utils/space.js.map +1 -1
  236. package/build/utils/uri.d.ts +2 -2
  237. package/build/utils/uri.d.ts.map +1 -1
  238. package/build/utils/uri.js +2 -2
  239. package/build/utils/uri.js.map +1 -1
  240. package/build/vendor/tapestry/alias_tokens_color_map.d.ts +8 -0
  241. package/build/vendor/tapestry/alias_tokens_color_map.d.ts.map +1 -1
  242. package/build/vendor/tapestry/alias_tokens_color_map.js +8 -0
  243. package/build/vendor/tapestry/alias_tokens_color_map.js.map +1 -1
  244. package/build/vendor/tapestry/tokens.d.ts +2 -0
  245. package/build/vendor/tapestry/tokens.d.ts.map +1 -1
  246. package/build/vendor/tapestry/tokens.js +2 -0
  247. package/build/vendor/tapestry/tokens.js.map +1 -1
  248. package/package.json +8 -6
  249. package/src/__tests__/utils/cache/page_mutations.ts +49 -15
  250. package/src/components/conversation/message_form.tsx +127 -58
  251. package/src/components/conversations/action_toggle_button.tsx +84 -0
  252. package/src/components/conversations/conversation_actions.tsx +146 -0
  253. package/src/components/conversations/conversation_preview.tsx +46 -16
  254. package/src/components/conversations/conversations.tsx +13 -18
  255. package/src/components/conversations/mute_indicator.tsx +21 -0
  256. package/src/components/conversations/unread_count_badge.tsx +8 -1
  257. package/src/components/display/action_button.tsx +1 -2
  258. package/src/components/display/badge.tsx +12 -8
  259. package/src/components/display/button.tsx +3 -3
  260. package/src/components/display/icon.tsx +16 -3
  261. package/src/components/display/icon_button.tsx +2 -2
  262. package/src/components/display/index.ts +1 -0
  263. package/src/components/display/person.tsx +4 -3
  264. package/src/components/display/text.tsx +1 -1
  265. package/src/components/display/toggle_button.tsx +157 -0
  266. package/src/components/display/utils/button_colors.ts +8 -3
  267. package/src/components/primitive/avatar_primitive.tsx +5 -3
  268. package/src/components/primitive/banner_primitive.tsx +2 -3
  269. package/src/contexts/api_provider.tsx +1 -1
  270. package/src/contexts/chat_context.tsx +8 -1
  271. package/src/contexts/conversations_context.tsx +69 -0
  272. package/src/hooks/groups/use_group_members_for_new_conversation.ts +57 -0
  273. package/src/hooks/use_conversation.ts +5 -5
  274. package/src/hooks/use_conversations.ts +34 -16
  275. package/src/hooks/use_conversations_actions.ts +108 -0
  276. package/src/hooks/{use_conversation_jolt_events.ts → use_conversations_cache.ts} +35 -20
  277. package/src/hooks/use_conversations_jolt_events.ts +21 -0
  278. package/src/hooks/use_giphy.ts +97 -0
  279. package/src/hooks/use_jolt.ts +53 -12
  280. package/src/hooks/use_message_create.ts +55 -0
  281. package/src/navigation/index.tsx +32 -9
  282. package/src/screens/conversation_filters/components/conversation_filters.tsx +1 -1
  283. package/src/screens/conversation_filters/components/rows.tsx +44 -14
  284. package/src/screens/conversation_filters/hooks/filters.ts +1 -1
  285. package/src/screens/conversation_new/components/form_list.tsx +67 -0
  286. package/src/screens/conversation_new/components/groups_form.tsx +191 -0
  287. package/src/screens/conversation_new/components/member_error_card.tsx +20 -0
  288. package/src/screens/conversation_new/components/source_app_error_card.tsx +24 -0
  289. package/src/screens/conversation_new/components/team_form.tsx +18 -0
  290. package/src/screens/conversation_new/conversation_new_screen.tsx +26 -0
  291. package/src/screens/conversation_new/utils/fake_member_data.ts +130 -0
  292. package/src/screens/conversation_screen.tsx +2 -1
  293. package/src/screens/{create → conversation_select_recipients}/conversation_select_recipients_screen.tsx +6 -5
  294. package/src/screens/conversations/components/chat_group_badge.tsx +47 -0
  295. package/src/screens/conversations/components/list_header_component.tsx +130 -0
  296. package/src/screens/conversations/conversations_screen.tsx +43 -0
  297. package/src/screens/design_system_screen.tsx +29 -0
  298. package/src/screens/message_actions_screen.tsx +4 -4
  299. package/src/screens/send_giphy_screen.tsx +155 -0
  300. package/src/types/resources/groups/groups_group_resource.ts +1 -1
  301. package/src/types/resources/groups/groups_member_resource_with_person.ts +13 -0
  302. package/src/types/resources/member.ts +0 -11
  303. package/src/utils/cache/page_mutations.ts +22 -0
  304. package/src/utils/client/client.ts +15 -7
  305. package/src/utils/client/request_helpers.ts +15 -6
  306. package/src/utils/client/transform_request_data.ts +13 -4
  307. package/src/utils/client/transform_response.ts +3 -0
  308. package/src/utils/client/types.d.ts +2 -1
  309. package/src/utils/client/utils.ts +13 -12
  310. package/src/utils/date.ts +1 -0
  311. package/src/utils/deepCamelCaseKeys.ts +3 -2
  312. package/src/utils/parse_simple_markdown.ts +3 -1
  313. package/src/utils/request/conversation.ts +39 -34
  314. package/src/utils/space.ts +1 -1
  315. package/src/utils/uri.ts +2 -2
  316. package/src/vendor/tapestry/alias_tokens_color_map.ts +12 -0
  317. package/src/vendor/tapestry/tokens.ts +2 -0
  318. package/build/hooks/use_conversation_jolt_events.d.ts +0 -2
  319. package/build/hooks/use_conversation_jolt_events.d.ts.map +0 -1
  320. package/build/hooks/use_conversation_jolt_events.js.map +0 -1
  321. package/build/screens/conversations_screen.d.ts.map +0 -1
  322. package/build/screens/conversations_screen.js +0 -144
  323. package/build/screens/conversations_screen.js.map +0 -1
  324. package/build/screens/create/conversation_create_screen.d.ts +0 -9
  325. package/build/screens/create/conversation_create_screen.d.ts.map +0 -1
  326. package/build/screens/create/conversation_create_screen.js +0 -123
  327. package/build/screens/create/conversation_create_screen.js.map +0 -1
  328. package/build/screens/create/conversation_filter_recipients_screen.d.ts.map +0 -1
  329. package/build/screens/create/conversation_filter_recipients_screen.js.map +0 -1
  330. package/build/screens/create/conversation_select_recipients_screen.d.ts.map +0 -1
  331. package/build/screens/create/conversation_select_recipients_screen.js.map +0 -1
  332. package/src/screens/conversations_screen.tsx +0 -222
  333. package/src/screens/create/conversation_create_screen.tsx +0 -148
  334. /package/build/screens/{create → conversation_filter_recipients}/conversation_filter_recipients_screen.d.ts +0 -0
  335. /package/build/screens/{create → conversation_filter_recipients}/conversation_filter_recipients_screen.js +0 -0
  336. /package/build/screens/{create → conversation_select_recipients}/conversation_select_recipients_screen.d.ts +0 -0
  337. /package/src/screens/{create → conversation_filter_recipients}/conversation_filter_recipients_screen.tsx +0 -0
@@ -14,7 +14,7 @@ interface MessagesFormRootProps extends ViewProps {
14
14
  declare function MessageFormRoot({ conversation, children }: MessagesFormRootProps): React.JSX.Element;
15
15
  declare function MessageFormInput(): React.JSX.Element;
16
16
  declare function MessageFormSubmitBtn(): React.JSX.Element;
17
- declare function MessageFormAttachmentPicker(): React.JSX.Element;
18
- declare function MessageFormCommands(): React.JSX.Element;
17
+ declare function MessageFormAttachmentPicker(): React.JSX.Element | null;
18
+ declare function MessageFormCommands(): React.JSX.Element | null;
19
19
  export {};
20
20
  //# sourceMappingURL=message_form.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"message_form.d.ts","sourceRoot":"","sources":["../../../src/components/conversation/message_form.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,EAA+B,SAAS,EAAE,MAAM,cAAc,CAAA;AAKrE,OAAO,EAA8B,oBAAoB,EAAmB,MAAM,aAAa,CAAA;AAG/F,eAAO,MAAM,WAAW;;;;;;CAMvB,CAAA;AAED,UAAU,qBAAsB,SAAQ,SAAS;IAC/C,YAAY,EAAE,oBAAoB,CAAA;CACnC;AASD,iBAAS,eAAe,CAAC,EAAE,YAAY,EAAE,QAAQ,EAAE,EAAE,qBAAqB,qBA+CzE;AAED,iBAAS,gBAAgB,sBAcxB;AAED,iBAAS,oBAAoB,sBAe5B;AAED,iBAAS,2BAA2B,sBASnC;AAED,iBAAS,mBAAmB,sBAI3B"}
1
+ {"version":3,"file":"message_form.d.ts","sourceRoot":"","sources":["../../../src/components/conversation/message_form.tsx"],"names":[],"mappings":"AACA,OAAO,KAA0C,MAAM,OAAO,CAAA;AAC9D,OAAO,EAA+B,SAAS,EAAE,MAAM,cAAc,CAAA;AAGrE,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAA;AAKlD,eAAO,MAAM,WAAW;;;;;;CAMvB,CAAA;AAED,UAAU,qBAAsB,SAAQ,SAAS;IAC/C,YAAY,EAAE,oBAAoB,CAAA;CACnC;AAYD,iBAAS,eAAe,CAAC,EAAE,YAAY,EAAE,QAAQ,EAAE,EAAE,qBAAqB,qBAsEzE;AAED,iBAAS,gBAAgB,sBAqBxB;AAED,iBAAS,oBAAoB,sBAe5B;AAED,iBAAS,2BAA2B,6BAenC;AAED,iBAAS,mBAAmB,6BA4B3B"}
@@ -1,12 +1,10 @@
1
- import { useTheme as useNavigationTheme } from '@react-navigation/native';
2
- import { 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 } 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 { updateOrCreateRecordInPagesData } from '../../utils';
6
+ import { useMessageCreate } from '../../hooks/use_message_create';
7
+ import { ChatContext } from '../../contexts/chat_context';
10
8
  export const MessageForm = {
11
9
  Root: MessageFormRoot,
12
10
  TextInput: MessageFormInput,
@@ -19,57 +17,106 @@ const MessageFormContext = React.createContext({
19
17
  setText: (_text) => { },
20
18
  onSubmit: () => { },
21
19
  disabled: false,
20
+ canGiphy: false,
21
+ usingGiphy: false,
22
+ setUsingGiphy: (_usingGiphy) => { },
22
23
  });
23
24
  function MessageFormRoot({ conversation, children }) {
25
+ const { giphyApiKey } = useContext(ChatContext);
26
+ const canGiphy = !!giphyApiKey;
24
27
  const styles = useMessageFormStyles();
25
28
  const [text, setText] = React.useState('');
26
- const apiClient = useApiClient();
27
- const queryClient = useQueryClient();
28
- const { mutate, isPending } = useMutation({
29
- mutationFn: async () => {
30
- const requestParams = getMessagesRequestArgs({ conversation_id: conversation.id });
31
- const fieldsWithValueJoined = Object.fromEntries(Object.entries(requestParams.data.fields).map(([k, v]) => [k, v.join(',')]));
32
- return apiClient.chat.post({
33
- url: `/me/conversations/${conversation.id}/messages`,
34
- data: {
35
- ...requestParams.data,
36
- data: {
37
- type: 'Message',
38
- attributes: { text },
39
- },
40
- fields: fieldsWithValueJoined,
41
- },
42
- });
43
- },
44
- onSuccess: (result) => {
45
- const updatedMessage = result.data;
46
- const queryKey = getMessagesQueryKey({ conversation_id: conversation.id });
29
+ const [usingGiphy, setUsingGiphy] = useState(false);
30
+ const navigation = useNavigation();
31
+ const route = useRoute();
32
+ const { status, isPending, reset, mutate } = useMessageCreate({ conversationId: conversation.id });
33
+ useEffect(() => {
34
+ if (canGiphy && !usingGiphy && text.startsWith('/giphy ')) {
35
+ setUsingGiphy(true);
47
36
  setText('');
48
- queryClient.setQueryData(queryKey, data => updateOrCreateRecordInPagesData({
49
- data,
50
- record: updatedMessage,
51
- }));
52
- },
53
- });
54
- return (<MessageFormContext.Provider value={{ text, setText, onSubmit: () => mutate(), disabled: isPending }}>
37
+ }
38
+ }, [canGiphy, text, usingGiphy]);
39
+ useEffect(() => {
40
+ switch (status) {
41
+ case 'success':
42
+ setText('');
43
+ reset();
44
+ break;
45
+ }
46
+ }, [reset, status]);
47
+ useEffect(() => {
48
+ if (route.params.clear_input) {
49
+ setText('');
50
+ setUsingGiphy(false);
51
+ navigation.setParams({ ...route.params, clear_input: false });
52
+ }
53
+ }, [navigation, route.params]);
54
+ const canSubmit = (() => {
55
+ if (isPending)
56
+ return false;
57
+ if (text.length > 0)
58
+ return true;
59
+ return false;
60
+ })();
61
+ const disabled = !canSubmit;
62
+ const handleSubmit = () => {
63
+ if (!canSubmit)
64
+ return;
65
+ if (canGiphy && usingGiphy) {
66
+ TextInput.State.blurTextInput(TextInput.State.currentlyFocusedInput());
67
+ navigation.navigate('SendGiphy', {
68
+ conversation_id: conversation.id,
69
+ search_term: text,
70
+ });
71
+ }
72
+ else {
73
+ mutate({ text });
74
+ }
75
+ };
76
+ return (<MessageFormContext.Provider value={{
77
+ text,
78
+ setText,
79
+ onSubmit: handleSubmit,
80
+ disabled,
81
+ canGiphy,
82
+ usingGiphy,
83
+ setUsingGiphy,
84
+ }}>
55
85
  <View style={styles.textInputContainer}>{children}</View>
56
86
  </MessageFormContext.Provider>);
57
87
  }
58
88
  function MessageFormInput() {
59
89
  const styles = useMessageFormStyles();
60
- const { text, setText, onSubmit } = React.useContext(MessageFormContext);
61
- return (<TextInput aria-disabled={true} placeholder="Send a message" onChangeText={setText} value={text} style={styles.textInput} onSubmitEditing={onSubmit}/>);
90
+ const { text, setText, onSubmit, usingGiphy } = React.useContext(MessageFormContext);
91
+ return (<View style={styles.textInput}>
92
+ {usingGiphy ? (<View style={styles.giphyBadge}>
93
+ <Text>/Giphy</Text>
94
+ </View>) : null}
95
+
96
+ <TextInput aria-disabled={true} placeholder="Send a message" onChangeText={setText} value={text} onSubmitEditing={onSubmit}/>
97
+ </View>);
62
98
  }
63
99
  function MessageFormSubmitBtn() {
64
100
  const styles = useMessageFormStyles();
65
- const { onSubmit, disabled } = React.useContext(MessageFormContext);
66
- return (<IconButton disabled={disabled} accessibilityLabel="Send message" size="md" appearance="neutral" style={styles.textInputSend} name={'general.upArrow'} onPress={onSubmit}/>);
101
+ const { onSubmit, disabled, usingGiphy } = React.useContext(MessageFormContext);
102
+ return (<IconButton disabled={disabled} accessibilityLabel={usingGiphy ? 'Search Giphy' : 'Send message'} size="md" appearance="neutral" style={styles.textInputSend} name={usingGiphy ? 'general.search' : 'general.upArrow'} onPress={onSubmit}/>);
67
103
  }
68
104
  function MessageFormAttachmentPicker() {
105
+ const { usingGiphy } = React.useContext(MessageFormContext);
106
+ if (usingGiphy) {
107
+ return null;
108
+ }
69
109
  return (<IconButton accessibilityLabel="Shazam" size="md" appearance="neutral" name={'general.paperclip'}/>);
70
110
  }
71
111
  function MessageFormCommands() {
72
- return (<IconButton accessibilityLabel="Shazam" size="md" appearance="neutral" name={'general.bolt'}/>);
112
+ const { canGiphy, usingGiphy, setUsingGiphy } = React.useContext(MessageFormContext);
113
+ if (!canGiphy) {
114
+ return null;
115
+ }
116
+ if (usingGiphy) {
117
+ return (<IconButton accessibilityLabel="Exit Giphy Search" size="md" appearance="neutral" name={'general.x'} onPress={() => setUsingGiphy(false)}/>);
118
+ }
119
+ return (<IconButton accessibilityLabel="Search Giphy" size="md" appearance="neutral" name={'general.bolt'} onPress={() => setUsingGiphy(true)}/>);
73
120
  }
74
121
  const useMessageFormStyles = () => {
75
122
  const theme = useTheme();
@@ -91,12 +138,19 @@ const useMessageFormStyles = () => {
91
138
  paddingHorizontal: 20,
92
139
  borderColor: theme.colors.fillColorNeutral050Base,
93
140
  flex: 1,
141
+ flexDirection: 'row',
142
+ gap: 12,
143
+ },
144
+ giphyBadge: {
145
+ backgroundColor: theme.colors.fillColorNeutral050Base,
146
+ borderRadius: 24,
147
+ padding: 8,
148
+ paddingHorizontal: 12,
94
149
  },
95
150
  textInputSend: {
96
151
  borderRadius: 24,
97
152
  height: 36,
98
153
  width: 36,
99
- backgroundColor: theme.colors.fillColorNeutral040,
100
154
  },
101
155
  });
102
156
  };
@@ -1 +1 @@
1
- {"version":3,"file":"message_form.js","sourceRoot":"","sources":["../../../src/components/conversation/message_form.tsx"],"names":[],"mappings":"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","sourcesContent":["import { useTheme as useNavigationTheme } from '@react-navigation/native'\nimport { InfiniteData, useMutation, useQueryClient } from '@tanstack/react-query'\nimport React from 'react'\nimport { StyleSheet, TextInput, View, ViewProps } from 'react-native'\nimport { IconButton } from '../../components'\nimport { useTheme } from '../../hooks'\nimport { useApiClient } from '../../hooks/use_api_client'\nimport { getMessagesQueryKey, getMessagesRequestArgs } from '../../hooks/use_conversation_messages'\nimport { ApiCollection, ApiResource, ConversationResource, MessageResource } from '../../types'\nimport { updateOrCreateRecordInPagesData } from '../../utils'\n\nexport const MessageForm = {\n Root: MessageFormRoot,\n TextInput: MessageFormInput,\n SubmitButton: MessageFormSubmitBtn,\n AttachmentPicker: MessageFormAttachmentPicker,\n Commands: MessageFormCommands,\n}\n\ninterface MessagesFormRootProps extends ViewProps {\n conversation: ConversationResource\n}\n\nconst MessageFormContext = React.createContext({\n text: '',\n setText: (_text: string) => {},\n onSubmit: () => {},\n disabled: false,\n})\n\nfunction MessageFormRoot({ conversation, children }: MessagesFormRootProps) {\n const styles = useMessageFormStyles()\n const [text, setText] = React.useState('')\n const apiClient = useApiClient()\n const queryClient = useQueryClient()\n\n const { mutate, isPending } = useMutation({\n mutationFn: async () => {\n const requestParams = getMessagesRequestArgs({ conversation_id: conversation.id })\n const fieldsWithValueJoined = Object.fromEntries(\n Object.entries(requestParams.data.fields).map(([k, v]) => [k, v.join(',')])\n )\n\n return apiClient.chat.post({\n url: `/me/conversations/${conversation.id}/messages`,\n data: {\n ...requestParams.data,\n data: {\n type: 'Message',\n attributes: { text },\n },\n fields: fieldsWithValueJoined,\n },\n })\n },\n onSuccess: (result: ApiResource<MessageResource>) => {\n const updatedMessage = result.data\n type QueryData = InfiniteData<ApiCollection<MessageResource>>\n const queryKey = getMessagesQueryKey({ conversation_id: conversation.id })\n\n setText('')\n queryClient.setQueryData<QueryData>(queryKey, data =>\n updateOrCreateRecordInPagesData({\n data,\n record: updatedMessage,\n })\n )\n },\n })\n\n return (\n <MessageFormContext.Provider\n value={{ text, setText, onSubmit: () => mutate(), disabled: isPending }}\n >\n <View style={styles.textInputContainer}>{children}</View>\n </MessageFormContext.Provider>\n )\n}\n\nfunction MessageFormInput() {\n const styles = useMessageFormStyles()\n const { text, setText, onSubmit } = React.useContext(MessageFormContext)\n\n return (\n <TextInput\n aria-disabled={true}\n placeholder=\"Send a message\"\n onChangeText={setText}\n value={text}\n style={styles.textInput}\n onSubmitEditing={onSubmit}\n />\n )\n}\n\nfunction MessageFormSubmitBtn() {\n const styles = useMessageFormStyles()\n const { onSubmit, disabled } = React.useContext(MessageFormContext)\n\n return (\n <IconButton\n disabled={disabled}\n accessibilityLabel=\"Send message\"\n size=\"md\"\n appearance=\"neutral\"\n style={styles.textInputSend}\n name={'general.upArrow'}\n onPress={onSubmit}\n />\n )\n}\n\nfunction MessageFormAttachmentPicker() {\n return (\n <IconButton\n accessibilityLabel=\"Shazam\"\n size=\"md\"\n appearance=\"neutral\"\n name={'general.paperclip'}\n />\n )\n}\n\nfunction MessageFormCommands() {\n return (\n <IconButton accessibilityLabel=\"Shazam\" size=\"md\" appearance=\"neutral\" name={'general.bolt'} />\n )\n}\n\nconst useMessageFormStyles = () => {\n const theme = useTheme()\n const navigationTheme = useNavigationTheme()\n\n return StyleSheet.create({\n textInputContainer: {\n borderColor: theme.colors.fillColorNeutral050Base,\n borderTopWidth: 1,\n padding: 12,\n backgroundColor: navigationTheme.colors.card,\n flexDirection: 'row',\n alignItems: 'center',\n gap: 12,\n },\n textInput: {\n borderRadius: 24,\n borderWidth: 1,\n padding: 12,\n paddingHorizontal: 20,\n borderColor: theme.colors.fillColorNeutral050Base,\n flex: 1,\n },\n textInputSend: {\n borderRadius: 24,\n height: 36,\n width: 36,\n backgroundColor: theme.colors.fillColorNeutral040,\n },\n })\n}\n"]}
1
+ {"version":3,"file":"message_form.js","sourceRoot":"","sources":["../../../src/components/conversation/message_form.tsx"],"names":[],"mappings":"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","sourcesContent":["import { useNavigation, useTheme as useNavigationTheme, useRoute } from '@react-navigation/native'\nimport React, { useContext, useEffect, useState } from 'react'\nimport { StyleSheet, TextInput, View, ViewProps } from 'react-native'\nimport { IconButton, Text } from '../../components'\nimport { useTheme } from '../../hooks'\nimport { ConversationResource } from '../../types'\nimport { useMessageCreate } from '../../hooks/use_message_create'\nimport { ConversationScreenProps } from '../../screens/conversation_screen'\nimport { ChatContext } from '../../contexts/chat_context'\n\nexport const MessageForm = {\n Root: MessageFormRoot,\n TextInput: MessageFormInput,\n SubmitButton: MessageFormSubmitBtn,\n AttachmentPicker: MessageFormAttachmentPicker,\n Commands: MessageFormCommands,\n}\n\ninterface MessagesFormRootProps extends ViewProps {\n conversation: ConversationResource\n}\n\nconst MessageFormContext = React.createContext({\n text: '',\n setText: (_text: string) => {},\n onSubmit: () => {},\n disabled: false,\n canGiphy: false,\n usingGiphy: false,\n setUsingGiphy: (_usingGiphy: boolean) => {},\n})\n\nfunction MessageFormRoot({ conversation, children }: MessagesFormRootProps) {\n const { giphyApiKey } = useContext(ChatContext)\n const canGiphy = !!giphyApiKey\n const styles = useMessageFormStyles()\n const [text, setText] = React.useState('')\n const [usingGiphy, setUsingGiphy] = useState(false)\n const navigation = useNavigation()\n const route = useRoute() as ConversationScreenProps['route']\n const { status, isPending, reset, mutate } = useMessageCreate({ conversationId: conversation.id })\n\n useEffect(() => {\n if (canGiphy && !usingGiphy && text.startsWith('/giphy ')) {\n setUsingGiphy(true)\n setText('')\n }\n }, [canGiphy, text, usingGiphy])\n\n useEffect(() => {\n switch (status) {\n case 'success':\n setText('')\n reset()\n break\n }\n }, [reset, status])\n\n useEffect(() => {\n if (route.params.clear_input) {\n setText('')\n setUsingGiphy(false)\n navigation.setParams({ ...route.params, clear_input: false })\n }\n }, [navigation, route.params])\n\n const canSubmit = (() => {\n if (isPending) return false\n if (text.length > 0) return true\n return false\n })()\n const disabled = !canSubmit\n\n const handleSubmit = () => {\n if (!canSubmit) return\n\n if (canGiphy && usingGiphy) {\n TextInput.State.blurTextInput(TextInput.State.currentlyFocusedInput())\n navigation.navigate('SendGiphy', {\n conversation_id: conversation.id,\n search_term: text,\n })\n } else {\n mutate({ text })\n }\n }\n\n return (\n <MessageFormContext.Provider\n value={{\n text,\n setText,\n onSubmit: handleSubmit,\n disabled,\n canGiphy,\n usingGiphy,\n setUsingGiphy,\n }}\n >\n <View style={styles.textInputContainer}>{children}</View>\n </MessageFormContext.Provider>\n )\n}\n\nfunction MessageFormInput() {\n const styles = useMessageFormStyles()\n const { text, setText, onSubmit, usingGiphy } = React.useContext(MessageFormContext)\n\n return (\n <View style={styles.textInput}>\n {usingGiphy ? (\n <View style={styles.giphyBadge}>\n <Text>/Giphy</Text>\n </View>\n ) : null}\n\n <TextInput\n aria-disabled={true}\n placeholder=\"Send a message\"\n onChangeText={setText}\n value={text}\n onSubmitEditing={onSubmit}\n />\n </View>\n )\n}\n\nfunction MessageFormSubmitBtn() {\n const styles = useMessageFormStyles()\n const { onSubmit, disabled, usingGiphy } = React.useContext(MessageFormContext)\n\n return (\n <IconButton\n disabled={disabled}\n accessibilityLabel={usingGiphy ? 'Search Giphy' : 'Send message'}\n size=\"md\"\n appearance=\"neutral\"\n style={styles.textInputSend}\n name={usingGiphy ? 'general.search' : 'general.upArrow'}\n onPress={onSubmit}\n />\n )\n}\n\nfunction MessageFormAttachmentPicker() {\n const { usingGiphy } = React.useContext(MessageFormContext)\n\n if (usingGiphy) {\n return null\n }\n\n return (\n <IconButton\n accessibilityLabel=\"Shazam\"\n size=\"md\"\n appearance=\"neutral\"\n name={'general.paperclip'}\n />\n )\n}\n\nfunction MessageFormCommands() {\n const { canGiphy, usingGiphy, setUsingGiphy } = React.useContext(MessageFormContext)\n\n if (!canGiphy) {\n return null\n }\n\n if (usingGiphy) {\n return (\n <IconButton\n accessibilityLabel=\"Exit Giphy Search\"\n size=\"md\"\n appearance=\"neutral\"\n name={'general.x'}\n onPress={() => setUsingGiphy(false)}\n />\n )\n }\n\n return (\n <IconButton\n accessibilityLabel=\"Search Giphy\"\n size=\"md\"\n appearance=\"neutral\"\n name={'general.bolt'}\n onPress={() => setUsingGiphy(true)}\n />\n )\n}\n\nconst useMessageFormStyles = () => {\n const theme = useTheme()\n const navigationTheme = useNavigationTheme()\n\n return StyleSheet.create({\n textInputContainer: {\n borderColor: theme.colors.fillColorNeutral050Base,\n borderTopWidth: 1,\n padding: 12,\n backgroundColor: navigationTheme.colors.card,\n flexDirection: 'row',\n alignItems: 'center',\n gap: 12,\n },\n textInput: {\n borderRadius: 24,\n borderWidth: 1,\n padding: 12,\n paddingHorizontal: 20,\n borderColor: theme.colors.fillColorNeutral050Base,\n flex: 1,\n flexDirection: 'row',\n gap: 12,\n },\n giphyBadge: {\n backgroundColor: theme.colors.fillColorNeutral050Base,\n borderRadius: 24,\n padding: 8,\n paddingHorizontal: 12,\n },\n textInputSend: {\n borderRadius: 24,\n height: 36,\n width: 36,\n },\n })\n}\n"]}
@@ -10,8 +10,8 @@ export declare const useReactionStyles: ({ mine }: {
10
10
  }) => {
11
11
  reaction: {
12
12
  borderWidth: number;
13
- borderColor: any;
14
- backgroundColor: any;
13
+ borderColor: string;
14
+ backgroundColor: string;
15
15
  borderRadius: number;
16
16
  paddingVertical: number;
17
17
  paddingHorizontal: number;
@@ -0,0 +1,21 @@
1
+ import React from 'react';
2
+ import { type PressableProps } from 'react-native-gesture-handler';
3
+ import { IconString } from '../display';
4
+ interface ActionToggleButtonProps extends PressableProps {
5
+ backgroundColor: string;
6
+ toggled: boolean;
7
+ toggleContent: {
8
+ true: {
9
+ iconName: IconString;
10
+ label: string;
11
+ };
12
+ false: {
13
+ iconName: IconString;
14
+ label: string;
15
+ };
16
+ };
17
+ loading?: boolean;
18
+ }
19
+ export declare function ActionToggleButton({ backgroundColor, onPress, toggleContent, disabled, toggled, loading, ...props }: ActionToggleButtonProps): React.JSX.Element;
20
+ export {};
21
+ //# sourceMappingURL=action_toggle_button.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"action_toggle_button.d.ts","sourceRoot":"","sources":["../../../src/components/conversations/action_toggle_button.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AAEzB,OAAO,EAAa,KAAK,cAAc,EAAE,MAAM,8BAA8B,CAAA;AAC7E,OAAO,EAAQ,UAAU,EAAiB,MAAM,YAAY,CAAA;AAI5D,UAAU,uBAAwB,SAAQ,cAAc;IACtD,eAAe,EAAE,MAAM,CAAA;IACvB,OAAO,EAAE,OAAO,CAAA;IAChB,aAAa,EAAE;QACb,IAAI,EAAE;YAAE,QAAQ,EAAE,UAAU,CAAC;YAAC,KAAK,EAAE,MAAM,CAAA;SAAE,CAAA;QAC7C,KAAK,EAAE;YAAE,QAAQ,EAAE,UAAU,CAAC;YAAC,KAAK,EAAE,MAAM,CAAA;SAAE,CAAA;KAC/C,CAAA;IACD,OAAO,CAAC,EAAE,OAAO,CAAA;CAClB;AAED,wBAAgB,kBAAkB,CAAC,EACjC,eAAe,EACf,OAAO,EACP,aAAa,EACb,QAAgB,EAChB,OAAO,EACP,OAAe,EACf,GAAG,KAAK,EACT,EAAE,uBAAuB,qBA8BzB"}
@@ -0,0 +1,48 @@
1
+ import React from 'react';
2
+ import { StyleSheet } from 'react-native';
3
+ import { Pressable } from 'react-native-gesture-handler';
4
+ import { Icon, Spinner, Text } from '../display';
5
+ import { useCreateAndroidRippleColor, useTheme } from '../../hooks';
6
+ import { platformFontWeightMedium, platformPressedOpacityStyle } from '../../utils/styles';
7
+ export function ActionToggleButton({ backgroundColor, onPress, toggleContent, disabled = false, toggled, loading = false, ...props }) {
8
+ const styles = useStyles({ backgroundColor, disabled });
9
+ const androidRippleColor = useCreateAndroidRippleColor({
10
+ color: backgroundColor,
11
+ });
12
+ const { iconName, label } = toggleContent[toggled ? 'true' : 'false'];
13
+ return (<Pressable onPress={onPress} style={({ pressed }) => [styles.button, pressed && platformPressedOpacityStyle]} android_ripple={{ color: androidRippleColor, borderless: false, foreground: true }} disabled={disabled || loading} accessibilityRole="togglebutton" accessibilityState={{ checked: toggled }} {...props}>
14
+ {loading ? (<Spinner size={20}/>) : (<>
15
+ <Icon name={iconName} style={styles.icon} size={20}/>
16
+ <Text variant="footnote" style={styles.text}>
17
+ {label}
18
+ </Text>
19
+ </>)}
20
+ </Pressable>);
21
+ }
22
+ const useStyles = ({ backgroundColor, disabled }) => {
23
+ const { colors } = useTheme();
24
+ const fillColor = disabled ? colors.textColorDefaultDisabled : colors.fillColorNeutral100Inverted;
25
+ const buttonBackgroundColor = disabled
26
+ ? colors.fillColorButtonNeutralSolidDisabled
27
+ : backgroundColor;
28
+ return StyleSheet.create({
29
+ button: {
30
+ flex: 1,
31
+ flexDirection: 'column',
32
+ alignItems: 'center',
33
+ justifyContent: 'center',
34
+ gap: 4,
35
+ height: '100%',
36
+ backgroundColor: buttonBackgroundColor,
37
+ },
38
+ icon: {
39
+ color: fillColor,
40
+ marginTop: 4,
41
+ },
42
+ text: {
43
+ color: fillColor,
44
+ fontWeight: platformFontWeightMedium,
45
+ },
46
+ });
47
+ };
48
+ //# sourceMappingURL=action_toggle_button.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"action_toggle_button.js","sourceRoot":"","sources":["../../../src/components/conversations/action_toggle_button.tsx"],"names":[],"mappings":"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","sourcesContent":["import React from 'react'\nimport { StyleSheet } from 'react-native'\nimport { Pressable, type PressableProps } from 'react-native-gesture-handler'\nimport { Icon, IconString, Spinner, Text } from '../display'\nimport { useCreateAndroidRippleColor, useTheme } from '../../hooks'\nimport { platformFontWeightMedium, platformPressedOpacityStyle } from '../../utils/styles'\n\ninterface ActionToggleButtonProps extends PressableProps {\n backgroundColor: string\n toggled: boolean\n toggleContent: {\n true: { iconName: IconString; label: string }\n false: { iconName: IconString; label: string }\n }\n loading?: boolean\n}\n\nexport function ActionToggleButton({\n backgroundColor,\n onPress,\n toggleContent,\n disabled = false,\n toggled,\n loading = false,\n ...props\n}: ActionToggleButtonProps) {\n const styles = useStyles({ backgroundColor, disabled })\n const androidRippleColor = useCreateAndroidRippleColor({\n color: backgroundColor,\n })\n\n const { iconName, label } = toggleContent[toggled ? 'true' : 'false']\n\n return (\n <Pressable\n onPress={onPress}\n style={({ pressed }) => [styles.button, pressed && platformPressedOpacityStyle]}\n android_ripple={{ color: androidRippleColor, borderless: false, foreground: true }}\n disabled={disabled || loading}\n accessibilityRole=\"togglebutton\"\n accessibilityState={{ checked: toggled }}\n {...props}\n >\n {loading ? (\n <Spinner size={20} />\n ) : (\n <>\n <Icon name={iconName} style={styles.icon} size={20} />\n <Text variant=\"footnote\" style={styles.text}>\n {label}\n </Text>\n </>\n )}\n </Pressable>\n )\n}\n\nconst useStyles = ({ backgroundColor, disabled }: Partial<ActionToggleButtonProps>) => {\n const { colors } = useTheme()\n const fillColor = disabled ? colors.textColorDefaultDisabled : colors.fillColorNeutral100Inverted\n const buttonBackgroundColor = disabled\n ? colors.fillColorButtonNeutralSolidDisabled\n : backgroundColor\n\n return StyleSheet.create({\n button: {\n flex: 1,\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n gap: 4,\n height: '100%',\n backgroundColor: buttonBackgroundColor,\n },\n icon: {\n color: fillColor,\n marginTop: 4,\n },\n text: {\n color: fillColor,\n fontWeight: platformFontWeightMedium,\n },\n })\n}\n"]}
@@ -0,0 +1,10 @@
1
+ import React, { ReactNode } from 'react';
2
+ import { ViewStyle } from 'react-native';
3
+ import { ConversationResource } from '../../types';
4
+ export declare function ConversationActions({ children, conversation, style, onPress, }: {
5
+ children: ReactNode;
6
+ conversation: ConversationResource;
7
+ onPress: () => void;
8
+ style?: ViewStyle;
9
+ }): React.JSX.Element;
10
+ //# sourceMappingURL=conversation_actions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conversation_actions.d.ts","sourceRoot":"","sources":["../../../src/components/conversations/conversation_actions.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,SAAS,EAA4C,MAAM,OAAO,CAAA;AAClF,OAAO,EAAyC,SAAS,EAAE,MAAM,cAAc,CAAA;AAU/E,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAA;AAIlD,wBAAgB,mBAAmB,CAAC,EAClC,QAAQ,EACR,YAAY,EACZ,KAAK,EACL,OAAO,GACR,EAAE;IACD,QAAQ,EAAE,SAAS,CAAA;IACnB,YAAY,EAAE,oBAAoB,CAAA;IAClC,OAAO,EAAE,MAAM,IAAI,CAAA;IACnB,KAAK,CAAC,EAAE,SAAS,CAAA;CAClB,qBA+CA"}
@@ -0,0 +1,84 @@
1
+ import React, { useCallback, useEffect, useRef, useState } from 'react';
2
+ import { Platform, Pressable, StyleSheet, View } from 'react-native';
3
+ import ReanimatedSwipeable from 'react-native-gesture-handler/ReanimatedSwipeable';
4
+ import { useConversationsContext } from '../../contexts/conversations_context';
5
+ import { useTheme } from '../../hooks';
6
+ import { useConversationsMarkRead, useConversationsMute, } from '../../hooks/use_conversations_actions';
7
+ import { tokens } from '../../vendor/tapestry/tokens';
8
+ import { ActionToggleButton } from './action_toggle_button';
9
+ export function ConversationActions({ children, conversation, style, onPress, }) {
10
+ const swipeableRef = useRef(null);
11
+ const styles = useStyles();
12
+ const { activeConversationId, setActiveConversationId } = useConversationsContext();
13
+ const [disabled, setDisabled] = useState(false);
14
+ const overshootLeft = Platform.OS === 'ios';
15
+ const handleSwipeableClose = () => {
16
+ setDisabled(false);
17
+ swipeableRef.current?.close();
18
+ };
19
+ const handleSwipeableOpen = () => {
20
+ setDisabled(true);
21
+ setActiveConversationId(conversation.id);
22
+ };
23
+ const handlePress = useCallback(() => {
24
+ if (disabled || !onPress)
25
+ return;
26
+ onPress();
27
+ }, [disabled, onPress]);
28
+ useEffect(() => {
29
+ if (activeConversationId === conversation.id)
30
+ return;
31
+ handleSwipeableClose();
32
+ }, [activeConversationId, conversation.id]);
33
+ return (<ReanimatedSwipeable ref={swipeableRef} childrenContainerStyle={styles.swipeableChildContainer} containerStyle={styles.swipeableContainer} overshootFriction={8} overshootLeft={overshootLeft} overshootRight={false} onSwipeableOpenStartDrag={handleSwipeableOpen} onSwipeableClose={() => setDisabled(false)} renderLeftActions={() => (<LeftActions conversation={conversation} onClose={handleSwipeableClose}/>)}>
34
+ <Pressable onPress={handlePress} style={style}>
35
+ {children}
36
+ </Pressable>
37
+ </ReanimatedSwipeable>);
38
+ }
39
+ function LeftActions({ conversation, onClose }) {
40
+ const styles = useStyles();
41
+ const emptyConversation = conversation.lastMessageCreatedAt === null;
42
+ const muteToggleContent = {
43
+ true: { iconName: 'general.bell', label: 'Unmute' },
44
+ false: { iconName: 'general.bellMuted', label: 'Mute' },
45
+ };
46
+ const latestMessageUnreadToggleContent = {
47
+ true: { iconName: 'general.outlinedTextMessage', label: 'Mark read' },
48
+ false: { iconName: 'general.textMessageNotifications', label: 'Mark unread' },
49
+ };
50
+ const { muted, setMuted, isPending } = useConversationsMute({ conversation });
51
+ const { read, markRead, isPending: markReadPending } = useConversationsMarkRead({ conversation });
52
+ const handleMute = useCallback(() => {
53
+ setMuted(!muted);
54
+ onClose();
55
+ }, [muted, onClose, setMuted]);
56
+ const handleLatestMessageUnread = useCallback(() => {
57
+ markRead(!read);
58
+ onClose();
59
+ }, [read, onClose, markRead]);
60
+ return (<View style={styles.actionButtonContainer}>
61
+ <ActionToggleButton loading={markReadPending} disabled={emptyConversation} toggled={!read} onPress={handleLatestMessageUnread} toggleContent={latestMessageUnreadToggleContent} backgroundColor={tokens.fillColorInteractionSwipeDefault}/>
62
+ <ActionToggleButton loading={isPending} toggled={muted} onPress={handleMute} toggleContent={muteToggleContent} backgroundColor={tokens.fillColorInteractionSwipeSecondary}/>
63
+ </View>);
64
+ }
65
+ const ACTION_BUTTON_WIDTH = 120;
66
+ const ACTION_BUTTON_COUNT = 2;
67
+ const useStyles = () => {
68
+ const { colors } = useTheme();
69
+ return StyleSheet.create({
70
+ swipeableChildContainer: {
71
+ backgroundColor: colors.surfaceColor100,
72
+ },
73
+ actionButtonContainer: {
74
+ flexDirection: 'row',
75
+ alignItems: 'center',
76
+ width: ACTION_BUTTON_WIDTH * ACTION_BUTTON_COUNT,
77
+ alignContent: 'stretch',
78
+ },
79
+ swipeableContainer: {
80
+ backgroundColor: colors.surfaceColor090,
81
+ },
82
+ });
83
+ };
84
+ //# sourceMappingURL=conversation_actions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conversation_actions.js","sourceRoot":"","sources":["../../../src/components/conversations/conversation_actions.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, { ReactNode, useCallback, useEffect, useRef, useState } from 'react'\nimport { Platform, Pressable, StyleSheet, View, ViewStyle } from 'react-native'\nimport ReanimatedSwipeable, {\n SwipeableMethods,\n} from 'react-native-gesture-handler/ReanimatedSwipeable'\nimport { useConversationsContext } from '../../contexts/conversations_context'\nimport { useTheme } from '../../hooks'\nimport {\n useConversationsMarkRead,\n useConversationsMute,\n} from '../../hooks/use_conversations_actions'\nimport { ConversationResource } from '../../types'\nimport { tokens } from '../../vendor/tapestry/tokens'\nimport { ActionToggleButton } from './action_toggle_button'\n\nexport function ConversationActions({\n children,\n conversation,\n style,\n onPress,\n}: {\n children: ReactNode\n conversation: ConversationResource\n onPress: () => void\n style?: ViewStyle\n}) {\n const swipeableRef = useRef<SwipeableMethods>(null)\n const styles = useStyles()\n const { activeConversationId, setActiveConversationId } = useConversationsContext()\n const [disabled, setDisabled] = useState(false)\n const overshootLeft = Platform.OS === 'ios'\n\n const handleSwipeableClose = () => {\n setDisabled(false)\n swipeableRef.current?.close()\n }\n\n const handleSwipeableOpen = () => {\n setDisabled(true)\n setActiveConversationId(conversation.id)\n }\n\n const handlePress = useCallback(() => {\n if (disabled || !onPress) return\n onPress()\n }, [disabled, onPress])\n\n useEffect(() => {\n if (activeConversationId === conversation.id) return\n\n handleSwipeableClose()\n }, [activeConversationId, conversation.id])\n\n return (\n <ReanimatedSwipeable\n ref={swipeableRef}\n childrenContainerStyle={styles.swipeableChildContainer}\n containerStyle={styles.swipeableContainer}\n overshootFriction={8}\n overshootLeft={overshootLeft}\n overshootRight={false}\n onSwipeableOpenStartDrag={handleSwipeableOpen}\n onSwipeableClose={() => setDisabled(false)}\n renderLeftActions={() => (\n <LeftActions conversation={conversation} onClose={handleSwipeableClose} />\n )}\n >\n <Pressable onPress={handlePress} style={style}>\n {children}\n </Pressable>\n </ReanimatedSwipeable>\n )\n}\n\ninterface LeftActionsProps {\n conversation: ConversationResource\n onClose: () => void\n}\n\nfunction LeftActions({ conversation, onClose }: LeftActionsProps) {\n const styles = useStyles()\n const emptyConversation = conversation.lastMessageCreatedAt === null\n\n const muteToggleContent = {\n true: { iconName: 'general.bell', label: 'Unmute' },\n false: { iconName: 'general.bellMuted', label: 'Mute' },\n } as const\n\n const latestMessageUnreadToggleContent = {\n true: { iconName: 'general.outlinedTextMessage', label: 'Mark read' },\n false: { iconName: 'general.textMessageNotifications', label: 'Mark unread' },\n } as const\n const { muted, setMuted, isPending } = useConversationsMute({ conversation })\n const { read, markRead, isPending: markReadPending } = useConversationsMarkRead({ conversation })\n\n const handleMute = useCallback(() => {\n setMuted(!muted)\n onClose()\n }, [muted, onClose, setMuted])\n\n const handleLatestMessageUnread = useCallback(() => {\n markRead(!read)\n onClose()\n }, [read, onClose, markRead])\n\n return (\n <View style={styles.actionButtonContainer}>\n <ActionToggleButton\n loading={markReadPending}\n disabled={emptyConversation}\n toggled={!read}\n onPress={handleLatestMessageUnread}\n toggleContent={latestMessageUnreadToggleContent}\n backgroundColor={tokens.fillColorInteractionSwipeDefault}\n />\n <ActionToggleButton\n loading={isPending}\n toggled={muted}\n onPress={handleMute}\n toggleContent={muteToggleContent}\n backgroundColor={tokens.fillColorInteractionSwipeSecondary}\n />\n </View>\n )\n}\n\nconst ACTION_BUTTON_WIDTH = 120\nconst ACTION_BUTTON_COUNT = 2\n\nconst useStyles = () => {\n const { colors } = useTheme()\n return StyleSheet.create({\n swipeableChildContainer: {\n backgroundColor: colors.surfaceColor100,\n },\n actionButtonContainer: {\n flexDirection: 'row',\n alignItems: 'center',\n width: ACTION_BUTTON_WIDTH * ACTION_BUTTON_COUNT,\n alignContent: 'stretch',\n },\n swipeableContainer: {\n backgroundColor: colors.surfaceColor090,\n },\n })\n}\n"]}
@@ -3,7 +3,8 @@ import { ConversationResource } from '../../types';
3
3
  interface ConversationPreviewProps {
4
4
  conversation: ConversationResource;
5
5
  onPress: () => void;
6
+ showBadges?: boolean;
6
7
  }
7
- export declare const ConversationPreview: ({ conversation, onPress }: ConversationPreviewProps) => React.JSX.Element;
8
+ export declare const ConversationPreview: ({ conversation, onPress, showBadges, }: ConversationPreviewProps) => React.JSX.Element;
8
9
  export {};
9
10
  //# sourceMappingURL=conversation_preview.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"conversation_preview.d.ts","sourceRoot":"","sources":["../../../src/components/conversations/conversation_preview.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AAEzB,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAA;AAMlD,UAAU,wBAAwB;IAChC,YAAY,EAAE,oBAAoB,CAAA;IAClC,OAAO,EAAE,MAAM,IAAI,CAAA;CACpB;AAED,eAAO,MAAM,mBAAmB,8BAA+B,wBAAwB,sBAuCtF,CAAA"}
1
+ {"version":3,"file":"conversation_preview.d.ts","sourceRoot":"","sources":["../../../src/components/conversations/conversation_preview.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AAEzB,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAA;AAQlD,UAAU,wBAAwB;IAChC,YAAY,EAAE,oBAAoB,CAAA;IAClC,OAAO,EAAE,MAAM,IAAI,CAAA;IACnB,UAAU,CAAC,EAAE,OAAO,CAAA;CACrB;AAED,eAAO,MAAM,mBAAmB,2CAI7B,wBAAwB,sBAkC1B,CAAA"}
@@ -1,13 +1,15 @@
1
1
  import React from 'react';
2
- import { Pressable, StyleSheet, View } from 'react-native';
2
+ import { StyleSheet, View } from 'react-native';
3
3
  import { AvatarGroup, Heading, Text, Badge } from '../display';
4
4
  import { formatDatePreview } from '../../utils/date';
5
5
  import { useTheme } from '../../hooks';
6
6
  import { UnreadCountBadge } from './unread_count_badge';
7
- export const ConversationPreview = ({ conversation, onPress }) => {
7
+ import { ConversationActions } from './conversation_actions';
8
+ import { MuteIndicator } from './mute_indicator';
9
+ export const ConversationPreview = ({ conversation, onPress, showBadges = true, }) => {
8
10
  const styles = useStyles();
9
- const { lastMessageAuthorName, lastMessageCreatedAt, lastMessageTextPreview, previewAvatarUrls, title, unreadCount, badges, } = conversation;
10
- return (<Pressable style={styles.previewRow} onPress={onPress}>
11
+ const { lastMessageAuthorName, lastMessageCreatedAt, lastMessageTextPreview, previewAvatarUrls, title, unreadCount, badges, muted, } = conversation;
12
+ return (<ConversationActions conversation={conversation} style={styles.previewRow} onPress={onPress}>
11
13
  <AvatarGroup size="lg" sourceUris={previewAvatarUrls || []}/>
12
14
  <View style={styles.conversationBody}>
13
15
  <Heading numberOfLines={1} variant="h3" style={styles.title}>
@@ -16,15 +18,25 @@ export const ConversationPreview = ({ conversation, onPress }) => {
16
18
  <Text variant="tertiary" numberOfLines={2}>
17
19
  {lastMessageAuthorName}: {lastMessageTextPreview}
18
20
  </Text>
19
- <View style={styles.badges}>
20
- {badges?.map(badge => (<Badge key={badge.text} variant="meta" productLogoName={badge.appName} label={badge.pcoResourceType} metaLabel={badge.text || ''}/>))}
21
- </View>
21
+ <ConversationBadges visible={showBadges} badges={badges}/>
22
22
  </View>
23
23
  <View style={styles.metaContainer}>
24
24
  <Text variant="tertiary">{formatDatePreview(lastMessageCreatedAt)}</Text>
25
- <UnreadCountBadge count={unreadCount}/>
25
+ <View style={styles.statusContainer}>
26
+ <UnreadCountBadge count={unreadCount} showDot={muted}/>
27
+ <MuteIndicator muted={muted}/>
28
+ </View>
26
29
  </View>
27
- </Pressable>);
30
+ </ConversationActions>);
31
+ };
32
+ const ConversationBadges = ({ visible, badges }) => {
33
+ const styles = useStyles();
34
+ if (!visible || !badges || badges.length === 0) {
35
+ return null;
36
+ }
37
+ return (<View style={styles.badges}>
38
+ {badges.map(badge => (<Badge key={badge.text} variant="meta" productLogoName={badge.appName} label={badge.pcoResourceType} metaLabel={badge.text || ''}/>))}
39
+ </View>);
28
40
  };
29
41
  const useStyles = () => {
30
42
  const { colors } = useTheme();
@@ -48,11 +60,17 @@ const useStyles = () => {
48
60
  },
49
61
  metaContainer: {
50
62
  rowGap: 4,
63
+ alignItems: 'flex-end',
51
64
  },
52
65
  badges: {
53
66
  marginTop: 4,
54
67
  alignItems: 'flex-start',
55
68
  },
69
+ statusContainer: {
70
+ flexDirection: 'row',
71
+ alignItems: 'center',
72
+ gap: 4,
73
+ },
56
74
  });
57
75
  };
58
76
  //# sourceMappingURL=conversation_preview.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"conversation_preview.js","sourceRoot":"","sources":["../../../src/components/conversations/conversation_preview.tsx"],"names":[],"mappings":"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","sourcesContent":["import React from 'react'\nimport { Pressable, StyleSheet, View } from 'react-native'\nimport { ConversationResource } from '../../types'\nimport { AvatarGroup, Heading, Text, Badge } from '../display'\nimport { formatDatePreview } from '../../utils/date'\nimport { useTheme } from '../../hooks'\nimport { UnreadCountBadge } from './unread_count_badge'\n\ninterface ConversationPreviewProps {\n conversation: ConversationResource\n onPress: () => void\n}\n\nexport const ConversationPreview = ({ conversation, onPress }: ConversationPreviewProps) => {\n const styles = useStyles()\n const {\n lastMessageAuthorName,\n lastMessageCreatedAt,\n lastMessageTextPreview,\n previewAvatarUrls,\n title,\n unreadCount,\n badges,\n } = conversation\n return (\n <Pressable style={styles.previewRow} onPress={onPress}>\n <AvatarGroup size=\"lg\" sourceUris={previewAvatarUrls || []} />\n <View style={styles.conversationBody}>\n <Heading numberOfLines={1} variant=\"h3\" style={styles.title}>\n {title}\n </Heading>\n <Text variant=\"tertiary\" numberOfLines={2}>\n {lastMessageAuthorName}: {lastMessageTextPreview}\n </Text>\n <View style={styles.badges}>\n {badges?.map(badge => (\n <Badge\n key={badge.text}\n variant=\"meta\"\n productLogoName={badge.appName}\n label={badge.pcoResourceType}\n metaLabel={badge.text || ''}\n />\n ))}\n </View>\n </View>\n <View style={styles.metaContainer}>\n <Text variant=\"tertiary\">{formatDatePreview(lastMessageCreatedAt)}</Text>\n <UnreadCountBadge count={unreadCount} />\n </View>\n </Pressable>\n )\n}\n\nconst useStyles = () => {\n const { colors } = useTheme()\n\n return StyleSheet.create({\n previewRow: {\n flexDirection: 'row',\n gap: 8,\n borderBottomWidth: 1,\n borderBottomColor: colors.borderColorDefaultDim,\n paddingTop: 12,\n paddingBottom: 12,\n paddingHorizontal: 16,\n },\n title: {\n fontSize: 16,\n color: colors.textColorDefaultPrimary,\n },\n conversationBody: {\n flex: 1,\n rowGap: 2,\n },\n metaContainer: {\n rowGap: 4,\n },\n badges: {\n marginTop: 4,\n alignItems: 'flex-start',\n },\n })\n}\n"]}
1
+ {"version":3,"file":"conversation_preview.js","sourceRoot":"","sources":["../../../src/components/conversations/conversation_preview.tsx"],"names":[],"mappings":"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","sourcesContent":["import React from 'react'\nimport { StyleSheet, View } from 'react-native'\nimport { ConversationResource } from '../../types'\nimport { AvatarGroup, Heading, Text, Badge } from '../display'\nimport { formatDatePreview } from '../../utils/date'\nimport { useTheme } from '../../hooks'\nimport { UnreadCountBadge } from './unread_count_badge'\nimport { ConversationActions } from './conversation_actions'\nimport { MuteIndicator } from './mute_indicator'\n\ninterface ConversationPreviewProps {\n conversation: ConversationResource\n onPress: () => void\n showBadges?: boolean\n}\n\nexport const ConversationPreview = ({\n conversation,\n onPress,\n showBadges = true,\n}: ConversationPreviewProps) => {\n const styles = useStyles()\n const {\n lastMessageAuthorName,\n lastMessageCreatedAt,\n lastMessageTextPreview,\n previewAvatarUrls,\n title,\n unreadCount,\n badges,\n muted,\n } = conversation\n\n return (\n <ConversationActions conversation={conversation} style={styles.previewRow} onPress={onPress}>\n <AvatarGroup size=\"lg\" sourceUris={previewAvatarUrls || []} />\n <View style={styles.conversationBody}>\n <Heading numberOfLines={1} variant=\"h3\" style={styles.title}>\n {title}\n </Heading>\n <Text variant=\"tertiary\" numberOfLines={2}>\n {lastMessageAuthorName}: {lastMessageTextPreview}\n </Text>\n <ConversationBadges visible={showBadges} badges={badges} />\n </View>\n <View style={styles.metaContainer}>\n <Text variant=\"tertiary\">{formatDatePreview(lastMessageCreatedAt)}</Text>\n <View style={styles.statusContainer}>\n <UnreadCountBadge count={unreadCount} showDot={muted} />\n <MuteIndicator muted={muted} />\n </View>\n </View>\n </ConversationActions>\n )\n}\n\nconst ConversationBadges = ({ visible, badges }: { visible: boolean; badges?: any[] }) => {\n const styles = useStyles()\n\n if (!visible || !badges || badges.length === 0) {\n return null\n }\n\n return (\n <View style={styles.badges}>\n {badges.map(badge => (\n <Badge\n key={badge.text}\n variant=\"meta\"\n productLogoName={badge.appName}\n label={badge.pcoResourceType}\n metaLabel={badge.text || ''}\n />\n ))}\n </View>\n )\n}\n\nconst useStyles = () => {\n const { colors } = useTheme()\n\n return StyleSheet.create({\n previewRow: {\n flexDirection: 'row',\n gap: 8,\n borderBottomWidth: 1,\n borderBottomColor: colors.borderColorDefaultDim,\n paddingTop: 12,\n paddingBottom: 12,\n paddingHorizontal: 16,\n },\n title: {\n fontSize: 16,\n color: colors.textColorDefaultPrimary,\n },\n conversationBody: {\n flex: 1,\n rowGap: 2,\n },\n metaContainer: {\n rowGap: 4,\n alignItems: 'flex-end',\n },\n badges: {\n marginTop: 4,\n alignItems: 'flex-start',\n },\n statusContainer: {\n flexDirection: 'row',\n alignItems: 'center',\n gap: 4,\n },\n })\n}\n"]}
@@ -1,8 +1,7 @@
1
1
  import React from 'react';
2
- import { ConversationRequestArgs } from '../../utils/request/conversation';
3
- interface ConversationsProps extends Partial<ConversationRequestArgs> {
2
+ interface ConversationsProps {
4
3
  ListHeaderComponent?: React.ComponentType<any> | React.ReactElement<any, string | React.JSXElementConstructor<any>> | null | undefined;
5
4
  }
6
- export declare const Conversations: ({ ListHeaderComponent, filter, group, gids, group_source_app_name, }: ConversationsProps) => React.JSX.Element;
5
+ export declare const Conversations: ({ ListHeaderComponent }: ConversationsProps) => React.JSX.Element;
7
6
  export {};
8
7
  //# sourceMappingURL=conversations.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"conversations.d.ts","sourceRoot":"","sources":["../../../src/components/conversations/conversations.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,MAAM,OAAO,CAAA;AAMzB,OAAO,EAAE,uBAAuB,EAAE,MAAM,kCAAkC,CAAA;AAG1E,UAAU,kBAAmB,SAAQ,OAAO,CAAC,uBAAuB,CAAC;IACnE,mBAAmB,CAAC,EAChB,KAAK,CAAC,aAAa,CAAC,GAAG,CAAC,GACxB,KAAK,CAAC,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,KAAK,CAAC,qBAAqB,CAAC,GAAG,CAAC,CAAC,GAClE,IAAI,GACJ,SAAS,CAAA;CACd;AAED,eAAO,MAAM,aAAa,yEAMvB,kBAAkB,sBAqCpB,CAAA"}
1
+ {"version":3,"file":"conversations.d.ts","sourceRoot":"","sources":["../../../src/components/conversations/conversations.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,MAAM,OAAO,CAAA;AAOzB,UAAU,kBAAkB;IAC1B,mBAAmB,CAAC,EAChB,KAAK,CAAC,aAAa,CAAC,GAAG,CAAC,GACxB,KAAK,CAAC,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,KAAK,CAAC,qBAAqB,CAAC,GAAG,CAAC,CAAC,GAClE,IAAI,GACJ,SAAS,CAAA;CACd;AAED,eAAO,MAAM,aAAa,4BAA6B,kBAAkB,sBAwCxE,CAAA"}