@planningcenter/chat-react-native 3.37.1-qa-736.0 → 3.37.2
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.
- package/build/components/conversation/jump_to_bottom_button.d.ts +1 -2
- package/build/components/conversation/jump_to_bottom_button.d.ts.map +1 -1
- package/build/components/conversation/jump_to_bottom_button.js +7 -39
- package/build/components/conversation/jump_to_bottom_button.js.map +1 -1
- package/build/components/conversation/message_form.d.ts.map +1 -1
- package/build/components/conversation/message_form.js +7 -19
- package/build/components/conversation/message_form.js.map +1 -1
- package/build/components/conversation/reply_shadow_message.d.ts +2 -1
- package/build/components/conversation/reply_shadow_message.d.ts.map +1 -1
- package/build/components/conversation/reply_shadow_message.js.map +1 -1
- package/build/components/conversations/conversations.d.ts.map +1 -1
- package/build/components/conversations/conversations.js +16 -6
- package/build/components/conversations/conversations.js.map +1 -1
- package/build/contexts/conversation_context.d.ts +1 -8
- package/build/contexts/conversation_context.d.ts.map +1 -1
- package/build/contexts/conversation_context.js +3 -21
- package/build/contexts/conversation_context.js.map +1 -1
- package/build/hooks/use_attachment_uploader.d.ts.map +1 -1
- package/build/hooks/use_attachment_uploader.js +0 -9
- package/build/hooks/use_attachment_uploader.js.map +1 -1
- package/build/hooks/use_conversation_messages.d.ts +6 -15
- package/build/hooks/use_conversation_messages.d.ts.map +1 -1
- package/build/hooks/use_conversation_messages.js +9 -62
- package/build/hooks/use_conversation_messages.js.map +1 -1
- package/build/hooks/use_conversation_messages_jolt_events.d.ts.map +1 -1
- package/build/hooks/use_conversation_messages_jolt_events.js +4 -4
- package/build/hooks/use_conversation_messages_jolt_events.js.map +1 -1
- package/build/hooks/use_conversations_actions.d.ts +0 -5
- package/build/hooks/use_conversations_actions.d.ts.map +1 -1
- package/build/hooks/use_conversations_actions.js +0 -12
- package/build/hooks/use_conversations_actions.js.map +1 -1
- package/build/hooks/use_features.d.ts +0 -2
- package/build/hooks/use_features.d.ts.map +1 -1
- package/build/hooks/use_features.js +0 -2
- package/build/hooks/use_features.js.map +1 -1
- package/build/hooks/use_mark_latest_message_read.d.ts +1 -1
- package/build/hooks/use_mark_latest_message_read.d.ts.map +1 -1
- package/build/hooks/use_mark_latest_message_read.js +1 -17
- package/build/hooks/use_mark_latest_message_read.js.map +1 -1
- package/build/hooks/use_suspense_api.d.ts +0 -1
- package/build/hooks/use_suspense_api.d.ts.map +1 -1
- package/build/hooks/use_suspense_api.js +1 -1
- package/build/hooks/use_suspense_api.js.map +1 -1
- package/build/hooks/use_upload_client.d.ts +0 -4
- package/build/hooks/use_upload_client.d.ts.map +1 -1
- package/build/hooks/use_upload_client.js +1 -13
- package/build/hooks/use_upload_client.js.map +1 -1
- package/build/jest.js +1 -1
- package/build/jest.js.map +1 -1
- package/build/screens/age_check/age_check_underage_screen.js +1 -1
- package/build/screens/age_check/age_check_underage_screen.js.map +1 -1
- package/build/screens/avatar_picker/emoji_tab.d.ts.map +1 -1
- package/build/screens/avatar_picker/emoji_tab.js +6 -2
- package/build/screens/avatar_picker/emoji_tab.js.map +1 -1
- package/build/screens/conversation_screen.d.ts +0 -1
- package/build/screens/conversation_screen.d.ts.map +1 -1
- package/build/screens/conversation_screen.js +48 -95
- package/build/screens/conversation_screen.js.map +1 -1
- package/build/types/jolt_events/index.d.ts +1 -3
- package/build/types/jolt_events/index.d.ts.map +1 -1
- package/build/types/jolt_events/index.js.map +1 -1
- package/build/utils/cache/messages_cache.d.ts +0 -1
- package/build/utils/cache/messages_cache.d.ts.map +1 -1
- package/build/utils/cache/messages_cache.js +0 -4
- package/build/utils/cache/messages_cache.js.map +1 -1
- package/build/utils/group_messages.d.ts +2 -9
- package/build/utils/group_messages.d.ts.map +1 -1
- package/build/utils/group_messages.js +1 -20
- package/build/utils/group_messages.js.map +1 -1
- package/package.json +4 -4
- package/src/__tests__/hooks/use_attachment_uploader.test.tsx +0 -36
- package/src/__tests__/jest.ts +1 -1
- package/src/components/conversation/jump_to_bottom_button.tsx +8 -57
- package/src/components/conversation/message_form.tsx +7 -21
- package/src/components/conversation/reply_shadow_message.tsx +1 -1
- package/src/components/conversations/conversations.tsx +16 -9
- package/src/contexts/conversation_context.tsx +2 -30
- package/src/hooks/use_attachment_uploader.ts +1 -14
- package/src/hooks/use_conversation_messages.ts +20 -120
- package/src/hooks/use_conversation_messages_jolt_events.ts +3 -4
- package/src/hooks/use_conversations_actions.ts +0 -15
- package/src/hooks/use_features.ts +0 -2
- package/src/hooks/use_mark_latest_message_read.ts +2 -16
- package/src/hooks/use_suspense_api.ts +1 -1
- package/src/hooks/use_upload_client.ts +1 -19
- package/src/jest.ts +1 -1
- package/src/screens/age_check/age_check_underage_screen.tsx +1 -1
- package/src/screens/avatar_picker/emoji_tab.tsx +6 -2
- package/src/screens/conversation_screen.tsx +76 -184
- package/src/types/jolt_events/index.ts +0 -3
- package/src/utils/__tests__/group_messages.test.ts +0 -71
- package/src/utils/cache/messages_cache.ts +0 -5
- package/src/utils/group_messages.ts +2 -42
- package/build/components/conversation/message_list.d.ts +0 -10
- package/build/components/conversation/message_list.d.ts.map +0 -1
- package/build/components/conversation/message_list.js +0 -13
- package/build/components/conversation/message_list.js.map +0 -1
- package/build/components/conversation/unread_divider.d.ts +0 -6
- package/build/components/conversation/unread_divider.d.ts.map +0 -1
- package/build/components/conversation/unread_divider.js +0 -59
- package/build/components/conversation/unread_divider.js.map +0 -1
- package/build/components/conversations/conversations_blank_state.d.ts +0 -8
- package/build/components/conversations/conversations_blank_state.d.ts.map +0 -1
- package/build/components/conversations/conversations_blank_state.js +0 -25
- package/build/components/conversations/conversations_blank_state.js.map +0 -1
- package/build/hooks/use_flat_list_viewability.d.ts +0 -20
- package/build/hooks/use_flat_list_viewability.d.ts.map +0 -1
- package/build/hooks/use_flat_list_viewability.js +0 -30
- package/build/hooks/use_flat_list_viewability.js.map +0 -1
- package/build/hooks/use_jump_to_bottom_action.d.ts +0 -9
- package/build/hooks/use_jump_to_bottom_action.d.ts.map +0 -1
- package/build/hooks/use_jump_to_bottom_action.js +0 -62
- package/build/hooks/use_jump_to_bottom_action.js.map +0 -1
- package/build/hooks/use_jump_to_unread_anchor.d.ts +0 -20
- package/build/hooks/use_jump_to_unread_anchor.d.ts.map +0 -1
- package/build/hooks/use_jump_to_unread_anchor.js +0 -53
- package/build/hooks/use_jump_to_unread_anchor.js.map +0 -1
- package/build/hooks/use_jump_to_unread_gates.d.ts +0 -5
- package/build/hooks/use_jump_to_unread_gates.d.ts.map +0 -1
- package/build/hooks/use_jump_to_unread_gates.js +0 -10
- package/build/hooks/use_jump_to_unread_gates.js.map +0 -1
- package/build/hooks/use_scroll_tracking.d.ts +0 -13
- package/build/hooks/use_scroll_tracking.d.ts.map +0 -1
- package/build/hooks/use_scroll_tracking.js +0 -45
- package/build/hooks/use_scroll_tracking.js.map +0 -1
- package/build/hooks/use_track_highest_seen_message.d.ts +0 -4
- package/build/hooks/use_track_highest_seen_message.d.ts.map +0 -1
- package/build/hooks/use_track_highest_seen_message.js +0 -35
- package/build/hooks/use_track_highest_seen_message.js.map +0 -1
- package/build/types/jolt_events/attachment_events.d.ts +0 -14
- package/build/types/jolt_events/attachment_events.d.ts.map +0 -1
- package/build/types/jolt_events/attachment_events.js +0 -2
- package/build/types/jolt_events/attachment_events.js.map +0 -1
- package/build/utils/conversation_messages.d.ts +0 -10
- package/build/utils/conversation_messages.d.ts.map +0 -1
- package/build/utils/conversation_messages.js +0 -22
- package/build/utils/conversation_messages.js.map +0 -1
- package/build/utils/highest_seen_tracker.d.ts +0 -12
- package/build/utils/highest_seen_tracker.d.ts.map +0 -1
- package/build/utils/highest_seen_tracker.js +0 -37
- package/build/utils/highest_seen_tracker.js.map +0 -1
- package/build/utils/message_viewability.d.ts +0 -24
- package/build/utils/message_viewability.d.ts.map +0 -1
- package/build/utils/message_viewability.js +0 -29
- package/build/utils/message_viewability.js.map +0 -1
- package/build/utils/unread_divider_helpers.d.ts +0 -18
- package/build/utils/unread_divider_helpers.d.ts.map +0 -1
- package/build/utils/unread_divider_helpers.js +0 -13
- package/build/utils/unread_divider_helpers.js.map +0 -1
- package/src/__tests__/hooks/use_conversation_messages.test.tsx +0 -109
- package/src/__tests__/hooks/use_mark_latest_message_read.test.tsx +0 -154
- package/src/__tests__/utils/cache/messages_cache.test.ts +0 -54
- package/src/components/conversation/__tests__/message_list.test.tsx +0 -14
- package/src/components/conversation/message_list.tsx +0 -42
- package/src/components/conversation/unread_divider.tsx +0 -90
- package/src/components/conversations/conversations_blank_state.tsx +0 -42
- package/src/hooks/use_flat_list_viewability.ts +0 -50
- package/src/hooks/use_jump_to_bottom_action.ts +0 -75
- package/src/hooks/use_jump_to_unread_anchor.ts +0 -68
- package/src/hooks/use_jump_to_unread_gates.ts +0 -10
- package/src/hooks/use_scroll_tracking.ts +0 -64
- package/src/hooks/use_track_highest_seen_message.ts +0 -43
- package/src/types/jolt_events/attachment_events.ts +0 -14
- package/src/utils/__tests__/conversation_messages.test.ts +0 -105
- package/src/utils/__tests__/highest_seen_tracker.test.ts +0 -82
- package/src/utils/__tests__/message_viewability.test.ts +0 -168
- package/src/utils/__tests__/unread_divider_helpers.test.ts +0 -85
- package/src/utils/conversation_messages.ts +0 -37
- package/src/utils/highest_seen_tracker.ts +0 -42
- package/src/utils/message_viewability.ts +0 -49
- package/src/utils/unread_divider_helpers.ts +0 -25
|
@@ -1,85 +0,0 @@
|
|
|
1
|
-
import { dividerExitedTowardNewer } from '../unread_divider_helpers'
|
|
2
|
-
|
|
3
|
-
const dividerKey = 'unread-divider'
|
|
4
|
-
const initialMessageId = '050'
|
|
5
|
-
const msg = (id: string) => ({ item: { id, type: 'Message' } })
|
|
6
|
-
|
|
7
|
-
describe('dividerExitedTowardNewer', () => {
|
|
8
|
-
it('returns false while the divider is still viewable', () => {
|
|
9
|
-
const result = dividerExitedTowardNewer({
|
|
10
|
-
changed: [{ key: dividerKey, isViewable: true }],
|
|
11
|
-
viewableItems: [
|
|
12
|
-
msg('049'),
|
|
13
|
-
{ item: { id: dividerKey, type: 'UnreadDivider' } },
|
|
14
|
-
msg('050'),
|
|
15
|
-
msg('051'),
|
|
16
|
-
],
|
|
17
|
-
dividerKey,
|
|
18
|
-
initialMessageId,
|
|
19
|
-
})
|
|
20
|
-
expect(result).toBe(false)
|
|
21
|
-
})
|
|
22
|
-
|
|
23
|
-
it('returns true when divider exits and only newer messages are visible (scrolled toward newer)', () => {
|
|
24
|
-
const result = dividerExitedTowardNewer({
|
|
25
|
-
changed: [{ key: dividerKey, isViewable: false }],
|
|
26
|
-
viewableItems: [msg('055'), msg('056'), msg('057')],
|
|
27
|
-
dividerKey,
|
|
28
|
-
initialMessageId,
|
|
29
|
-
})
|
|
30
|
-
expect(result).toBe(true)
|
|
31
|
-
})
|
|
32
|
-
|
|
33
|
-
it('returns false when divider exits and only older messages are visible (scrolled toward older)', () => {
|
|
34
|
-
const result = dividerExitedTowardNewer({
|
|
35
|
-
changed: [{ key: dividerKey, isViewable: false }],
|
|
36
|
-
viewableItems: [msg('040'), msg('045'), msg('048')],
|
|
37
|
-
dividerKey,
|
|
38
|
-
initialMessageId,
|
|
39
|
-
})
|
|
40
|
-
expect(result).toBe(false)
|
|
41
|
-
})
|
|
42
|
-
|
|
43
|
-
it('returns false when divider exits but the visible window straddles the boundary', () => {
|
|
44
|
-
const result = dividerExitedTowardNewer({
|
|
45
|
-
changed: [{ key: dividerKey, isViewable: false }],
|
|
46
|
-
viewableItems: [msg('048'), msg('049'), msg('055')],
|
|
47
|
-
dividerKey,
|
|
48
|
-
initialMessageId,
|
|
49
|
-
})
|
|
50
|
-
expect(result).toBe(false)
|
|
51
|
-
})
|
|
52
|
-
|
|
53
|
-
it('returns false when the divider entry is not in the changed set', () => {
|
|
54
|
-
const result = dividerExitedTowardNewer({
|
|
55
|
-
changed: [{ key: '055', isViewable: true }],
|
|
56
|
-
viewableItems: [msg('055'), msg('056')],
|
|
57
|
-
dividerKey,
|
|
58
|
-
initialMessageId,
|
|
59
|
-
})
|
|
60
|
-
expect(result).toBe(false)
|
|
61
|
-
})
|
|
62
|
-
|
|
63
|
-
it('returns false when no message items are visible (only the divider was)', () => {
|
|
64
|
-
const result = dividerExitedTowardNewer({
|
|
65
|
-
changed: [{ key: dividerKey, isViewable: false }],
|
|
66
|
-
viewableItems: [],
|
|
67
|
-
dividerKey,
|
|
68
|
-
initialMessageId,
|
|
69
|
-
})
|
|
70
|
-
expect(result).toBe(false)
|
|
71
|
-
})
|
|
72
|
-
|
|
73
|
-
it('ignores non-Message items (date separators, reply shadows) when deciding direction', () => {
|
|
74
|
-
const result = dividerExitedTowardNewer({
|
|
75
|
-
changed: [{ key: dividerKey, isViewable: false }],
|
|
76
|
-
viewableItems: [
|
|
77
|
-
{ item: { id: 'day-divider-200', type: 'DateSeparator' } },
|
|
78
|
-
{ item: { id: '055-rootA', type: 'ReplyShadowMessage' } },
|
|
79
|
-
],
|
|
80
|
-
dividerKey,
|
|
81
|
-
initialMessageId,
|
|
82
|
-
})
|
|
83
|
-
expect(result).toBe(false)
|
|
84
|
-
})
|
|
85
|
-
})
|
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
import { ApiCollection, MessageResource } from '../types'
|
|
2
|
-
import { RequestData } from './client'
|
|
3
|
-
|
|
4
|
-
export type MessagesPageParam = Partial<RequestData> & {
|
|
5
|
-
order?: 'asc' | 'desc'
|
|
6
|
-
}
|
|
7
|
-
|
|
8
|
-
export const anchoredSeedPageParams = (anchor: string): MessagesPageParam[] => [
|
|
9
|
-
{ where: { id_gte: anchor }, order: 'asc' },
|
|
10
|
-
{ where: { id_lt: anchor }, order: 'desc' },
|
|
11
|
-
]
|
|
12
|
-
|
|
13
|
-
export const olderPageParam = (
|
|
14
|
-
page: ApiCollection<MessageResource>
|
|
15
|
-
): MessagesPageParam | undefined => {
|
|
16
|
-
const idLt = page.meta?.next?.idLt
|
|
17
|
-
if (!idLt) return undefined
|
|
18
|
-
return { where: { id_lt: idLt }, order: 'desc' }
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
export const newerPageParam = (
|
|
22
|
-
page: ApiCollection<MessageResource>
|
|
23
|
-
): MessagesPageParam | undefined => {
|
|
24
|
-
const idGt = page.meta?.next?.idGt
|
|
25
|
-
if (!idGt) return undefined
|
|
26
|
-
return { where: { id_gt: idGt }, order: 'asc' }
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
export const sortAndFilterMessages = (pages: ApiCollection<MessageResource>[]): MessageResource[] =>
|
|
30
|
-
pages
|
|
31
|
-
.flatMap(page => page.data)
|
|
32
|
-
.filter(
|
|
33
|
-
message =>
|
|
34
|
-
(!message.deletedAt || message.replyRootId) &&
|
|
35
|
-
(message.attachments?.length || message.text?.length)
|
|
36
|
-
)
|
|
37
|
-
.sort((a, b) => -a.id.localeCompare(b.id))
|
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
export const FLUSH_DELAY_MS = 2000
|
|
2
|
-
|
|
3
|
-
type SendFn = (args: { conversationId: number; sortKey: string }) => void
|
|
4
|
-
|
|
5
|
-
export function makeHighestSeenTracker(
|
|
6
|
-
conversationId: number,
|
|
7
|
-
send: SendFn,
|
|
8
|
-
flushDelayMs: number = FLUSH_DELAY_MS
|
|
9
|
-
) {
|
|
10
|
-
let highest: string | null = null
|
|
11
|
-
let lastSent: string | null = null
|
|
12
|
-
let timer: ReturnType<typeof setTimeout> | null = null
|
|
13
|
-
|
|
14
|
-
const fire = () => {
|
|
15
|
-
timer = null
|
|
16
|
-
if (!highest || highest === lastSent) return
|
|
17
|
-
lastSent = highest
|
|
18
|
-
send({ conversationId, sortKey: highest })
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
return {
|
|
22
|
-
onSeen(sortKey: string) {
|
|
23
|
-
if (highest && sortKey.localeCompare(highest) <= 0) return
|
|
24
|
-
highest = sortKey
|
|
25
|
-
if (timer) clearTimeout(timer)
|
|
26
|
-
timer = setTimeout(fire, flushDelayMs)
|
|
27
|
-
},
|
|
28
|
-
flushNow() {
|
|
29
|
-
if (timer) {
|
|
30
|
-
clearTimeout(timer)
|
|
31
|
-
timer = null
|
|
32
|
-
}
|
|
33
|
-
fire()
|
|
34
|
-
},
|
|
35
|
-
cancel() {
|
|
36
|
-
if (timer) {
|
|
37
|
-
clearTimeout(timer)
|
|
38
|
-
timer = null
|
|
39
|
-
}
|
|
40
|
-
},
|
|
41
|
-
}
|
|
42
|
-
}
|
|
@@ -1,49 +0,0 @@
|
|
|
1
|
-
import { dividerExitedTowardNewer } from './unread_divider_helpers'
|
|
2
|
-
|
|
3
|
-
export interface ViewableEntry<Item> {
|
|
4
|
-
key: string
|
|
5
|
-
isViewable: boolean
|
|
6
|
-
item: Item
|
|
7
|
-
}
|
|
8
|
-
|
|
9
|
-
export interface ViewabilityEvent<Item> {
|
|
10
|
-
viewableItems: ViewableEntry<Item>[]
|
|
11
|
-
changed: ViewableEntry<Item>[]
|
|
12
|
-
userHasScrolled: boolean
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
export type ViewabilityObserver<Item> = (event: ViewabilityEvent<Item>) => void
|
|
16
|
-
|
|
17
|
-
export function reportViewableMessages<Item extends { id?: string; type?: string }>(
|
|
18
|
-
onMessageSeen: (id: string) => void
|
|
19
|
-
): ViewabilityObserver<Item> {
|
|
20
|
-
return ({ viewableItems, userHasScrolled }) => {
|
|
21
|
-
if (!userHasScrolled) return
|
|
22
|
-
for (const entry of viewableItems) {
|
|
23
|
-
if (entry.item?.type !== 'Message') continue
|
|
24
|
-
const id = entry.item?.id
|
|
25
|
-
if (typeof id === 'string') onMessageSeen(id)
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
export function detectDividerExitTowardNewer<Item extends { id?: string; type?: string }>({
|
|
31
|
-
dividerKey,
|
|
32
|
-
initialMessageId,
|
|
33
|
-
onExited,
|
|
34
|
-
}: {
|
|
35
|
-
dividerKey: string
|
|
36
|
-
initialMessageId: string | null
|
|
37
|
-
onExited: () => void
|
|
38
|
-
}): ViewabilityObserver<Item> {
|
|
39
|
-
return ({ viewableItems, changed, userHasScrolled }) => {
|
|
40
|
-
if (!userHasScrolled || !initialMessageId) return
|
|
41
|
-
const exited = dividerExitedTowardNewer({
|
|
42
|
-
changed,
|
|
43
|
-
viewableItems,
|
|
44
|
-
dividerKey,
|
|
45
|
-
initialMessageId,
|
|
46
|
-
})
|
|
47
|
-
if (exited) onExited()
|
|
48
|
-
}
|
|
49
|
-
}
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
type ViewableChangeEntry = { key: string; isViewable: boolean }
|
|
2
|
-
type ViewableItem = { item: { id?: string; type?: string } }
|
|
3
|
-
|
|
4
|
-
export function dividerExitedTowardNewer({
|
|
5
|
-
changed,
|
|
6
|
-
viewableItems,
|
|
7
|
-
dividerKey,
|
|
8
|
-
initialMessageId,
|
|
9
|
-
}: {
|
|
10
|
-
changed: ViewableChangeEntry[]
|
|
11
|
-
viewableItems: ViewableItem[]
|
|
12
|
-
dividerKey: string
|
|
13
|
-
initialMessageId: string
|
|
14
|
-
}): boolean {
|
|
15
|
-
const dividerExited = changed.some(c => c.key === dividerKey && !c.isViewable)
|
|
16
|
-
if (!dividerExited) return false
|
|
17
|
-
|
|
18
|
-
const visibleMessageIds = viewableItems
|
|
19
|
-
.filter(v => v.item?.type === 'Message')
|
|
20
|
-
.map(v => v.item?.id)
|
|
21
|
-
.filter((id): id is string => !!id)
|
|
22
|
-
if (visibleMessageIds.length === 0) return false
|
|
23
|
-
|
|
24
|
-
return visibleMessageIds.every(id => id.localeCompare(initialMessageId) > 0)
|
|
25
|
-
}
|