@planningcenter/chat-react-native 4.2.1-qa-staging.5 → 4.3.0-rc.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 (170) hide show
  1. package/build/components/conversation/message_form.d.ts +1 -2
  2. package/build/components/conversation/message_form.d.ts.map +1 -1
  3. package/build/components/conversation/message_form.js +51 -54
  4. package/build/components/conversation/message_form.js.map +1 -1
  5. package/build/components/conversation/message_list.d.ts +2 -3
  6. package/build/components/conversation/message_list.d.ts.map +1 -1
  7. package/build/components/conversation/message_list.js +66 -152
  8. package/build/components/conversation/message_list.js.map +1 -1
  9. package/build/contexts/api_provider.d.ts.map +1 -1
  10. package/build/contexts/api_provider.js +1 -2
  11. package/build/contexts/api_provider.js.map +1 -1
  12. package/build/contexts/conversation_context.d.ts +1 -3
  13. package/build/contexts/conversation_context.d.ts.map +1 -1
  14. package/build/contexts/conversation_context.js +18 -23
  15. package/build/contexts/conversation_context.js.map +1 -1
  16. package/build/hooks/paginator_meta.d.ts +1 -3
  17. package/build/hooks/paginator_meta.d.ts.map +1 -1
  18. package/build/hooks/paginator_meta.js +8 -25
  19. package/build/hooks/paginator_meta.js.map +1 -1
  20. package/build/hooks/use_api.d.ts.map +1 -1
  21. package/build/hooks/use_api.js +8 -5
  22. package/build/hooks/use_api.js.map +1 -1
  23. package/build/hooks/use_conversation_messages.d.ts +2 -9
  24. package/build/hooks/use_conversation_messages.d.ts.map +1 -1
  25. package/build/hooks/use_conversation_messages.js +45 -84
  26. package/build/hooks/use_conversation_messages.js.map +1 -1
  27. package/build/hooks/use_conversation_messages_jolt_events.d.ts +1 -17
  28. package/build/hooks/use_conversation_messages_jolt_events.d.ts.map +1 -1
  29. package/build/hooks/use_conversation_messages_jolt_events.js +80 -89
  30. package/build/hooks/use_conversation_messages_jolt_events.js.map +1 -1
  31. package/build/hooks/use_mark_latest_message_read.d.ts +1 -2
  32. package/build/hooks/use_mark_latest_message_read.d.ts.map +1 -1
  33. package/build/hooks/use_mark_latest_message_read.js +3 -4
  34. package/build/hooks/use_mark_latest_message_read.js.map +1 -1
  35. package/build/hooks/use_message_create_or_update.d.ts.map +1 -1
  36. package/build/hooks/use_message_create_or_update.js +80 -91
  37. package/build/hooks/use_message_create_or_update.js.map +1 -1
  38. package/build/hooks/use_message_reaction_toggle.d.ts.map +1 -1
  39. package/build/hooks/use_message_reaction_toggle.js +40 -45
  40. package/build/hooks/use_message_reaction_toggle.js.map +1 -1
  41. package/build/hooks/use_suspense_api.d.ts.map +1 -1
  42. package/build/hooks/use_suspense_api.js +8 -5
  43. package/build/hooks/use_suspense_api.js.map +1 -1
  44. package/build/screens/conversation_new/components/services_form.js +8 -9
  45. package/build/screens/conversation_new/components/services_form.js.map +1 -1
  46. package/build/screens/conversation_screen.d.ts +0 -1
  47. package/build/screens/conversation_screen.d.ts.map +1 -1
  48. package/build/screens/conversation_screen.js +254 -481
  49. package/build/screens/conversation_screen.js.map +1 -1
  50. package/build/screens/message_actions_screen.d.ts.map +1 -1
  51. package/build/screens/message_actions_screen.js +26 -21
  52. package/build/screens/message_actions_screen.js.map +1 -1
  53. package/build/screens/message_report_screen.d.ts.map +1 -1
  54. package/build/screens/message_report_screen.js +44 -17
  55. package/build/screens/message_report_screen.js.map +1 -1
  56. package/build/screens/reactions_screen.d.ts.map +1 -1
  57. package/build/screens/reactions_screen.js +88 -70
  58. package/build/screens/reactions_screen.js.map +1 -1
  59. package/build/types/api_primitives.d.ts +0 -2
  60. package/build/types/api_primitives.d.ts.map +1 -1
  61. package/build/types/api_primitives.js.map +1 -1
  62. package/build/utils/cache/messages_cache.d.ts +0 -1
  63. package/build/utils/cache/messages_cache.d.ts.map +1 -1
  64. package/build/utils/cache/messages_cache.js +0 -3
  65. package/build/utils/cache/messages_cache.js.map +1 -1
  66. package/build/utils/cache/optimistically_update_message.d.ts +1 -2
  67. package/build/utils/cache/optimistically_update_message.d.ts.map +1 -1
  68. package/build/utils/cache/optimistically_update_message.js +4 -4
  69. package/build/utils/cache/optimistically_update_message.js.map +1 -1
  70. package/build/utils/client/types.d.ts +0 -1
  71. package/build/utils/client/types.d.ts.map +1 -1
  72. package/build/utils/client/types.js.map +1 -1
  73. package/build/utils/generate_placeholder_ulid.d.ts +6 -0
  74. package/build/utils/generate_placeholder_ulid.d.ts.map +1 -1
  75. package/build/utils/generate_placeholder_ulid.js +2 -2
  76. package/build/utils/generate_placeholder_ulid.js.map +1 -1
  77. package/build/utils/request/get_messages.d.ts +6 -18
  78. package/build/utils/request/get_messages.d.ts.map +1 -1
  79. package/build/utils/request/get_messages.js +12 -10
  80. package/build/utils/request/get_messages.js.map +1 -1
  81. package/package.json +3 -3
  82. package/src/__tests__/hooks/paginator_meta.test.ts +2 -73
  83. package/src/components/conversation/__tests__/message_list.test.tsx +0 -42
  84. package/src/components/conversation/message_form.tsx +0 -3
  85. package/src/components/conversation/message_list.tsx +4 -58
  86. package/src/contexts/api_provider.tsx +1 -2
  87. package/src/contexts/conversation_context.tsx +1 -6
  88. package/src/hooks/paginator_meta.ts +5 -29
  89. package/src/hooks/use_api.ts +5 -4
  90. package/src/hooks/use_conversation_messages.ts +11 -52
  91. package/src/hooks/use_conversation_messages_jolt_events.ts +43 -62
  92. package/src/hooks/use_mark_latest_message_read.ts +3 -4
  93. package/src/hooks/use_message_create_or_update.ts +8 -8
  94. package/src/hooks/use_message_reaction_toggle.ts +1 -3
  95. package/src/hooks/use_suspense_api.ts +5 -4
  96. package/src/screens/conversation_new/components/services_form.tsx +5 -5
  97. package/src/screens/conversation_screen.tsx +14 -123
  98. package/src/screens/message_actions_screen.tsx +5 -3
  99. package/src/screens/message_report_screen.tsx +3 -2
  100. package/src/screens/reactions_screen.tsx +4 -2
  101. package/src/types/api_primitives.ts +0 -2
  102. package/src/utils/cache/__tests__/messages_cache.test.ts +1 -14
  103. package/src/utils/cache/messages_cache.ts +0 -3
  104. package/src/utils/cache/optimistically_update_message.ts +5 -2
  105. package/src/utils/client/types.ts +0 -1
  106. package/src/utils/generate_placeholder_ulid.ts +2 -2
  107. package/src/utils/request/get_messages.ts +14 -12
  108. package/build/components/conversation/anchor_not_found_boundary.d.ts +0 -18
  109. package/build/components/conversation/anchor_not_found_boundary.d.ts.map +0 -1
  110. package/build/components/conversation/anchor_not_found_boundary.js +0 -20
  111. package/build/components/conversation/anchor_not_found_boundary.js.map +0 -1
  112. package/build/hooks/use_conversation_message_lookup.d.ts +0 -7
  113. package/build/hooks/use_conversation_message_lookup.d.ts.map +0 -1
  114. package/build/hooks/use_conversation_message_lookup.js +0 -52
  115. package/build/hooks/use_conversation_message_lookup.js.map +0 -1
  116. package/build/hooks/use_fetch_newer_messages.d.ts +0 -9
  117. package/build/hooks/use_fetch_newer_messages.d.ts.map +0 -1
  118. package/build/hooks/use_fetch_newer_messages.js +0 -69
  119. package/build/hooks/use_fetch_newer_messages.js.map +0 -1
  120. package/build/hooks/use_fetch_newer_on_foreground.d.ts +0 -8
  121. package/build/hooks/use_fetch_newer_on_foreground.d.ts.map +0 -1
  122. package/build/hooks/use_fetch_newer_on_foreground.js +0 -42
  123. package/build/hooks/use_fetch_newer_on_foreground.js.map +0 -1
  124. package/build/hooks/use_held_back_messages.d.ts +0 -11
  125. package/build/hooks/use_held_back_messages.d.ts.map +0 -1
  126. package/build/hooks/use_held_back_messages.js +0 -24
  127. package/build/hooks/use_held_back_messages.js.map +0 -1
  128. package/build/utils/cache/find_message_in_caches.d.ts +0 -4
  129. package/build/utils/cache/find_message_in_caches.d.ts.map +0 -1
  130. package/build/utils/cache/find_message_in_caches.js +0 -16
  131. package/build/utils/cache/find_message_in_caches.js.map +0 -1
  132. package/build/utils/cache/invalidate_refetchable_queries.d.ts +0 -3
  133. package/build/utils/cache/invalidate_refetchable_queries.d.ts.map +0 -1
  134. package/build/utils/cache/invalidate_refetchable_queries.js +0 -8
  135. package/build/utils/cache/invalidate_refetchable_queries.js.map +0 -1
  136. package/build/utils/cache/prepend_newer_page.d.ts +0 -7
  137. package/build/utils/cache/prepend_newer_page.d.ts.map +0 -1
  138. package/build/utils/cache/prepend_newer_page.js +0 -15
  139. package/build/utils/cache/prepend_newer_page.js.map +0 -1
  140. package/build/utils/gated_message_cache.d.ts +0 -7
  141. package/build/utils/gated_message_cache.d.ts.map +0 -1
  142. package/build/utils/gated_message_cache.js +0 -13
  143. package/build/utils/gated_message_cache.js.map +0 -1
  144. package/build/utils/ulid.d.ts +0 -3
  145. package/build/utils/ulid.d.ts.map +0 -1
  146. package/build/utils/ulid.js +0 -7
  147. package/build/utils/ulid.js.map +0 -1
  148. package/src/__tests__/hooks/use_conversation_messages.test.ts +0 -22
  149. package/src/__tests__/hooks/use_conversation_messages_jolt_events.test.ts +0 -33
  150. package/src/__tests__/screens/conversation_new/components/services_form.test.tsx +0 -91
  151. package/src/__tests__/utils/gated_message_cache.test.ts +0 -26
  152. package/src/__tests__/utils/request/get_messages.test.ts +0 -24
  153. package/src/__tests__/utils/ulid.test.ts +0 -15
  154. package/src/components/conversation/__tests__/anchor_not_found_boundary.test.tsx +0 -51
  155. package/src/components/conversation/anchor_not_found_boundary.tsx +0 -21
  156. package/src/hooks/__tests__/use_fetch_newer_messages.test.tsx +0 -95
  157. package/src/hooks/__tests__/use_held_back_messages.test.tsx +0 -60
  158. package/src/hooks/__tests__/use_message_reaction_toggle.test.tsx +0 -73
  159. package/src/hooks/use_conversation_message_lookup.ts +0 -29
  160. package/src/hooks/use_fetch_newer_messages.ts +0 -52
  161. package/src/hooks/use_fetch_newer_on_foreground.ts +0 -25
  162. package/src/hooks/use_held_back_messages.ts +0 -33
  163. package/src/utils/cache/__tests__/find_message_in_caches.test.ts +0 -37
  164. package/src/utils/cache/__tests__/invalidate_refetchable_queries.test.ts +0 -23
  165. package/src/utils/cache/__tests__/prepend_newer_page.test.ts +0 -34
  166. package/src/utils/cache/find_message_in_caches.ts +0 -20
  167. package/src/utils/cache/invalidate_refetchable_queries.ts +0 -9
  168. package/src/utils/cache/prepend_newer_page.ts +0 -19
  169. package/src/utils/gated_message_cache.ts +0 -19
  170. package/src/utils/ulid.ts +0 -11
