@planningcenter/chat-react-native 3.2.0-rc.8 → 3.2.0

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 (362) hide show
  1. package/build/components/conversation/message_form/message_form_attachment_image.d.ts +13 -0
  2. package/build/components/conversation/message_form/message_form_attachment_image.d.ts.map +1 -0
  3. package/build/components/conversation/message_form/message_form_attachment_image.js +78 -0
  4. package/build/components/conversation/message_form/message_form_attachment_image.js.map +1 -0
  5. package/build/components/conversation/message_form.d.ts.map +1 -1
  6. package/build/components/conversation/message_form.js +128 -16
  7. package/build/components/conversation/message_form.js.map +1 -1
  8. package/build/components/conversations/conversation_actions.d.ts +2 -2
  9. package/build/components/conversations/conversation_actions.d.ts.map +1 -1
  10. package/build/components/conversations/conversation_actions.js.map +1 -1
  11. package/build/components/conversations/conversation_preview.d.ts +3 -1
  12. package/build/components/conversations/conversation_preview.d.ts.map +1 -1
  13. package/build/components/conversations/conversation_preview.js +2 -2
  14. package/build/components/conversations/conversation_preview.js.map +1 -1
  15. package/build/components/display/action_button.d.ts +2 -1
  16. package/build/components/display/action_button.d.ts.map +1 -1
  17. package/build/components/display/action_button.js +3 -4
  18. package/build/components/display/action_button.js.map +1 -1
  19. package/build/components/display/banner.d.ts +6 -1
  20. package/build/components/display/banner.d.ts.map +1 -1
  21. package/build/components/display/banner.js +2 -2
  22. package/build/components/display/banner.js.map +1 -1
  23. package/build/components/display/banner_collapsible.d.ts +1 -1
  24. package/build/components/display/banner_collapsible.d.ts.map +1 -1
  25. package/build/components/display/banner_collapsible.js +2 -2
  26. package/build/components/display/banner_collapsible.js.map +1 -1
  27. package/build/components/display/child_notice.d.ts +3 -1
  28. package/build/components/display/child_notice.d.ts.map +1 -1
  29. package/build/components/display/child_notice.js +2 -2
  30. package/build/components/display/child_notice.js.map +1 -1
  31. package/build/components/display/person.d.ts +3 -1
  32. package/build/components/display/person.d.ts.map +1 -1
  33. package/build/components/display/person.js +2 -2
  34. package/build/components/display/person.js.map +1 -1
  35. package/build/components/group_conversation_list.d.ts +19 -0
  36. package/build/components/group_conversation_list.d.ts.map +1 -0
  37. package/build/components/group_conversation_list.js +48 -0
  38. package/build/components/group_conversation_list.js.map +1 -0
  39. package/build/components/index.d.ts +1 -0
  40. package/build/components/index.d.ts.map +1 -1
  41. package/build/components/index.js +1 -0
  42. package/build/components/index.js.map +1 -1
  43. package/build/components/primitive/banner_primitive.d.ts +3 -0
  44. package/build/components/primitive/banner_primitive.d.ts.map +1 -1
  45. package/build/components/primitive/banner_primitive.js +4 -4
  46. package/build/components/primitive/banner_primitive.js.map +1 -1
  47. package/build/contexts/api_provider.d.ts +1 -1
  48. package/build/contexts/api_provider.d.ts.map +1 -1
  49. package/build/contexts/api_provider.js +3 -3
  50. package/build/contexts/api_provider.js.map +1 -1
  51. package/build/contexts/chat_context.d.ts +4 -4
  52. package/build/contexts/chat_context.d.ts.map +1 -1
  53. package/build/contexts/chat_context.js +3 -3
  54. package/build/contexts/chat_context.js.map +1 -1
  55. package/build/contexts/conversations_context.js +1 -1
  56. package/build/contexts/conversations_context.js.map +1 -1
  57. package/build/hooks/attachments/supported_extensions.d.ts +2 -0
  58. package/build/hooks/attachments/supported_extensions.d.ts.map +1 -0
  59. package/build/hooks/attachments/supported_extensions.js +48 -0
  60. package/build/hooks/attachments/supported_extensions.js.map +1 -0
  61. package/build/hooks/groups/use_group_members_for_new_conversation.d.ts +235 -0
  62. package/build/hooks/groups/use_group_members_for_new_conversation.d.ts.map +1 -0
  63. package/build/hooks/groups/use_group_members_for_new_conversation.js +55 -0
  64. package/build/hooks/groups/use_group_members_for_new_conversation.js.map +1 -0
  65. package/build/hooks/groups/use_groups_conversation_create.d.ts +9 -0
  66. package/build/hooks/groups/use_groups_conversation_create.d.ts.map +1 -0
  67. package/build/hooks/groups/use_groups_conversation_create.js +36 -0
  68. package/build/hooks/groups/use_groups_conversation_create.js.map +1 -0
  69. package/build/hooks/index.d.ts +4 -0
  70. package/build/hooks/index.d.ts.map +1 -1
  71. package/build/hooks/index.js +4 -0
  72. package/build/hooks/index.js.map +1 -1
  73. package/build/hooks/use_api.d.ts +43 -43
  74. package/build/hooks/use_api.d.ts.map +1 -1
  75. package/build/hooks/use_api.js +5 -0
  76. package/build/hooks/use_api.js.map +1 -1
  77. package/build/hooks/use_api_client.d.ts.map +1 -1
  78. package/build/hooks/use_api_client.js +5 -3
  79. package/build/hooks/use_api_client.js.map +1 -1
  80. package/build/hooks/use_attachment_uploader.d.ts +26 -0
  81. package/build/hooks/use_attachment_uploader.d.ts.map +1 -0
  82. package/build/hooks/use_attachment_uploader.js +111 -0
  83. package/build/hooks/use_attachment_uploader.js.map +1 -0
  84. package/build/hooks/use_chat_permissions.d.ts +14 -14
  85. package/build/hooks/use_conversation.d.ts.map +1 -1
  86. package/build/hooks/use_conversation.js +1 -0
  87. package/build/hooks/use_conversation.js.map +1 -1
  88. package/build/hooks/use_conversations_actions.d.ts.map +1 -1
  89. package/build/hooks/use_conversations_actions.js +10 -0
  90. package/build/hooks/use_conversations_actions.js.map +1 -1
  91. package/build/hooks/use_conversations_jolt_events.d.ts.map +1 -1
  92. package/build/hooks/use_conversations_jolt_events.js +4 -1
  93. package/build/hooks/use_conversations_jolt_events.js.map +1 -1
  94. package/build/hooks/use_current_person.d.ts +15 -0
  95. package/build/hooks/use_current_person.d.ts.map +1 -1
  96. package/build/hooks/use_current_person.js +26 -9
  97. package/build/hooks/use_current_person.js.map +1 -1
  98. package/build/hooks/use_groups.d.ts +26 -26
  99. package/build/hooks/use_groups_groups.d.ts +26 -26
  100. package/build/hooks/use_jolt.d.ts.map +1 -1
  101. package/build/hooks/use_jolt.js +15 -22
  102. package/build/hooks/use_jolt.js.map +1 -1
  103. package/build/hooks/use_message_create.js +2 -2
  104. package/build/hooks/use_message_create.js.map +1 -1
  105. package/build/hooks/use_suspense_api.d.ts.map +1 -1
  106. package/build/hooks/use_suspense_api.js +5 -0
  107. package/build/hooks/use_suspense_api.js.map +1 -1
  108. package/build/hooks/use_teams.d.ts +26 -26
  109. package/build/hooks/use_upload_client.d.ts +28 -0
  110. package/build/hooks/use_upload_client.d.ts.map +1 -0
  111. package/build/hooks/use_upload_client.js +32 -0
  112. package/build/hooks/use_upload_client.js.map +1 -0
  113. package/build/index.d.ts +3 -2
  114. package/build/index.d.ts.map +1 -1
  115. package/build/index.js +3 -2
  116. package/build/index.js.map +1 -1
  117. package/build/navigation/index.d.ts +52 -34
  118. package/build/navigation/index.d.ts.map +1 -1
  119. package/build/navigation/index.js +16 -2
  120. package/build/navigation/index.js.map +1 -1
  121. package/build/screens/conversation_details_screen.js +2 -2
  122. package/build/screens/conversation_details_screen.js.map +1 -1
  123. package/build/screens/conversation_filter_recipients/components/checkbox_row.d.ts +10 -0
  124. package/build/screens/conversation_filter_recipients/components/checkbox_row.d.ts.map +1 -0
  125. package/build/screens/conversation_filter_recipients/components/checkbox_row.js +74 -0
  126. package/build/screens/conversation_filter_recipients/components/checkbox_row.js.map +1 -0
  127. package/build/screens/conversation_filter_recipients/components/header_row.d.ts +10 -0
  128. package/build/screens/conversation_filter_recipients/components/header_row.d.ts.map +1 -0
  129. package/build/screens/conversation_filter_recipients/components/header_row.js +69 -0
  130. package/build/screens/conversation_filter_recipients/components/header_row.js.map +1 -0
  131. package/build/screens/conversation_filter_recipients/components/navigation_header.d.ts +5 -0
  132. package/build/screens/conversation_filter_recipients/components/navigation_header.d.ts.map +1 -0
  133. package/build/screens/conversation_filter_recipients/components/navigation_header.js +46 -0
  134. package/build/screens/conversation_filter_recipients/components/navigation_header.js.map +1 -0
  135. package/build/screens/conversation_filter_recipients/context/conversation_filter_recipients_context.d.ts +17 -0
  136. package/build/screens/conversation_filter_recipients/context/conversation_filter_recipients_context.d.ts.map +1 -0
  137. package/build/screens/conversation_filter_recipients/context/conversation_filter_recipients_context.js +37 -0
  138. package/build/screens/conversation_filter_recipients/context/conversation_filter_recipients_context.js.map +1 -0
  139. package/build/screens/conversation_filter_recipients/conversation_filter_recipients_screen.d.ts +1 -3
  140. package/build/screens/conversation_filter_recipients/conversation_filter_recipients_screen.d.ts.map +1 -1
  141. package/build/screens/conversation_filter_recipients/conversation_filter_recipients_screen.js +67 -32
  142. package/build/screens/conversation_filter_recipients/conversation_filter_recipients_screen.js.map +1 -1
  143. package/build/screens/conversation_filter_recipients/hooks/use_flattened_array_of_service_types_with_teams.d.ts +10 -0
  144. package/build/screens/conversation_filter_recipients/hooks/use_flattened_array_of_service_types_with_teams.d.ts.map +1 -0
  145. package/build/screens/conversation_filter_recipients/hooks/use_flattened_array_of_service_types_with_teams.js +32 -0
  146. package/build/screens/conversation_filter_recipients/hooks/use_flattened_array_of_service_types_with_teams.js.map +1 -0
  147. package/build/screens/conversation_filter_recipients/hooks/use_service_types_with_teams.d.ts +8 -0
  148. package/build/screens/conversation_filter_recipients/hooks/use_service_types_with_teams.d.ts.map +1 -0
  149. package/build/screens/conversation_filter_recipients/hooks/use_service_types_with_teams.js +65 -0
  150. package/build/screens/conversation_filter_recipients/hooks/use_service_types_with_teams.js.map +1 -0
  151. package/build/screens/conversation_filter_recipients/types.d.ts +38 -0
  152. package/build/screens/conversation_filter_recipients/types.d.ts.map +1 -0
  153. package/build/screens/conversation_filter_recipients/types.js +6 -0
  154. package/build/screens/conversation_filter_recipients/types.js.map +1 -0
  155. package/build/screens/conversation_filters/components/conversation_filters.js +5 -2
  156. package/build/screens/conversation_filters/components/conversation_filters.js.map +1 -1
  157. package/build/screens/conversation_filters/components/rows.d.ts.map +1 -1
  158. package/build/screens/conversation_filters/components/rows.js +6 -1
  159. package/build/screens/conversation_filters/components/rows.js.map +1 -1
  160. package/build/screens/conversation_filters/group_filters.d.ts.map +1 -1
  161. package/build/screens/conversation_filters/group_filters.js +12 -4
  162. package/build/screens/conversation_filters/group_filters.js.map +1 -1
  163. package/build/screens/conversation_filters/hooks/filters.d.ts +40 -40
  164. package/build/screens/conversation_filters/hooks/filters.js +1 -1
  165. package/build/screens/conversation_filters/hooks/filters.js.map +1 -1
  166. package/build/screens/conversation_filters/team_filters.d.ts.map +1 -1
  167. package/build/screens/conversation_filters/team_filters.js +12 -4
  168. package/build/screens/conversation_filters/team_filters.js.map +1 -1
  169. package/build/screens/conversation_filters_screen.js +1 -0
  170. package/build/screens/conversation_filters_screen.js.map +1 -1
  171. package/build/screens/conversation_new/components/form_list.d.ts +12 -0
  172. package/build/screens/conversation_new/components/form_list.d.ts.map +1 -0
  173. package/build/screens/conversation_new/components/form_list.js +42 -0
  174. package/build/screens/conversation_new/components/form_list.js.map +1 -0
  175. package/build/screens/conversation_new/components/groups_form.d.ts +4 -2
  176. package/build/screens/conversation_new/components/groups_form.d.ts.map +1 -1
  177. package/build/screens/conversation_new/components/groups_form.js +82 -90
  178. package/build/screens/conversation_new/components/groups_form.js.map +1 -1
  179. package/build/screens/conversation_new/components/team_form.d.ts +1 -1
  180. package/build/screens/conversation_new/components/team_form.js.map +1 -1
  181. package/build/screens/conversation_new/conversation_new_screen.d.ts +5 -2
  182. package/build/screens/conversation_new/conversation_new_screen.d.ts.map +1 -1
  183. package/build/screens/conversation_new/conversation_new_screen.js +2 -2
  184. package/build/screens/conversation_new/conversation_new_screen.js.map +1 -1
  185. package/build/screens/conversation_screen.d.ts +7 -0
  186. package/build/screens/conversation_screen.d.ts.map +1 -1
  187. package/build/screens/conversation_screen.js +103 -4
  188. package/build/screens/conversation_screen.js.map +1 -1
  189. package/build/screens/conversation_select_recipients/components/groups_without_chat_disclaimer_row.d.ts +2 -0
  190. package/build/screens/conversation_select_recipients/components/groups_without_chat_disclaimer_row.d.ts.map +1 -0
  191. package/build/screens/conversation_select_recipients/components/groups_without_chat_disclaimer_row.js +17 -0
  192. package/build/screens/conversation_select_recipients/components/groups_without_chat_disclaimer_row.js.map +1 -0
  193. package/build/screens/conversation_select_recipients/components/recipient_link_row.d.ts +12 -0
  194. package/build/screens/conversation_select_recipients/components/recipient_link_row.d.ts.map +1 -0
  195. package/build/screens/conversation_select_recipients/components/recipient_link_row.js +61 -0
  196. package/build/screens/conversation_select_recipients/components/recipient_link_row.js.map +1 -0
  197. package/build/screens/conversation_select_recipients/components/view_more_link_row.d.ts +7 -0
  198. package/build/screens/conversation_select_recipients/components/view_more_link_row.d.ts.map +1 -0
  199. package/build/screens/conversation_select_recipients/components/view_more_link_row.js +21 -0
  200. package/build/screens/conversation_select_recipients/components/view_more_link_row.js.map +1 -0
  201. package/build/screens/conversation_select_recipients/conversation_select_group_recipients_screen.d.ts +4 -0
  202. package/build/screens/conversation_select_recipients/conversation_select_group_recipients_screen.d.ts.map +1 -0
  203. package/build/screens/conversation_select_recipients/conversation_select_group_recipients_screen.js +48 -0
  204. package/build/screens/conversation_select_recipients/conversation_select_group_recipients_screen.js.map +1 -0
  205. package/build/screens/conversation_select_recipients/conversation_select_recipients_screen.d.ts +2 -6
  206. package/build/screens/conversation_select_recipients/conversation_select_recipients_screen.d.ts.map +1 -1
  207. package/build/screens/conversation_select_recipients/conversation_select_recipients_screen.js +37 -49
  208. package/build/screens/conversation_select_recipients/conversation_select_recipients_screen.js.map +1 -1
  209. package/build/screens/conversation_select_recipients/types/screen_props.d.ts +9 -0
  210. package/build/screens/conversation_select_recipients/types/screen_props.d.ts.map +1 -0
  211. package/build/screens/conversation_select_recipients/types/screen_props.js +2 -0
  212. package/build/screens/conversation_select_recipients/types/screen_props.js.map +1 -0
  213. package/build/screens/conversations/components/list_header_component.d.ts.map +1 -1
  214. package/build/screens/conversations/components/list_header_component.js +18 -4
  215. package/build/screens/conversations/components/list_header_component.js.map +1 -1
  216. package/build/screens/conversations/conversations_screen.d.ts +2 -1
  217. package/build/screens/conversations/conversations_screen.d.ts.map +1 -1
  218. package/build/screens/conversations/conversations_screen.js +32 -1
  219. package/build/screens/conversations/conversations_screen.js.map +1 -1
  220. package/build/screens/send_giphy_screen.js +29 -1
  221. package/build/screens/send_giphy_screen.js.map +1 -1
  222. package/build/types/resources/groups/groups_group_resource.d.ts +1 -1
  223. package/build/types/resources/groups/groups_group_resource.js.map +1 -1
  224. package/build/types/resources/groups/groups_member_resource_with_person.d.ts +14 -0
  225. package/build/types/resources/groups/groups_member_resource_with_person.d.ts.map +1 -0
  226. package/build/types/resources/groups/groups_member_resource_with_person.js +2 -0
  227. package/build/types/resources/groups/groups_member_resource_with_person.js.map +1 -0
  228. package/build/types/resources/member.d.ts +0 -10
  229. package/build/types/resources/member.d.ts.map +1 -1
  230. package/build/types/resources/member.js.map +1 -1
  231. package/build/types/resources/message.d.ts +2 -0
  232. package/build/types/resources/message.d.ts.map +1 -1
  233. package/build/types/resources/message.js.map +1 -1
  234. package/build/types/resources/oauth_token.d.ts +4 -4
  235. package/build/types/resources/oauth_token.d.ts.map +1 -1
  236. package/build/types/resources/oauth_token.js.map +1 -1
  237. package/build/utils/client/client.d.ts +4 -8
  238. package/build/utils/client/client.d.ts.map +1 -1
  239. package/build/utils/client/client.js +10 -9
  240. package/build/utils/client/client.js.map +1 -1
  241. package/build/utils/date.d.ts +5 -0
  242. package/build/utils/date.d.ts.map +1 -1
  243. package/build/utils/date.js +8 -1
  244. package/build/utils/date.js.map +1 -1
  245. package/build/utils/destructure_chat_group_graph_id.d.ts +10 -0
  246. package/build/utils/destructure_chat_group_graph_id.d.ts.map +1 -0
  247. package/build/utils/destructure_chat_group_graph_id.js +8 -0
  248. package/build/utils/destructure_chat_group_graph_id.js.map +1 -0
  249. package/build/utils/index.d.ts +1 -0
  250. package/build/utils/index.d.ts.map +1 -1
  251. package/build/utils/index.js +1 -0
  252. package/build/utils/index.js.map +1 -1
  253. package/build/utils/native_adapters/configuration.d.ts +4 -1
  254. package/build/utils/native_adapters/configuration.d.ts.map +1 -1
  255. package/build/utils/native_adapters/configuration.js +13 -1
  256. package/build/utils/native_adapters/configuration.js.map +1 -1
  257. package/build/utils/native_adapters/image_picker.d.ts +25 -0
  258. package/build/utils/native_adapters/image_picker.d.ts.map +1 -0
  259. package/build/utils/native_adapters/image_picker.js +9 -0
  260. package/build/utils/native_adapters/image_picker.js.map +1 -0
  261. package/build/utils/native_adapters/index.d.ts +1 -0
  262. package/build/utils/native_adapters/index.d.ts.map +1 -1
  263. package/build/utils/native_adapters/index.js +1 -0
  264. package/build/utils/native_adapters/index.js.map +1 -1
  265. package/build/utils/session.d.ts +6 -2
  266. package/build/utils/session.d.ts.map +1 -1
  267. package/build/utils/session.js +6 -1
  268. package/build/utils/session.js.map +1 -1
  269. package/build/utils/upload_uri.d.ts +23 -0
  270. package/build/utils/upload_uri.d.ts.map +1 -0
  271. package/build/utils/upload_uri.js +60 -0
  272. package/build/utils/upload_uri.js.map +1 -0
  273. package/build/utils/uri.d.ts +10 -2
  274. package/build/utils/uri.d.ts.map +1 -1
  275. package/build/utils/uri.js +24 -6
  276. package/build/utils/uri.js.map +1 -1
  277. package/build/vendor/tapestry/alias_tokens_color_map.d.ts +2 -0
  278. package/build/vendor/tapestry/alias_tokens_color_map.d.ts.map +1 -1
  279. package/build/vendor/tapestry/alias_tokens_color_map.js +2 -0
  280. package/build/vendor/tapestry/alias_tokens_color_map.js.map +1 -1
  281. package/package.json +4 -3
  282. package/src/__tests__/hooks/useTheme.tsx +1 -1
  283. package/src/__tests__/{client.ts → utils/client.ts} +7 -115
  284. package/src/__tests__/{session.ts → utils/session.ts} +4 -4
  285. package/src/__tests__/utils/uri.ts +107 -0
  286. package/src/components/conversation/message_form/message_form_attachment_image.tsx +121 -0
  287. package/src/components/conversation/message_form.tsx +197 -31
  288. package/src/components/conversations/conversation_actions.tsx +2 -2
  289. package/src/components/conversations/conversation_preview.tsx +8 -2
  290. package/src/components/display/action_button.tsx +4 -3
  291. package/src/components/display/banner.tsx +7 -1
  292. package/src/components/display/banner_collapsible.tsx +6 -1
  293. package/src/components/display/child_notice.tsx +9 -3
  294. package/src/components/display/person.tsx +4 -3
  295. package/src/components/group_conversation_list.tsx +82 -0
  296. package/src/components/index.tsx +1 -0
  297. package/src/components/primitive/banner_primitive.tsx +12 -5
  298. package/src/contexts/api_provider.tsx +3 -3
  299. package/src/contexts/chat_context.tsx +7 -7
  300. package/src/contexts/conversations_context.tsx +1 -1
  301. package/src/hooks/attachments/supported_extensions.ts +47 -0
  302. package/src/hooks/groups/use_group_members_for_new_conversation.ts +74 -0
  303. package/src/hooks/groups/use_groups_conversation_create.ts +50 -0
  304. package/src/hooks/index.ts +4 -0
  305. package/src/hooks/use_api.ts +13 -7
  306. package/src/hooks/use_api_client.ts +7 -3
  307. package/src/hooks/use_attachment_uploader.ts +179 -0
  308. package/src/hooks/use_conversation.ts +1 -0
  309. package/src/hooks/use_conversations_actions.ts +11 -0
  310. package/src/hooks/use_conversations_jolt_events.ts +5 -1
  311. package/src/hooks/use_current_person.ts +37 -9
  312. package/src/hooks/use_jolt.ts +18 -23
  313. package/src/hooks/use_message_create.ts +2 -2
  314. package/src/hooks/use_suspense_api.ts +6 -0
  315. package/src/hooks/use_upload_client.ts +67 -0
  316. package/src/index.tsx +3 -1
  317. package/src/navigation/index.tsx +23 -2
  318. package/src/screens/conversation_details_screen.tsx +2 -2
  319. package/src/screens/conversation_filter_recipients/components/checkbox_row.tsx +101 -0
  320. package/src/screens/conversation_filter_recipients/components/header_row.tsx +99 -0
  321. package/src/screens/conversation_filter_recipients/components/navigation_header.tsx +68 -0
  322. package/src/screens/conversation_filter_recipients/context/conversation_filter_recipients_context.tsx +53 -0
  323. package/src/screens/conversation_filter_recipients/conversation_filter_recipients_screen.tsx +90 -49
  324. package/src/screens/conversation_filter_recipients/hooks/use_flattened_array_of_service_types_with_teams.tsx +50 -0
  325. package/src/screens/conversation_filter_recipients/hooks/use_service_types_with_teams.ts +90 -0
  326. package/src/screens/conversation_filter_recipients/types.tsx +47 -0
  327. package/src/screens/conversation_filters/components/conversation_filters.tsx +5 -2
  328. package/src/screens/conversation_filters/components/rows.tsx +6 -1
  329. package/src/screens/conversation_filters/group_filters.tsx +23 -14
  330. package/src/screens/conversation_filters/hooks/filters.ts +1 -1
  331. package/src/screens/conversation_filters/team_filters.tsx +23 -14
  332. package/src/screens/conversation_filters_screen.tsx +1 -0
  333. package/src/screens/conversation_new/components/form_list.tsx +67 -0
  334. package/src/screens/conversation_new/components/groups_form.tsx +133 -107
  335. package/src/screens/conversation_new/components/team_form.tsx +1 -1
  336. package/src/screens/conversation_new/conversation_new_screen.tsx +11 -4
  337. package/src/screens/conversation_screen.tsx +123 -4
  338. package/src/screens/conversation_select_recipients/components/groups_without_chat_disclaimer_row.tsx +21 -0
  339. package/src/screens/conversation_select_recipients/components/recipient_link_row.tsx +91 -0
  340. package/src/screens/conversation_select_recipients/components/view_more_link_row.tsx +30 -0
  341. package/src/screens/conversation_select_recipients/conversation_select_group_recipients_screen.tsx +79 -0
  342. package/src/screens/conversation_select_recipients/conversation_select_recipients_screen.tsx +57 -65
  343. package/src/screens/conversation_select_recipients/types/screen_props.tsx +11 -0
  344. package/src/screens/conversations/components/list_header_component.tsx +20 -4
  345. package/src/screens/conversations/conversations_screen.tsx +37 -2
  346. package/src/screens/send_giphy_screen.tsx +30 -1
  347. package/src/types/resources/groups/groups_group_resource.ts +1 -1
  348. package/src/types/resources/groups/groups_member_resource_with_person.ts +13 -0
  349. package/src/types/resources/member.ts +0 -11
  350. package/src/types/resources/message.ts +2 -0
  351. package/src/types/resources/oauth_token.ts +4 -4
  352. package/src/utils/client/client.ts +13 -13
  353. package/src/utils/date.ts +11 -1
  354. package/src/utils/destructure_chat_group_graph_id.ts +25 -0
  355. package/src/utils/index.ts +1 -0
  356. package/src/utils/native_adapters/configuration.ts +15 -1
  357. package/src/utils/native_adapters/image_picker.ts +31 -0
  358. package/src/utils/native_adapters/index.ts +1 -0
  359. package/src/utils/session.ts +10 -4
  360. package/src/utils/upload_uri.ts +69 -0
  361. package/src/utils/uri.ts +30 -6
  362. package/src/vendor/tapestry/alias_tokens_color_map.ts +3 -0