@@ -1,25 +0,0 @@
1
- import { useEffect, useRef } from 'react'
2
- import { useAppState } from './use_app_state'
3
-
4
- type Options = {
5
- fetchNewer: (newestMessageId: string) => Promise<void>
6
- newestMessageId?: string
7
- enabled: boolean
8
- }
9
-
10
- export const useFetchNewerOnForeground = ({ fetchNewer, newestMessageId, enabled }: Options) => {
11
- const appState = useAppState()
12
- const wasInBackground = useRef(false)
13
-
14
- useEffect(() => {
15
- if (appState !== 'active') {
16
- wasInBackground.current = true
17
- return
18
- }
19
- const returnedToForeground = wasInBackground.current
20
- wasInBackground.current = false
21
- if (!returnedToForeground || !enabled || !newestMessageId) return
22
-
23
- fetchNewer(newestMessageId).catch(() => {})
24
- }, [appState, enabled, fetchNewer, newestMessageId])
25
- }
@@ -1,33 +0,0 @@
1
- import { useCallback, useEffect, useRef } from 'react'
2
-
3
- type Options = {
4
- fetchNewer: (newestMessageId: string) => Promise<void>
5
- newestMessageId?: string
6
- readingHistory: boolean
7
- caughtUp: boolean
8
- }
9
-
10
- export const useHeldBackMessages = ({
11
- fetchNewer,
12
- newestMessageId,
13
- readingHistory,
14
- caughtUp,
15
- }: Options) => {
16
- const heldBackSince = useRef<string | null>(null)
17
-
18
- const onSkippedNewMessage = useCallback(() => {
19
- heldBackSince.current ??= newestMessageId ?? null
20
- }, [newestMessageId])
21
-
22
- useEffect(() => {
23
- const since = heldBackSince.current
24
- if (readingHistory || !caughtUp || !since) return
25
-
26
- heldBackSince.current = null
27
- fetchNewer(since).catch(() => {
28
- heldBackSince.current ??= since
29
- })
30
- }, [caughtUp, fetchNewer, readingHistory])
31
-
32
- return { onSkippedNewMessage }
33
- }
@@ -1,37 +0,0 @@
1
- import { QueryClient } from '@tanstack/react-query'
2
- import { getMessagesQueryKey } from '../../request/get_messages'
3
- import { findMessageInCaches } from '../find_message_in_caches'
4
-
5
- const page = (ids: string[]) => ({
6
- data: ids.map(id => ({ id, type: 'Message' })),
7
- links: {},
8
- meta: { count: ids.length, totalCount: ids.length },
9
- })
10
-
11
- const seed = (queryClient: QueryClient, key: unknown[], ids: string[]) =>
12
- queryClient.setQueryData(key, { pages: [page(ids)], pageParams: [{}] })
13
-
14
- describe('findMessageInCaches', () => {
15
- const queryClient = new QueryClient()
16
-
17
- beforeEach(() => {
18
- queryClient.clear()
19
- seed(queryClient, getMessagesQueryKey({ conversation_id: 1 }), ['01C', '01B'])
20
- seed(queryClient, getMessagesQueryKey({ conversation_id: 1, anchor: '01A' }), ['01A', '00Z'])
21
- seed(queryClient, getMessagesQueryKey({ conversation_id: 1, reply_root_id: '01B' }), ['01R'])
22
- seed(queryClient, getMessagesQueryKey({ conversation_id: 2 }), ['02A'])
23
- })
24
-
25
- it('finds a message in the live cache', () => {
26
- expect(findMessageInCaches(queryClient, 1, '01B')?.id).toBe('01B')
27
- })
28
-
29
- it('finds a message that only the anchored cache holds', () => {
30
- expect(findMessageInCaches(queryClient, 1, '00Z')?.id).toBe('00Z')
31
- })
32
-
33
- it('ignores reply threads and other conversations', () => {
34
- expect(findMessageInCaches(queryClient, 1, '01R')).toBeUndefined()
35
- expect(findMessageInCaches(queryClient, 1, '02A')).toBeUndefined()
36
- })
37
- })
@@ -1,23 +0,0 @@
1
- import { QueryClient } from '@tanstack/react-query'
2
- import { getMessagesQueryKey } from '../../request/get_messages'
3
- import { invalidateRefetchableQueries } from '../invalidate_refetchable_queries'
4
-
5
- describe('invalidateRefetchableQueries', () => {
6
- const queryClient = new QueryClient()
7
- const live = getMessagesQueryKey({ conversation_id: 1 })
8
- const anchored = getMessagesQueryKey({ conversation_id: 1, anchor: '01A' })
9
- const other = ['/me/conversations']
10
-
11
- beforeEach(() => {
12
- queryClient.clear()
13
- for (const key of [live, anchored, other]) queryClient.setQueryData(key, { pages: [], pageParams: [] })
14
- })
15
-
16
- it('invalidates everything except anchored message windows', async () => {
17
- await invalidateRefetchableQueries(queryClient)
18
-
19
- expect(queryClient.getQueryState(live)?.isInvalidated).toBe(true)
20
- expect(queryClient.getQueryState(other)?.isInvalidated).toBe(true)
21
- expect(queryClient.getQueryState(anchored)?.isInvalidated).toBe(false)
22
- })
23
- })
@@ -1,34 +0,0 @@
1
- import { prependNewerPage } from '../prepend_newer_page'
2
-
3
- const page = (ids: string[], next?: { idGt: string }) => ({
4
- data: ids.map(id => ({ id, type: 'Message' })),
5
- links: {},
6
- meta: { count: ids.length, totalCount: ids.length, next },
7
- })
8
-
9
- describe('prependNewerPage', () => {
10
- const cached = { pages: [page(['01C', '01B']), page(['01A'])], pageParams: [{}, { offset: 1 }] }
11
-
12
- it('merges the new rows into the first page and leaves the page params alone', () => {
13
- const result = prependNewerPage(cached, [page(['01C', '01D', '01E'])])
14
-
15
- expect(result?.pages).toHaveLength(2)
16
- expect(result?.pages[0].data.map(m => m.id)).toEqual(['01D', '01E', '01C', '01B'])
17
- expect(result?.pageParams).toEqual(cached.pageParams)
18
- })
19
-
20
- it('merges every fetched batch, newest last', () => {
21
- const result = prependNewerPage(cached, [page(['01D', '01E']), page(['01F'])])
22
-
23
- expect(result?.pages[0].data.map(m => m.id)).toEqual(['01D', '01E', '01F', '01C', '01B'])
24
- })
25
-
26
- it('returns the same data when nothing new came back', () => {
27
- expect(prependNewerPage(cached, [page(['01C'])])).toBe(cached)
28
- expect(prependNewerPage(cached, [])).toBe(cached)
29
- })
30
-
31
- it('does nothing without cached data', () => {
32
- expect(prependNewerPage(undefined, [page(['01D'])])).toBeUndefined()
33
- })
34
- })
@@ -1,20 +0,0 @@
1
- import { InfiniteData, QueryClient } from '@tanstack/react-query'
2
- import { ApiCollection, MessageResource } from '../../types'
3
- import { getMessagesRequestArgs } from '../request/get_messages'
4
-
5
- type QueryData = InfiniteData<ApiCollection<MessageResource>>
6
-
7
- export const findMessageInCaches = (
8
- queryClient: QueryClient,
9
- conversation_id: number,
10
- message_id: string
11
- ): MessageResource | undefined => {
12
- const { url } = getMessagesRequestArgs({ conversation_id })
13
-
14
- for (const [, data] of queryClient.getQueriesData<QueryData>({ queryKey: [url] })) {
15
- const found = data?.pages.flatMap(page => page.data).find(message => message.id === message_id)
16
- if (found) return found
17
- }
18
-
19
- return undefined
20
- }
@@ -1,9 +0,0 @@
1
- import { Query, QueryClient } from '@tanstack/react-query'
2
-
3
- const isAnchoredMessagesWindow = (query: Query) => {
4
- const [, params] = query.queryKey as [unknown, { where?: { id_around?: string } } | undefined]
5
- return !!params?.where?.id_around
6
- }
7
-
8
- export const invalidateRefetchableQueries = (queryClient: QueryClient) =>
9
- queryClient.invalidateQueries({ predicate: query => !isAnchoredMessagesWindow(query) })
@@ -1,19 +0,0 @@
1
- import { InfiniteData } from '@tanstack/react-query'
2
- import { ApiCollection, ResourceObject } from '../../types'
3
- import { RequestData } from '../client'
4
-
5
- type PagesData<T extends ResourceObject> = InfiniteData<ApiCollection<T>, Partial<RequestData>>
6
-
7
- export function prependNewerPage<T extends ResourceObject>(
8
- data: PagesData<T> | undefined,
9
- pages: ApiCollection<T>[]
10
- ): PagesData<T> | undefined {
11
- if (!data || data.pages.length === 0) return data
12
-
13
- const knownIds = new Set(data.pages.flatMap(page => page.data.map(record => record.id)))
14
- const fresh = pages.flatMap(page => page.data).filter(record => !knownIds.has(record.id))
15
- if (fresh.length === 0) return data
16
-
17
- const [first, ...rest] = data.pages
18
- return { ...data, pages: [{ ...first, data: [...fresh, ...first.data] }, ...rest] }
19
- }
@@ -1,19 +0,0 @@
1
- import type { MessagesCache } from '../hooks/use_conversation_messages_jolt_events'
2
-
3
- export const gatedMessageCache = ({
4
- queryKey,
5
- acceptNewMessages,
6
- onSkippedNewMessage,
7
- }: {
8
- queryKey: unknown[]
9
- acceptNewMessages: boolean
10
- onSkippedNewMessage?: () => void
11
- }): MessagesCache => ({
12
- queryKey,
13
- canUpdate: event => {
14
- if (event !== 'message.created' || acceptNewMessages) return true
15
-
16
- onSkippedNewMessage?.()
17
- return false
18
- },
19
- })
package/src/utils/ulid.ts DELETED
@@ -1,11 +0,0 @@
1
- export const ULID_CHARS = '0123456789ABCDEFGHJKMNPQRSTVWXYZ' // Crockford's Base32
2
-
3
- const TIME_LENGTH = 10
4
-
5
- export function decodeUlidTime(ulid: string): number {
6
- return ulid
7
- .slice(0, TIME_LENGTH)
8
- .toUpperCase()
9
- .split('')
10
- .reduce((time, char) => time * 32 + ULID_CHARS.indexOf(char), 0)
11
- }