@@ -0,0 +1,79 @@
1
+ import { useNavigation } from '@react-navigation/native'
2
+ import React from 'react'
3
+ import { StyleSheet, View } from 'react-native'
4
+ import { FlashList } from '@shopify/flash-list'
5
+ import { Heading } from '../../components'
6
+ import { GroupsGroupResource } from '../../types'
7
+ import { useGroupsGroups } from '../../hooks/use_groups_groups'
8
+ import { pluralize } from '../../utils'
9
+ import { RecipientLinkRow } from './components/recipient_link_row'
10
+ import { useSafeAreaInsets } from 'react-native-safe-area-context'
11
+ import { ConversationSelectRecipientsScreenProps } from './types/screen_props'
12
+ import { GroupsWithoutChatDisclaimerRow } from './components/groups_without_chat_disclaimer_row'
13
+
14
+ export const ConversationSelectGroupRecipientsScreen = ({
15
+ route,
16
+ }: ConversationSelectRecipientsScreenProps) => {
17
+ const styles = useStyles()
18
+ const navigation = useNavigation()
19
+ const { data: groups = [] } = useGroupsGroups()
20
+ const groupsWithCreatePermission = groups.filter(g => g.canCreateConversation)
21
+ const showGroupsDisclaimer = groups.length > groupsWithCreatePermission.length
22
+
23
+ const handleNavigateToConversationNew = (group: GroupsGroupResource) => {
24
+ navigation.navigate('New', {
25
+ screen: 'ConversationNew',
26
+ params: {
27
+ group_id: group.id,
28
+ source_app_name: 'Groups',
29
+ ...route.params,
30
+ },
31
+ })
32
+ }
33
+
34
+ return (
35
+ <FlashList
36
+ data={groupsWithCreatePermission}
37
+ keyExtractor={item => item.id.toString()}
38
+ estimatedItemSize={65}
39
+ contentContainerStyle={styles.contentContainer}
40
+ ListHeaderComponent={
41
+ <View style={styles.sectionHeader}>
42
+ <Heading variant="h3">All my groups</Heading>
43
+ </View>
44
+ }
45
+ renderItem={({ item: group }: { item: GroupsGroupResource }) => {
46
+ const groupAccessibilityLabel = `Select ${group.name} with ${pluralize(group.membershipsCount, 'member')}`
47
+
48
+ return (
49
+ <RecipientLinkRow
50
+ key={group.id}
51
+ imageUri={group.headerImage?.thumbnail}
52
+ title={group.name}
53
+ subtitle={`${group.membershipsCount} members`}
54
+ onPress={() => handleNavigateToConversationNew(group)}
55
+ accessibilityLabel={groupAccessibilityLabel}
56
+ accessibilityHint={`Selects group as recipient and navigates to the final screen to finish creating the conversation`}
57
+ />
58
+ )
59
+ }}
60
+ ListFooterComponent={showGroupsDisclaimer ? <GroupsWithoutChatDisclaimerRow /> : null}
61
+ />
62
+ )
63
+ }
64
+
65
+ const useStyles = () => {
66
+ const { bottom } = useSafeAreaInsets()
67
+
68
+ return StyleSheet.create({
69
+ contentContainer: {
70
+ paddingBottom: bottom,
71
+ },
72
+ sectionHeader: {
73
+ flexDirection: 'row',
74
+ justifyContent: 'space-between',
75
+ padding: 16,
76
+ paddingBottom: 4,
77
+ },
78
+ })
79
+ }
@@ -1,26 +1,28 @@
1
- import { PlatformPressable } from '@react-navigation/elements'
2
- import { StaticScreenProps, useNavigation } from '@react-navigation/native'
1
+ import { useNavigation } from '@react-navigation/native'
3
2
  import React from 'react'
4
3
  import { ScrollView, StyleSheet, View } from 'react-native'
5
- import { useSafeAreaInsets } from 'react-native-safe-area-context'
6
- import { Button, Heading, Icon, Image, Text } from '../../components'
7
- import { useTheme } from '../../hooks'
4
+ import { Button, Heading } from '../../components'
8
5
  import { GroupsGroupResource } from '../../types'
9
6
  import { useGroupsGroups } from '../../hooks/use_groups_groups'
7
+ import { pluralize } from '../../utils'
8
+ import { RecipientLinkRow } from './components/recipient_link_row'
9
+ import { useSafeAreaInsets } from 'react-native-safe-area-context'
10
+ import { ConversationSelectRecipientsScreenProps } from './types/screen_props'
11
+ import { ViewMoreLinkRow } from './components/view_more_link_row'
12
+ import { GroupsWithoutChatDisclaimerRow } from './components/groups_without_chat_disclaimer_row'
13
+ const MAX_VISIBLE_GROUPS = 5
10
14
 
11
- type ConversationSelectRecipientsScreenProps = StaticScreenProps<{
12
- chat_group_graph_id?: string
13
- }>
14
-
15
- const ASPECT_RATIO = 16 / 9
16
- const THUMBNAIL_WIDTH = 80
17
- const THUMBNAIL_HEIGHT = THUMBNAIL_WIDTH / ASPECT_RATIO
18
-
19
- export const ConversationSelectRecipientsScreen = ({}: ConversationSelectRecipientsScreenProps) => {
15
+ export const ConversationSelectRecipientsScreen = ({
16
+ route,
17
+ }: ConversationSelectRecipientsScreenProps) => {
20
18
  const styles = useStyles()
21
19
  const navigation = useNavigation()
22
20
  const { data: groups = [] } = useGroupsGroups()
23
21
  const groupsWithCreatePermission = groups.filter(g => g.canCreateConversation)
22
+ const visibleGroups = groupsWithCreatePermission.slice(0, MAX_VISIBLE_GROUPS)
23
+ const hasMoreGroups = groupsWithCreatePermission.length > MAX_VISIBLE_GROUPS
24
+ const hasGroupsWithoutChatPermission = groups.length > groupsWithCreatePermission.length
25
+ const showGroupsDisclaimer = hasGroupsWithoutChatPermission && !hasMoreGroups
24
26
 
25
27
  const handleNavigateToConversationNew = (group: GroupsGroupResource) => {
26
28
  navigation.navigate('New', {
@@ -28,48 +30,61 @@ export const ConversationSelectRecipientsScreen = ({}: ConversationSelectRecipie
28
30
  params: {
29
31
  group_id: group.id,
30
32
  source_app_name: 'Groups',
33
+ ...route.params,
34
+ },
35
+ })
36
+ }
37
+
38
+ const handleGroupsViewMore = () => {
39
+ navigation.navigate('New', {
40
+ screen: 'ConversationSelectGroupRecipients',
41
+ params: {
42
+ ...route.params,
31
43
  },
32
44
  })
33
45
  }
34
46
 
35
47
  return (
36
- <ScrollView style={styles.container}>
48
+ <ScrollView contentContainerStyle={styles.contentContainer}>
37
49
  <View style={styles.section}>
38
50
  <View style={styles.sectionHeader}>
39
- <Heading>My groups</Heading>
51
+ <Heading variant="h3">My groups</Heading>
40
52
  </View>
41
53
  <View>
42
- {groupsWithCreatePermission.map(group => (
43
- <PlatformPressable
44
- key={group.id}
45
- style={styles.row}
46
- onPress={() => handleNavigateToConversationNew(group)}
47
- >
48
- <Image
49
- source={{ uri: group.headerImage?.thumbnail }}
50
- resizeMode="cover"
51
- style={styles.rowImage}
52
- alt={`Image for ${group.name}`}
54
+ {visibleGroups.map(group => {
55
+ const groupAccessibilityLabel = `Select ${group.name} with ${pluralize(group.membershipsCount, 'member')}`
56
+
57
+ return (
58
+ <RecipientLinkRow
59
+ key={group.id}
60
+ imageUri={group.headerImage?.thumbnail}
61
+ title={group.name}
62
+ subtitle={`${group.membershipsCount} members`}
63
+ onPress={() => handleNavigateToConversationNew(group)}
64
+ accessibilityLabel={groupAccessibilityLabel}
65
+ accessibilityHint={`Selects group as recipient and navigates to the final screen to finish creating the conversation`}
53
66
  />
54
- <View>
55
- <Heading variant="h3">{group.name}</Heading>
56
- <Text>{group.membershipsCount} members</Text>
57
- </View>
58
- <Icon name="general.rightChevron" size={16} style={styles.rowIconRight} />
59
- </PlatformPressable>
60
- ))}
67
+ )
68
+ })}
69
+ {hasMoreGroups && (
70
+ <ViewMoreLinkRow
71
+ onPress={handleGroupsViewMore}
72
+ accessibilityHint="Navigate to a full list of your groups."
73
+ />
74
+ )}
75
+ {showGroupsDisclaimer && <GroupsWithoutChatDisclaimerRow />}
61
76
  </View>
62
77
  </View>
63
78
  <View style={styles.section}>
64
79
  <View style={styles.sectionHeader}>
65
- <Heading>Teams I lead</Heading>
80
+ <Heading variant="h3">Teams I lead</Heading>
66
81
  <Button
67
82
  style={styles.selectTeamsButton}
68
83
  onPress={() =>
69
84
  navigation.navigate('New', {
70
85
  screen: 'ConversationFilterRecipients',
71
86
  params: {
72
- conversation_id: '2196252',
87
+ source_app_name: 'Services',
73
88
  },
74
89
  })
75
90
  }
@@ -85,45 +100,22 @@ export const ConversationSelectRecipientsScreen = ({}: ConversationSelectRecipie
85
100
 
86
101
  const useStyles = () => {
87
102
  const { bottom } = useSafeAreaInsets()
88
- const theme = useTheme()
89
103
 
90
104
  return StyleSheet.create({
91
- container: {
92
- flex: 1,
93
- gap: 8,
105
+ contentContainer: {
106
+ gap: 24,
107
+ paddingTop: 16,
108
+ paddingBottom: 16 + bottom,
94
109
  },
95
110
  section: {
96
- padding: 16,
97
111
  flex: 1,
98
112
  },
99
113
  sectionHeader: {
100
114
  flexDirection: 'row',
101
115
  justifyContent: 'space-between',
116
+ paddingHorizontal: 16,
117
+ paddingBottom: 4,
102
118
  },
103
119
  selectTeamsButton: {},
104
- row: {
105
- flexDirection: 'row',
106
- alignItems: 'center',
107
- gap: 12,
108
- paddingVertical: 16,
109
- borderBottomWidth: 1,
110
- borderColor: theme.colors.fillColorNeutral050Base,
111
- },
112
- rowImage: {
113
- width: THUMBNAIL_WIDTH,
114
- height: THUMBNAIL_HEIGHT,
115
- borderRadius: 4,
116
- },
117
- rowIconRight: {
118
- marginLeft: 'auto',
119
- color: theme.colors.fillColorNeutral030,
120
- },
121
- routeDebug: {
122
- alignContent: 'center',
123
- padding: 16,
124
- paddingBottom: bottom,
125
- borderTopWidth: 1,
126
- borderTopColor: theme.colors.fillColorNeutral050Base,
127
- },
128
120
  })
129
121
  }
@@ -0,0 +1,11 @@
1
+ import { StaticScreenProps } from '@react-navigation/native'
2
+ import { AppName } from '../../../types/resources/app_name'
3
+ import { GraphId } from '../../../types/resources/group_resource'
4
+
5
+ export type ConversationSelectRecipientsParams = {
6
+ chat_group_graph_id?: GraphId
7
+ group_source_app_name?: AppName
8
+ }
9
+
10
+ export type ConversationSelectRecipientsScreenProps =
11
+ StaticScreenProps<ConversationSelectRecipientsParams>
@@ -1,8 +1,8 @@
1
1
  import { RouteProp, useNavigation, useRoute } from '@react-navigation/native'
2
- import React, { useMemo } from 'react'
3
- import { StyleSheet, View } from 'react-native'
2
+ import React, { useCallback, useMemo } from 'react'
3
+ import { Alert, StyleSheet, View } from 'react-native'
4
4
  import { Heading, TextButton, ToggleButton } from '../../../components'
5
- import { useTheme } from '../../../hooks'
5
+ import { useCurrentPerson, useCurrentPersonCache, useTheme } from '../../../hooks'
6
6
  import { useMarkAllRead } from '../../../hooks/use_conversations_actions'
7
7
  import { useCanDisplayGroups } from '../../../hooks/use_groups'
8
8
  import { ConversationScreenProps } from '../conversations_screen'
@@ -23,6 +23,8 @@ export const ListHeaderComponent = () => {
23
23
  const route = useRoute<RouteProp<ConversationScreenProps['route']>>()
24
24
  const { chat_group_graph_id, group_source_app_name = '' } = route.params || {}
25
25
 
26
+ const { unreadCount } = useCurrentPerson()
27
+ const currentPersonCache = useCurrentPersonCache()
26
28
  const { markAllRead, isPending } = useMarkAllRead()
27
29
 
28
30
  const active: FilterTypes = useMemo(() => {
@@ -37,6 +39,20 @@ export const ListHeaderComponent = () => {
37
39
  return FilterTypes.All
38
40
  }, [chat_group_graph_id, group_source_app_name])
39
41
 
42
+ const handleMarkAllRead = useCallback(() => {
43
+ currentPersonCache.update({ unreadCount: 0 })
44
+ markAllRead()
45
+ }, [currentPersonCache, markAllRead])
46
+
47
+ const alertMarkAllRead = useCallback(() => {
48
+ if (active === FilterTypes.All) return handleMarkAllRead()
49
+
50
+ Alert.alert('Mark all read', 'This includes conversations not shown by the current filter.', [
51
+ { text: 'Cancel' },
52
+ { text: 'OK', onPress: () => handleMarkAllRead() },
53
+ ])
54
+ }, [active, handleMarkAllRead])
55
+
40
56
  const showAppFilters = canFilterByGroups && canFilterByTeams
41
57
 
42
58
  return (
@@ -45,7 +61,7 @@ export const ListHeaderComponent = () => {
45
61
  <Heading numberOfLines={1} variant="h2">
46
62
  Conversations
47
63
  </Heading>
48
- <TextButton onPress={() => markAllRead()} disabled={isPending}>
64
+ <TextButton onPress={alertMarkAllRead} disabled={isPending || !unreadCount}>
49
65
  Mark all read
50
66
  </TextButton>
51
67
  </View>
@@ -6,12 +6,14 @@ import { ActionButton } from '../../components/display/action_button'
6
6
  import { ConversationsContextProvider } from '../../contexts/conversations_context'
7
7
  import { useCanCreateConversations } from '../../hooks'
8
8
  import { GraphId } from '../../types/resources/group_resource'
9
+ import { destructureChatGroupGraphId } from '../../utils'
9
10
  import { ListHeaderComponent } from './components/list_header_component'
11
+ import { AppName } from '../../types/resources/app_name'
10
12
 
11
13
  export type ConversationScreenProps = StaticScreenProps<{
12
14
  title?: string
13
15
  chat_group_graph_id?: GraphId
14
- group_source_app_name?: string
16
+ group_source_app_name?: AppName
15
17
  }>
16
18
 
17
19
  export function ConversationsScreen({ route }: ConversationScreenProps) {
@@ -19,6 +21,39 @@ export function ConversationsScreen({ route }: ConversationScreenProps) {
19
21
  const canCreateConversations = useCanCreateConversations()
20
22
  const styles = useStyles()
21
23
 
24
+ const { chat_group_graph_id } = route.params || {}
25
+ const { sourceAppName, sourceId } = destructureChatGroupGraphId(chat_group_graph_id)
26
+
27
+ const handleNewConversationNavigation = () => {
28
+ if (sourceAppName === 'Services') {
29
+ return navigation.navigate('New', {
30
+ screen: 'ConversationNew',
31
+ params: {
32
+ team_ids: sourceId ? [sourceId] : [],
33
+ source_app_name: sourceAppName,
34
+ ...route.params,
35
+ },
36
+ })
37
+ }
38
+ if (sourceAppName === 'Groups') {
39
+ return navigation.navigate('New', {
40
+ screen: 'ConversationNew',
41
+ params: {
42
+ group_id: sourceId,
43
+ source_app_name: sourceAppName,
44
+ ...route.params,
45
+ },
46
+ })
47
+ }
48
+
49
+ return navigation.navigate('New', {
50
+ screen: 'ConversationSelectRecipients',
51
+ params: {
52
+ ...route.params,
53
+ },
54
+ })
55
+ }
56
+
22
57
  return (
23
58
  <View style={styles.container}>
24
59
  <ConversationsContextProvider args={route.params}>
@@ -27,7 +62,7 @@ export function ConversationsScreen({ route }: ConversationScreenProps) {
27
62
  <ActionButton
28
63
  visible={canCreateConversations}
29
64
  title="New conversation"
30
- onPress={() => navigation.navigate('New')}
65
+ onPress={handleNewConversationNavigation}
31
66
  />
32
67
  </View>
33
68
  )
@@ -68,7 +68,7 @@ export function SendGiphyScreen({ route }: SendGiphyScreenProps) {
68
68
  <NativeImage
69
69
  alt="Powered by Giphy"
70
70
  style={styles.powered_by_giphy}
71
- source={require('../../assets/images/powered_by_giphy.png')}
71
+ source={{ uri: poweredByGiphyImage }}
72
72
  />
73
73
  <View style={styles.control_stack}>
74
74
  <View style={styles.button_group}>
@@ -153,3 +153,32 @@ const useStyles = () => {
153
153
  },
154
154
  })
155
155
  }
156
+
157
+ const poweredByGiphyImage = `data:image/png;base64,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`
@@ -1,7 +1,7 @@
1
1
  import { ResourceObject } from '../../api_primitives'
2
2
 
3
3
  export interface GroupsGroupResource extends ResourceObject {
4
- id: string
4
+ id: number
5
5
  type: 'Group'
6
6
  headerImage: {
7
7
  thumbnail: string
@@ -0,0 +1,13 @@
1
+ export interface GroupsGroupMemberResource {
2
+ type: 'Member'
3
+ id: number
4
+ role?: string
5
+ person: {
6
+ firstName: string
7
+ lastName: string
8
+ avatarUrl: string
9
+ child: boolean
10
+ id: number
11
+ type: 'Person'
12
+ }
13
+ }
@@ -8,17 +8,6 @@ export interface MemberResource {
8
8
  role?: string
9
9
  }
10
10
 
11
- export interface MemberResourceWithPerson extends MemberResource {
12
- person: {
13
- firstName: string
14
- lastName: string
15
- avatarUrl: string
16
- child: boolean
17
- id: string
18
- type: 'Person'
19
- }
20
- }
21
-
22
11
  export interface MemberBadge {
23
12
  title: string
24
13
  }
@@ -18,4 +18,6 @@ export interface MessageResource {
18
18
  // Custom Local Properties we set for rendering
19
19
  renderAuthor?: boolean
20
20
  renderTime?: boolean
21
+ myLatestInConversation?: boolean
22
+ lastInGroup?: boolean
21
23
  }
@@ -1,8 +1,8 @@
1
1
  export type OAuthToken = {
2
- token_type: any
3
- access_token: any
2
+ token_type: string
3
+ access_token: string
4
4
  created_at: number
5
- expires_in: any
5
+ expires_in: number
6
6
  scope: string
7
- refresh_token: any
7
+ refresh_token: string
8
8
  }
@@ -1,6 +1,4 @@
1
1
  import { ApiCollection, ApiError, ApiResource } from '../../types'
2
- import { Session } from '../session'
3
- import { Uri } from '../uri'
4
2
  import {
5
3
  concatRecords,
6
4
  ensureNoQueryParamsInDev,
@@ -22,28 +20,27 @@ type ClientArgs = {
22
20
  version: string
23
21
  defaultHeaders?: Record<string, string>
24
22
  onUnauthorizedResponse?: OnUnauthorizedResponse
25
- session: Session
26
- app: string
23
+ root?: string
27
24
  }
28
25
 
29
26
  export class Client {
30
27
  version: string = ''
31
28
  defaultHeaders: Record<string, string> = {}
32
- uri: Uri
33
29
  onUnauthorizedResponse?: OnUnauthorizedResponse
30
+ root?: string
34
31
 
35
- constructor({ version, defaultHeaders = {}, session, app, onUnauthorizedResponse }: ClientArgs) {
32
+ constructor({ version, defaultHeaders = {}, onUnauthorizedResponse, root }: ClientArgs) {
36
33
  this.version = version
37
- this.uri = new Uri({ session, app })
38
34
  this.defaultHeaders = defaultHeaders
39
35
  this.onUnauthorizedResponse = onUnauthorizedResponse
36
+ this.root = root
40
37
  }
41
38
 
42
39
  async get<T extends ApiCollection | ApiResource>(args: GetRequest): Promise<T> {
43
40
  const { walk, ...data } = args.data
44
41
  const isWalking = Boolean(walk)
45
42
  const headers = { ...this.headers, ...args.headers }
46
- const url = this.uri.appUrl(args.url)
43
+ const url = this.appUrl(args.url)
47
44
 
48
45
  await throwErrorIfQueryParams(url)
49
46
 
@@ -54,7 +51,7 @@ export class Client {
54
51
  data: d = { fields: {} },
55
52
  acc = { data: [], included: [], meta: {}, links: {} },
56
53
  ...options
57
- }: WalkRequest): Promise<ApiCollection | ApiResource> => {
54
+ }: WalkRequest): Promise<T> => {
58
55
  return makeRequest({
59
56
  action: 'GET',
60
57
  data: d,
@@ -84,7 +81,7 @@ export class Client {
84
81
 
85
82
  async patch<T extends ApiCollection | ApiResource>(args: PatchRequest): Promise<T> {
86
83
  const headers = { ...this.headers, ...args.headers }
87
- const url = this.uri.appUrl(args.url)
84
+ const url = this.appUrl(args.url)
88
85
 
89
86
  const requestArgs: MakeRequestArgs = { data: args.data, url, action: 'PATCH', headers }
90
87
 
@@ -95,7 +92,7 @@ export class Client {
95
92
 
96
93
  async post<T extends ApiCollection | ApiResource>(args: PostRequest): Promise<T> {
97
94
  const headers = { ...this.headers, ...args.headers }
98
- const url = this.uri.appUrl(args.url)
95
+ const url = this.appUrl(args.url)
99
96
 
100
97
  const requestArgs: MakeRequestArgs = { ...args, data: args.data, url, action: 'POST', headers }
101
98
 
@@ -106,7 +103,7 @@ export class Client {
106
103
 
107
104
  async delete(args: DeleteRequest) {
108
105
  const headers = { ...this.headers, ...args.headers }
109
- const url = this.uri.appUrl(args.url)
106
+ const url = this.appUrl(args.url)
110
107
 
111
108
  const requestArgs: MakeRequestArgs = { url, action: 'DELETE', headers }
112
109
 
@@ -133,12 +130,15 @@ export class Client {
133
130
  }
134
131
  }
135
132
 
133
+ appUrl(url: string) {
134
+ return `${this.root}${url}`
135
+ }
136
+
136
137
  get headers() {
137
138
  return {
138
139
  Accept: 'application/vnd.api+json',
139
140
  'Content-Type': 'application/json',
140
141
  'X-PCO-API-Version': this.version,
141
- ...this.uri.headers,
142
142
  ...this.defaultHeaders,
143
143
  }
144
144
  }
package/src/utils/date.ts CHANGED
@@ -1,4 +1,4 @@
1
- // @ts-ignore
1
+ // @ts-expect-error
2
2
  import { date as formatDate } from '@planningcenter/datetime-fmt'
3
3
  import moment from 'moment-timezone'
4
4
 
@@ -24,3 +24,13 @@ const formatShorterDate = (date: DateProps) => {
24
24
  // Drop the century from the year
25
25
  return formatDate(date, { style: 'short', year: true }).replace(/20(\d{2})/, '$1')
26
26
  }
27
+
28
+ export function getRelativeDateStatus(date: DateProps) {
29
+ const now = moment()
30
+
31
+ const isToday = now.isSame(date, 'day')
32
+ const isThisWeek = now.isSame(date, 'week')
33
+ const isThisYear = now.isSame(date, 'year')
34
+
35
+ return { isToday, isThisWeek, isThisYear }
36
+ }
@@ -0,0 +1,25 @@
1
+ import { AppName } from '../types/resources/app_name'
2
+ import { SourceType, GraphId } from '../types/resources/group_resource'
3
+
4
+ interface DestructuredChatGroupGraphIdType {
5
+ sourceAppName?: AppName
6
+ sourceType?: SourceType
7
+ sourceId?: number
8
+ }
9
+
10
+ export function destructureChatGroupGraphId(
11
+ chatGroupGraphId?: GraphId
12
+ ): DestructuredChatGroupGraphIdType {
13
+ if (!chatGroupGraphId)
14
+ return { sourceAppName: undefined, sourceType: undefined, sourceId: undefined }
15
+
16
+ const [sourceAppName, sourceType, sourceIdString] = chatGroupGraphId.split('-') as [
17
+ AppName,
18
+ SourceType,
19
+ string,
20
+ ]
21
+
22
+ const sourceIdNumber = Number(sourceIdString)
23
+
24
+ return { sourceAppName, sourceType, sourceId: sourceIdNumber }
25
+ }
@@ -7,3 +7,4 @@ export * from './uri'
7
7
  export * from './cache'
8
8
  export * from './native_adapters'
9
9
  export * from './pluralize'
10
+ export * from './destructure_chat_group_graph_id'