@planningcenter/chat-react-native 3.42.2-qa-staging.4 → 3.42.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/messages_disabled_banners.d.ts +1 -5
- package/build/components/conversation/messages_disabled_banners.d.ts.map +1 -1
- package/build/components/conversation/messages_disabled_banners.js +4 -8
- package/build/components/conversation/messages_disabled_banners.js.map +1 -1
- package/build/hooks/direct_messages/use_find_or_create_direct_message_conversation.d.ts.map +1 -1
- package/build/hooks/direct_messages/use_find_or_create_direct_message_conversation.js +8 -1
- package/build/hooks/direct_messages/use_find_or_create_direct_message_conversation.js.map +1 -1
- package/build/hooks/use_conversation.d.ts.map +1 -1
- package/build/hooks/use_conversation.js +0 -1
- package/build/hooks/use_conversation.js.map +1 -1
- package/build/hooks/use_conversation_jolt_events.d.ts.map +1 -1
- package/build/hooks/use_conversation_jolt_events.js +9 -1
- package/build/hooks/use_conversation_jolt_events.js.map +1 -1
- package/build/hooks/use_conversation_messages.d.ts +1 -0
- package/build/hooks/use_conversation_messages.d.ts.map +1 -1
- package/build/hooks/use_conversation_messages.js +2 -2
- package/build/hooks/use_conversation_messages.js.map +1 -1
- package/build/hooks/use_conversations_actions.d.ts.map +1 -1
- package/build/hooks/use_conversations_actions.js +12 -1
- package/build/hooks/use_conversations_actions.js.map +1 -1
- package/build/screens/conversation_screen.d.ts.map +1 -1
- package/build/screens/conversation_screen.js +3 -5
- package/build/screens/conversation_screen.js.map +1 -1
- package/build/screens/conversation_select_recipients/conversation_select_direct_message_recipients_screen.d.ts +1 -1
- package/build/screens/conversation_select_recipients/conversation_select_direct_message_recipients_screen.d.ts.map +1 -1
- package/build/screens/conversation_select_recipients/conversation_select_direct_message_recipients_screen.js +2 -13
- package/build/screens/conversation_select_recipients/conversation_select_direct_message_recipients_screen.js.map +1 -1
- package/build/screens/conversation_select_recipients/types/screen_props.d.ts +0 -2
- package/build/screens/conversation_select_recipients/types/screen_props.d.ts.map +1 -1
- package/build/screens/conversation_select_recipients/types/screen_props.js.map +1 -1
- package/build/screens/conversations/components/list_header_component.js +1 -1
- package/build/screens/conversations/components/list_header_component.js.map +1 -1
- package/build/types/jolt_events/reaction_events.d.ts +1 -0
- package/build/types/jolt_events/reaction_events.d.ts.map +1 -1
- package/build/types/jolt_events/reaction_events.js.map +1 -1
- package/build/types/resources/direct_message_candidate.d.ts +0 -1
- package/build/types/resources/direct_message_candidate.d.ts.map +1 -1
- package/build/types/resources/direct_message_candidate.js.map +1 -1
- package/build/types/resources/member.d.ts +0 -1
- package/build/types/resources/member.d.ts.map +1 -1
- package/build/types/resources/member.js.map +1 -1
- package/build/types/resources/member_ability.d.ts +0 -1
- package/build/types/resources/member_ability.d.ts.map +1 -1
- package/build/types/resources/member_ability.js.map +1 -1
- package/package.json +3 -3
- package/src/components/conversation/messages_disabled_banners.tsx +4 -31
- package/src/hooks/direct_messages/use_find_or_create_direct_message_conversation.ts +11 -2
- package/src/hooks/use_conversation.ts +0 -1
- package/src/hooks/use_conversation_jolt_events.ts +6 -1
- package/src/hooks/use_conversation_messages.ts +6 -5
- package/src/hooks/use_conversations_actions.ts +13 -1
- package/src/screens/conversation_screen.tsx +5 -11
- package/src/screens/conversation_select_recipients/conversation_select_direct_message_recipients_screen.tsx +4 -18
- package/src/screens/conversation_select_recipients/types/screen_props.tsx +0 -2
- package/src/screens/conversations/components/list_header_component.tsx +6 -6
- package/src/types/jolt_events/reaction_events.ts +1 -0
- package/src/types/resources/direct_message_candidate.ts +0 -5
- package/src/types/resources/member.ts +0 -1
- package/src/types/resources/member_ability.ts +0 -1
- package/build/hooks/direct_messages/find_direct_message_conversation.d.ts +0 -14
- package/build/hooks/direct_messages/find_direct_message_conversation.d.ts.map +0 -1
- package/build/hooks/direct_messages/find_direct_message_conversation.js +0 -10
- package/build/hooks/direct_messages/find_direct_message_conversation.js.map +0 -1
- package/build/hooks/direct_messages/resolve_message_available_members_link.d.ts +0 -16
- package/build/hooks/direct_messages/resolve_message_available_members_link.d.ts.map +0 -1
- package/build/hooks/direct_messages/resolve_message_available_members_link.js +0 -24
- package/build/hooks/direct_messages/resolve_message_available_members_link.js.map +0 -1
- package/build/hooks/direct_messages/use_message_available_members.d.ts +0 -6
- package/build/hooks/direct_messages/use_message_available_members.d.ts.map +0 -1
- package/build/hooks/direct_messages/use_message_available_members.js +0 -40
- package/build/hooks/direct_messages/use_message_available_members.js.map +0 -1
- package/build/hooks/direct_messages/use_message_available_members_action.d.ts +0 -6
- package/build/hooks/direct_messages/use_message_available_members_action.d.ts.map +0 -1
- package/build/hooks/direct_messages/use_message_available_members_action.js +0 -30
- package/build/hooks/direct_messages/use_message_available_members_action.js.map +0 -1
- package/src/__tests__/hooks/resolve_message_available_members_link.test.ts +0 -72
- package/src/hooks/direct_messages/find_direct_message_conversation.ts +0 -16
- package/src/hooks/direct_messages/resolve_message_available_members_link.ts +0 -42
- package/src/hooks/direct_messages/use_message_available_members.ts +0 -65
- package/src/hooks/direct_messages/use_message_available_members_action.ts +0 -34
|
@@ -3,7 +3,7 @@ import { useSafeAreaInsets } from 'react-native-safe-area-context'
|
|
|
3
3
|
import { useTheme } from '../../hooks'
|
|
4
4
|
import type { ConversationDisabledReason } from '../../types'
|
|
5
5
|
import { ADULT_REQUIREMENT_BODY } from '../../utils'
|
|
6
|
-
import {
|
|
6
|
+
import { Text } from '../display'
|
|
7
7
|
|
|
8
8
|
export const LeaderMessagesDisabledBanner = () => {
|
|
9
9
|
return (
|
|
@@ -31,37 +31,22 @@ const DEFAULT_DISABLED_TEXT = 'This conversation has been disabled.'
|
|
|
31
31
|
|
|
32
32
|
interface ConversationDisabledBannerProps {
|
|
33
33
|
disabledReason?: ConversationDisabledReason
|
|
34
|
-
messageLink?: { label: string; onPress: () => void }
|
|
35
34
|
}
|
|
36
35
|
|
|
37
|
-
export const ConversationDisabledBanner = ({
|
|
38
|
-
disabledReason,
|
|
39
|
-
messageLink,
|
|
40
|
-
}: ConversationDisabledBannerProps) => {
|
|
36
|
+
export const ConversationDisabledBanner = ({ disabledReason }: ConversationDisabledBannerProps) => {
|
|
41
37
|
const styles = useStyles()
|
|
42
38
|
const description =
|
|
43
39
|
(disabledReason && DISABLED_REASON_TEXT[disabledReason]) ?? DEFAULT_DISABLED_TEXT
|
|
44
40
|
|
|
45
|
-
return
|
|
46
|
-
<MessagesDisabledBanner
|
|
47
|
-
description={description}
|
|
48
|
-
style={styles.memberBanner}
|
|
49
|
-
messageLink={messageLink}
|
|
50
|
-
/>
|
|
51
|
-
)
|
|
41
|
+
return <MessagesDisabledBanner description={description} style={styles.memberBanner} />
|
|
52
42
|
}
|
|
53
43
|
|
|
54
44
|
interface MessagesDisabledBannerProps {
|
|
55
45
|
description: string
|
|
56
46
|
style?: ViewStyle
|
|
57
|
-
messageLink?: { label: string; onPress: () => void }
|
|
58
47
|
}
|
|
59
48
|
|
|
60
|
-
const MessagesDisabledBanner = ({
|
|
61
|
-
description,
|
|
62
|
-
style,
|
|
63
|
-
messageLink,
|
|
64
|
-
}: MessagesDisabledBannerProps) => {
|
|
49
|
+
const MessagesDisabledBanner = ({ description, style }: MessagesDisabledBannerProps) => {
|
|
65
50
|
const styles = useStyles()
|
|
66
51
|
|
|
67
52
|
return (
|
|
@@ -69,15 +54,6 @@ const MessagesDisabledBanner = ({
|
|
|
69
54
|
<Text style={styles.text} variant="tertiary">
|
|
70
55
|
{description}
|
|
71
56
|
</Text>
|
|
72
|
-
{messageLink && (
|
|
73
|
-
<Button
|
|
74
|
-
variant="fill"
|
|
75
|
-
size="lg"
|
|
76
|
-
title={messageLink.label}
|
|
77
|
-
onPress={messageLink.onPress}
|
|
78
|
-
style={styles.messageButton}
|
|
79
|
-
/>
|
|
80
|
-
)}
|
|
81
57
|
</View>
|
|
82
58
|
)
|
|
83
59
|
}
|
|
@@ -102,8 +78,5 @@ const useStyles = () => {
|
|
|
102
78
|
paddingBottom: 16 + bottom,
|
|
103
79
|
marginBottom: -bottom,
|
|
104
80
|
},
|
|
105
|
-
messageButton: {
|
|
106
|
-
marginTop: 12,
|
|
107
|
-
},
|
|
108
81
|
})
|
|
109
82
|
}
|
|
@@ -1,8 +1,17 @@
|
|
|
1
1
|
import { useQuery } from '@tanstack/react-query'
|
|
2
2
|
import { useState, useCallback } from 'react'
|
|
3
|
-
import { ApiResource, ConversationResource } from '../../types'
|
|
3
|
+
import { ApiCollection, ApiResource, ConversationResource } from '../../types'
|
|
4
4
|
import { ApiClient, useApiClient } from '../use_api_client'
|
|
5
|
-
|
|
5
|
+
|
|
6
|
+
const findDirectMessageConversation = (apiClient: ApiClient, participantIds: string[]) =>
|
|
7
|
+
apiClient.chat.get({
|
|
8
|
+
url: '/me/conversations',
|
|
9
|
+
data: {
|
|
10
|
+
fields: { Conversation: ['title'] },
|
|
11
|
+
filter: 'with_exact_direct_message_participants',
|
|
12
|
+
participant_ids: participantIds.join(','),
|
|
13
|
+
},
|
|
14
|
+
}) as Promise<ApiCollection<ConversationResource>>
|
|
6
15
|
|
|
7
16
|
const createDirectMessageConversation = (apiClient: ApiClient, ids: string[]) =>
|
|
8
17
|
apiClient.chat.post({
|
|
@@ -87,9 +87,14 @@ export function useConversationJoltEvents({ conversationId }: Props) {
|
|
|
87
87
|
|
|
88
88
|
const handleReactionJoltEvent = useCallback(
|
|
89
89
|
(event: JoltReactionEvent) => {
|
|
90
|
+
if (event.event !== 'reaction.created') return
|
|
90
91
|
if (event.data.data.author_id === currentPersonId) return
|
|
92
|
+
if (event.data.data.message_author_id !== currentPersonId) return
|
|
91
93
|
|
|
92
|
-
queryClient.
|
|
94
|
+
queryClient.setQueryData<ApiResource<ConversationResource>>(queryKey, prev => {
|
|
95
|
+
if (!prev?.data) return prev
|
|
96
|
+
return { ...prev, data: { ...prev.data, unreadReaction: true } }
|
|
97
|
+
})
|
|
93
98
|
},
|
|
94
99
|
[queryClient, queryKey, currentPersonId]
|
|
95
100
|
)
|
|
@@ -7,10 +7,11 @@ export const useConversationMessages = (
|
|
|
7
7
|
{ conversation_id, reply_root_id }: { conversation_id: number; reply_root_id?: string | null },
|
|
8
8
|
opts?: SuspensePaginatorOptions
|
|
9
9
|
) => {
|
|
10
|
-
const { data, refetch, isRefetching, fetchNextPage } =
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
10
|
+
const { data, refetch, isRefetching, fetchNextPage, hasNextPage } =
|
|
11
|
+
useSuspensePaginator<MessageResource>(
|
|
12
|
+
getMessagesRequestArgs({ conversation_id, reply_root_id }),
|
|
13
|
+
opts
|
|
14
|
+
)
|
|
14
15
|
const queryKey = getMessagesQueryKey({ conversation_id, reply_root_id })
|
|
15
16
|
const messages = useMemo(
|
|
16
17
|
() =>
|
|
@@ -24,5 +25,5 @@ export const useConversationMessages = (
|
|
|
24
25
|
[data]
|
|
25
26
|
)
|
|
26
27
|
|
|
27
|
-
return { messages, refetch, isRefetching, fetchNextPage, queryKey }
|
|
28
|
+
return { messages, refetch, isRefetching, fetchNextPage, hasNextPage, queryKey }
|
|
28
29
|
}
|
|
@@ -1,10 +1,12 @@
|
|
|
1
|
-
import { useMutation } from '@tanstack/react-query'
|
|
1
|
+
import { useMutation, useQueryClient } from '@tanstack/react-query'
|
|
2
2
|
import { Alert } from 'react-native'
|
|
3
3
|
import { useConversationsContext } from '../contexts/conversations_context'
|
|
4
4
|
import { ApiResource, ConversationResource } from '../types'
|
|
5
5
|
import { useApiClient } from './use_api_client'
|
|
6
|
+
import { getConversationRequestArgs } from './use_conversation'
|
|
6
7
|
import { useConversationsCache } from './use_conversations_cache'
|
|
7
8
|
import { useCurrentPersonCache } from './use_current_person'
|
|
9
|
+
import { getRequestQueryKey } from './use_suspense_api'
|
|
8
10
|
|
|
9
11
|
export const useConversationsMarkRead = ({
|
|
10
12
|
conversation,
|
|
@@ -12,9 +14,13 @@ export const useConversationsMarkRead = ({
|
|
|
12
14
|
conversation: ConversationResource
|
|
13
15
|
}) => {
|
|
14
16
|
const apiClient = useApiClient()
|
|
17
|
+
const queryClient = useQueryClient()
|
|
15
18
|
const { args } = useConversationsContext()
|
|
16
19
|
const currentPersonCache = useCurrentPersonCache()
|
|
17
20
|
const { update, invalidate, fetchUpdate } = useConversationsCache(args)
|
|
21
|
+
const conversationQueryKey = getRequestQueryKey(
|
|
22
|
+
getConversationRequestArgs({ conversation_id: conversation.id })
|
|
23
|
+
)
|
|
18
24
|
|
|
19
25
|
function handlePersonUnreadCount(read: boolean) {
|
|
20
26
|
currentPersonCache.update({}, person => {
|
|
@@ -31,6 +37,12 @@ export const useConversationsMarkRead = ({
|
|
|
31
37
|
unreadCount: read ? 0 : 1,
|
|
32
38
|
...(read ? { unreadReaction: false } : {}),
|
|
33
39
|
})
|
|
40
|
+
if (read) {
|
|
41
|
+
queryClient.setQueryData<ApiResource<ConversationResource>>(conversationQueryKey, prev => {
|
|
42
|
+
if (!prev?.data) return prev
|
|
43
|
+
return { ...prev, data: { ...prev.data, unreadReaction: false } }
|
|
44
|
+
})
|
|
45
|
+
}
|
|
34
46
|
handlePersonUnreadCount(read)
|
|
35
47
|
},
|
|
36
48
|
mutationKey: ['markRead', conversation.id],
|
|
@@ -28,7 +28,6 @@ import { KeyboardView } from '../components/display/keyboard_view'
|
|
|
28
28
|
import BlankState from '../components/primitive/blank_state_primitive'
|
|
29
29
|
import { ConversationContextProvider } from '../contexts/conversation_context'
|
|
30
30
|
import { useTheme } from '../hooks'
|
|
31
|
-
import { useMessageAvailableMembersAction } from '../hooks/direct_messages/use_message_available_members_action'
|
|
32
31
|
import { useConversation } from '../hooks/use_conversation'
|
|
33
32
|
import { useConversationJoltEvents } from '../hooks/use_conversation_jolt_events'
|
|
34
33
|
import { useConversationMessages } from '../hooks/use_conversation_messages'
|
|
@@ -90,7 +89,7 @@ function ConversationScreenContent({ route }: ConversationScreenProps) {
|
|
|
90
89
|
const { conversation_id, editing_message_id, reply_root_id, reply_root_author_name } =
|
|
91
90
|
route.params
|
|
92
91
|
const { data: conversation } = useConversation(route.params)
|
|
93
|
-
const { messages, fetchNextPage } = useConversationMessages({
|
|
92
|
+
const { messages, fetchNextPage, hasNextPage } = useConversationMessages({
|
|
94
93
|
conversation_id,
|
|
95
94
|
reply_root_id,
|
|
96
95
|
})
|
|
@@ -182,7 +181,9 @@ function ConversationScreenContent({ route }: ConversationScreenProps) {
|
|
|
182
181
|
onScroll={trackScroll}
|
|
183
182
|
scrollEventThrottle={10}
|
|
184
183
|
ListFooterComponent={
|
|
185
|
-
|
|
184
|
+
hasNextPage ? null : (
|
|
185
|
+
<ConversationStartBanner conversation={conversation} hasMessages={true} />
|
|
186
|
+
)
|
|
186
187
|
}
|
|
187
188
|
renderItem={({ item }) => {
|
|
188
189
|
if (item.type === 'DateSeparator') {
|
|
@@ -250,15 +251,8 @@ function ConversationBottomBar({
|
|
|
250
251
|
currentlyEditingMessage,
|
|
251
252
|
onFlaggedInMessageForm,
|
|
252
253
|
}: ConversationBottomBarProps) {
|
|
253
|
-
const messageLink = useMessageAvailableMembersAction(conversation)
|
|
254
|
-
|
|
255
254
|
if (conversation.disabled)
|
|
256
|
-
return
|
|
257
|
-
<ConversationDisabledBanner
|
|
258
|
-
disabledReason={conversation.disabledReason}
|
|
259
|
-
messageLink={messageLink}
|
|
260
|
-
/>
|
|
261
|
-
)
|
|
255
|
+
return <ConversationDisabledBanner disabledReason={conversation.disabledReason} />
|
|
262
256
|
if (!canReply) return <MemberMessagesDisabledBanner />
|
|
263
257
|
return (
|
|
264
258
|
<MessageForm.Root
|
|
@@ -17,30 +17,16 @@ import { ConversationSelectRecipientsScreenProps } from './types/screen_props'
|
|
|
17
17
|
|
|
18
18
|
const MAX_RECIPIENTS = 9
|
|
19
19
|
|
|
20
|
-
export function ConversationSelectDirectMessageRecipientsScreen(
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
const { preselected_people = [] } = route.params ?? {}
|
|
20
|
+
export function ConversationSelectDirectMessageRecipientsScreen(
|
|
21
|
+
_props: ConversationSelectRecipientsScreenProps
|
|
22
|
+
) {
|
|
24
23
|
const styles = useStyles()
|
|
25
24
|
const navigation = useNavigation()
|
|
26
25
|
const { featureEnabled } = useFeatures()
|
|
27
26
|
const [searchTerm, setSearchTerm] = useState('')
|
|
28
27
|
const [debouncedTerm, setDebouncedTerm] = useState('')
|
|
29
28
|
const [selectedPeople, setSelectedPeople] = useState<Map<string, DirectMessageCandidateResource>>(
|
|
30
|
-
()
|
|
31
|
-
new Map(
|
|
32
|
-
preselected_people.map(person => [
|
|
33
|
-
person.id,
|
|
34
|
-
{
|
|
35
|
-
...person,
|
|
36
|
-
type: 'DirectMessageCandidate' as const,
|
|
37
|
-
groups: [],
|
|
38
|
-
teams: [],
|
|
39
|
-
under_18: false,
|
|
40
|
-
directMessagesDisabled: false,
|
|
41
|
-
},
|
|
42
|
-
])
|
|
43
|
-
)
|
|
29
|
+
new Map()
|
|
44
30
|
)
|
|
45
31
|
const searchInputRef = useRef<TextInput>(null)
|
|
46
32
|
|
|
@@ -1,12 +1,10 @@
|
|
|
1
1
|
import { StaticScreenProps } from '@react-navigation/native'
|
|
2
2
|
import { AppName } from '../../../types/resources/app_name'
|
|
3
|
-
import { PreselectedDirectMessagePerson } from '../../../types/resources/direct_message_candidate'
|
|
4
3
|
import { GraphId } from '../../../types/resources/group_resource'
|
|
5
4
|
|
|
6
5
|
export type ConversationSelectRecipientsParams = {
|
|
7
6
|
chat_group_graph_id?: GraphId
|
|
8
7
|
group_source_app_name?: AppName
|
|
9
|
-
preselected_people?: PreselectedDirectMessagePerson[]
|
|
10
8
|
}
|
|
11
9
|
|
|
12
10
|
export type ConversationSelectRecipientsScreenProps =
|
|
@@ -158,6 +158,12 @@ export const ListHeaderComponent = () => {
|
|
|
158
158
|
</TextButton>
|
|
159
159
|
</View>
|
|
160
160
|
<View style={styles.actionsContainer}>
|
|
161
|
+
<ListHeaderActionButton
|
|
162
|
+
name="general.cog"
|
|
163
|
+
onPress={handleChatSettings}
|
|
164
|
+
accessibilityLabel="Chat settings"
|
|
165
|
+
maxFontSizeMultiplier={MAX_FONT_SIZE_MULTIPLIER_LANDMARK}
|
|
166
|
+
/>
|
|
161
167
|
{canCreateConversations && (
|
|
162
168
|
<ListHeaderActionButton
|
|
163
169
|
name="churchCenter.signups"
|
|
@@ -167,12 +173,6 @@ export const ListHeaderComponent = () => {
|
|
|
167
173
|
maxFontSizeMultiplier={MAX_FONT_SIZE_MULTIPLIER_LANDMARK}
|
|
168
174
|
/>
|
|
169
175
|
)}
|
|
170
|
-
<ListHeaderActionButton
|
|
171
|
-
name="general.cog"
|
|
172
|
-
onPress={handleChatSettings}
|
|
173
|
-
accessibilityLabel="Chat settings"
|
|
174
|
-
maxFontSizeMultiplier={MAX_FONT_SIZE_MULTIPLIER_LANDMARK}
|
|
175
|
-
/>
|
|
176
176
|
{shouldShowHeaderFiltersButton && <ToggleButton {...moreFiltersButtonProps} />}
|
|
177
177
|
</View>
|
|
178
178
|
</View>
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
import { ApiCollection, ConversationResource } from '../../types';
|
|
2
|
-
import { ApiClient } from '../use_api_client';
|
|
3
|
-
export declare const getFindDirectMessageConversationRequestArgs: (participantIds: string[]) => {
|
|
4
|
-
url: string;
|
|
5
|
-
data: {
|
|
6
|
-
fields: {
|
|
7
|
-
Conversation: string[];
|
|
8
|
-
};
|
|
9
|
-
filter: string;
|
|
10
|
-
participant_ids: string;
|
|
11
|
-
};
|
|
12
|
-
};
|
|
13
|
-
export declare const findDirectMessageConversation: (apiClient: ApiClient, participantIds: string[]) => Promise<ApiCollection<ConversationResource>>;
|
|
14
|
-
//# sourceMappingURL=find_direct_message_conversation.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"find_direct_message_conversation.d.ts","sourceRoot":"","sources":["../../../src/hooks/direct_messages/find_direct_message_conversation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAA;AACjE,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAA;AAE7C,eAAO,MAAM,2CAA2C,GAAI,gBAAgB,MAAM,EAAE;;;;;;;;;CAOlF,CAAA;AAEF,eAAO,MAAM,6BAA6B,GAAI,WAAW,SAAS,EAAE,gBAAgB,MAAM,EAAE,KACP,OAAO,CACxF,aAAa,CAAC,oBAAoB,CAAC,CACpC,CAAA"}
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
export const getFindDirectMessageConversationRequestArgs = (participantIds) => ({
|
|
2
|
-
url: '/me/conversations',
|
|
3
|
-
data: {
|
|
4
|
-
fields: { Conversation: ['title', 'disabled'] },
|
|
5
|
-
filter: 'with_exact_direct_message_participants',
|
|
6
|
-
participant_ids: participantIds.join(','),
|
|
7
|
-
},
|
|
8
|
-
});
|
|
9
|
-
export const findDirectMessageConversation = (apiClient, participantIds) => apiClient.chat.get(getFindDirectMessageConversationRequestArgs(participantIds));
|
|
10
|
-
//# sourceMappingURL=find_direct_message_conversation.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"find_direct_message_conversation.js","sourceRoot":"","sources":["../../../src/hooks/direct_messages/find_direct_message_conversation.ts"],"names":[],"mappings":"AAGA,MAAM,CAAC,MAAM,2CAA2C,GAAG,CAAC,cAAwB,EAAE,EAAE,CAAC,CAAC;IACxF,GAAG,EAAE,mBAAmB;IACxB,IAAI,EAAE;QACJ,MAAM,EAAE,EAAE,YAAY,EAAE,CAAC,OAAO,EAAE,UAAU,CAAC,EAAE;QAC/C,MAAM,EAAE,wCAAwC;QAChD,eAAe,EAAE,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC;KAC1C;CACF,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,6BAA6B,GAAG,CAAC,SAAoB,EAAE,cAAwB,EAAE,EAAE,CAC9F,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,2CAA2C,CAAC,cAAc,CAAC,CAE7E,CAAA","sourcesContent":["import { ApiCollection, ConversationResource } from '../../types'\nimport { ApiClient } from '../use_api_client'\n\nexport const getFindDirectMessageConversationRequestArgs = (participantIds: string[]) => ({\n url: '/me/conversations',\n data: {\n fields: { Conversation: ['title', 'disabled'] },\n filter: 'with_exact_direct_message_participants',\n participant_ids: participantIds.join(','),\n },\n})\n\nexport const findDirectMessageConversation = (apiClient: ApiClient, participantIds: string[]) =>\n apiClient.chat.get(getFindDirectMessageConversationRequestArgs(participantIds)) as Promise<\n ApiCollection<ConversationResource>\n >\n"]}
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
import { ConversationResource } from '../../types';
|
|
2
|
-
import { PreselectedDirectMessagePerson } from '../../types/resources/direct_message_candidate';
|
|
3
|
-
import { MemberResource } from '../../types/resources/member';
|
|
4
|
-
export type MessageAvailableMembersLink = {
|
|
5
|
-
label: string;
|
|
6
|
-
existingConversationId: number;
|
|
7
|
-
} | {
|
|
8
|
-
label: string;
|
|
9
|
-
recipients: PreselectedDirectMessagePerson[];
|
|
10
|
-
};
|
|
11
|
-
export declare function resolveMessageAvailableMembersLink({ availableMembers, existingConversations, canCreateDirectMessages, }: {
|
|
12
|
-
availableMembers: Pick<MemberResource, 'id' | 'name' | 'avatar'>[];
|
|
13
|
-
existingConversations: Pick<ConversationResource, 'id' | 'disabled'>[] | undefined;
|
|
14
|
-
canCreateDirectMessages: boolean;
|
|
15
|
-
}): MessageAvailableMembersLink | undefined;
|
|
16
|
-
//# sourceMappingURL=resolve_message_available_members_link.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"resolve_message_available_members_link.d.ts","sourceRoot":"","sources":["../../../src/hooks/direct_messages/resolve_message_available_members_link.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAA;AAClD,OAAO,EAAE,8BAA8B,EAAE,MAAM,gDAAgD,CAAA;AAC/F,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAA;AAE7D,MAAM,MAAM,2BAA2B,GACnC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,sBAAsB,EAAE,MAAM,CAAA;CAAE,GACjD;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,8BAA8B,EAAE,CAAA;CAAE,CAAA;AAEnE,wBAAgB,kCAAkC,CAAC,EACjD,gBAAgB,EAChB,qBAAqB,EACrB,uBAAuB,GACxB,EAAE;IACD,gBAAgB,EAAE,IAAI,CAAC,cAAc,EAAE,IAAI,GAAG,MAAM,GAAG,QAAQ,CAAC,EAAE,CAAA;IAClE,qBAAqB,EAAE,IAAI,CAAC,oBAAoB,EAAE,IAAI,GAAG,UAAU,CAAC,EAAE,GAAG,SAAS,CAAA;IAClF,uBAAuB,EAAE,OAAO,CAAA;CACjC,GAAG,2BAA2B,GAAG,SAAS,CAyB1C"}
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
export function resolveMessageAvailableMembersLink({ availableMembers, existingConversations, canCreateDirectMessages, }) {
|
|
2
|
-
if (availableMembers.length === 0 || !existingConversations)
|
|
3
|
-
return undefined;
|
|
4
|
-
const label = availableMembers.length === 1
|
|
5
|
-
? `Message ${availableMembers[0].name.split(' ')[0]}`
|
|
6
|
-
: `Message the remaining ${availableMembers.length} people`;
|
|
7
|
-
const existingConversation = existingConversations[0];
|
|
8
|
-
if (existingConversation) {
|
|
9
|
-
return existingConversation.disabled
|
|
10
|
-
? undefined
|
|
11
|
-
: { label, existingConversationId: Number(existingConversation.id) };
|
|
12
|
-
}
|
|
13
|
-
if (!canCreateDirectMessages)
|
|
14
|
-
return undefined;
|
|
15
|
-
return {
|
|
16
|
-
label,
|
|
17
|
-
recipients: availableMembers.map(m => ({
|
|
18
|
-
id: m.id.toString(),
|
|
19
|
-
name: m.name,
|
|
20
|
-
avatar: m.avatar,
|
|
21
|
-
})),
|
|
22
|
-
};
|
|
23
|
-
}
|
|
24
|
-
//# sourceMappingURL=resolve_message_available_members_link.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"resolve_message_available_members_link.js","sourceRoot":"","sources":["../../../src/hooks/direct_messages/resolve_message_available_members_link.ts"],"names":[],"mappings":"AAQA,MAAM,UAAU,kCAAkC,CAAC,EACjD,gBAAgB,EAChB,qBAAqB,EACrB,uBAAuB,GAKxB;IACC,IAAI,gBAAgB,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,qBAAqB;QAAE,OAAO,SAAS,CAAA;IAE7E,MAAM,KAAK,GACT,gBAAgB,CAAC,MAAM,KAAK,CAAC;QAC3B,CAAC,CAAC,WAAW,gBAAgB,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE;QACrD,CAAC,CAAC,yBAAyB,gBAAgB,CAAC,MAAM,SAAS,CAAA;IAE/D,MAAM,oBAAoB,GAAG,qBAAqB,CAAC,CAAC,CAAC,CAAA;IACrD,IAAI,oBAAoB,EAAE,CAAC;QACzB,OAAO,oBAAoB,CAAC,QAAQ;YAClC,CAAC,CAAC,SAAS;YACX,CAAC,CAAC,EAAE,KAAK,EAAE,sBAAsB,EAAE,MAAM,CAAC,oBAAoB,CAAC,EAAE,CAAC,EAAE,CAAA;IACxE,CAAC;IAED,IAAI,CAAC,uBAAuB;QAAE,OAAO,SAAS,CAAA;IAE9C,OAAO;QACL,KAAK;QACL,UAAU,EAAE,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACrC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,QAAQ,EAAE;YACnB,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,MAAM,EAAE,CAAC,CAAC,MAAM;SACjB,CAAC,CAAC;KACJ,CAAA;AACH,CAAC","sourcesContent":["import { ConversationResource } from '../../types'\nimport { PreselectedDirectMessagePerson } from '../../types/resources/direct_message_candidate'\nimport { MemberResource } from '../../types/resources/member'\n\nexport type MessageAvailableMembersLink =\n | { label: string; existingConversationId: number }\n | { label: string; recipients: PreselectedDirectMessagePerson[] }\n\nexport function resolveMessageAvailableMembersLink({\n availableMembers,\n existingConversations,\n canCreateDirectMessages,\n}: {\n availableMembers: Pick<MemberResource, 'id' | 'name' | 'avatar'>[]\n existingConversations: Pick<ConversationResource, 'id' | 'disabled'>[] | undefined\n canCreateDirectMessages: boolean\n}): MessageAvailableMembersLink | undefined {\n if (availableMembers.length === 0 || !existingConversations) return undefined\n\n const label =\n availableMembers.length === 1\n ? `Message ${availableMembers[0].name.split(' ')[0]}`\n : `Message the remaining ${availableMembers.length} people`\n\n const existingConversation = existingConversations[0]\n if (existingConversation) {\n return existingConversation.disabled\n ? undefined\n : { label, existingConversationId: Number(existingConversation.id) }\n }\n\n if (!canCreateDirectMessages) return undefined\n\n return {\n label,\n recipients: availableMembers.map(m => ({\n id: m.id.toString(),\n name: m.name,\n avatar: m.avatar,\n })),\n }\n}\n"]}
|
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
import { ConversationResource } from '../../types';
|
|
2
|
-
import { MessageAvailableMembersLink } from './resolve_message_available_members_link';
|
|
3
|
-
export declare function useMessageAvailableMembers(conversation: ConversationResource, { enabled }: {
|
|
4
|
-
enabled: boolean;
|
|
5
|
-
}): MessageAvailableMembersLink | undefined;
|
|
6
|
-
//# sourceMappingURL=use_message_available_members.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"use_message_available_members.d.ts","sourceRoot":"","sources":["../../../src/hooks/direct_messages/use_message_available_members.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAA;AAUlD,OAAO,EACL,2BAA2B,EAE5B,MAAM,0CAA0C,CAAA;AAEjD,wBAAgB,0BAA0B,CACxC,YAAY,EAAE,oBAAoB,EAClC,EAAE,OAAO,EAAE,EAAE;IAAE,OAAO,EAAE,OAAO,CAAA;CAAE,GAChC,2BAA2B,GAAG,SAAS,CA4CzC"}
|
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
import { useQuery } from '@tanstack/react-query';
|
|
2
|
-
import { useMemo } from 'react';
|
|
3
|
-
import { useApiGet } from '../use_api';
|
|
4
|
-
import { useApiClient } from '../use_api_client';
|
|
5
|
-
import { useCurrentPerson } from '../use_current_person';
|
|
6
|
-
import { getRequestQueryKey } from '../use_suspense_api';
|
|
7
|
-
import { findDirectMessageConversation, getFindDirectMessageConversationRequestArgs, } from './find_direct_message_conversation';
|
|
8
|
-
import { resolveMessageAvailableMembersLink, } from './resolve_message_available_members_link';
|
|
9
|
-
export function useMessageAvailableMembers(conversation, { enabled }) {
|
|
10
|
-
const apiClient = useApiClient();
|
|
11
|
-
const currentPerson = useCurrentPerson();
|
|
12
|
-
const { data: members } = useApiGet({
|
|
13
|
-
url: `/me/conversations/${conversation.id}/members`,
|
|
14
|
-
data: { fields: { Member: ['name', 'avatar', 'direct_messages_disabled'] } },
|
|
15
|
-
}, { enabled });
|
|
16
|
-
const availableMembers = useMemo(() => {
|
|
17
|
-
if (!enabled || !members)
|
|
18
|
-
return [];
|
|
19
|
-
const currentMember = members.find(m => m.id === currentPerson.id);
|
|
20
|
-
if (currentMember?.directMessagesDisabled)
|
|
21
|
-
return [];
|
|
22
|
-
return members.filter(m => m.id !== currentPerson.id && !m.directMessagesDisabled);
|
|
23
|
-
}, [enabled, members, currentPerson.id]);
|
|
24
|
-
const availablePersonIds = useMemo(() => availableMembers.map(m => m.id), [availableMembers]);
|
|
25
|
-
const { data: existingDirectMessageData } = useQuery({
|
|
26
|
-
queryKey: getRequestQueryKey(getFindDirectMessageConversationRequestArgs(availablePersonIds.map(String))),
|
|
27
|
-
queryFn: () => findDirectMessageConversation(apiClient, availablePersonIds.map(String)),
|
|
28
|
-
enabled: availablePersonIds.length > 0,
|
|
29
|
-
});
|
|
30
|
-
return useMemo(() => resolveMessageAvailableMembersLink({
|
|
31
|
-
availableMembers,
|
|
32
|
-
existingConversations: existingDirectMessageData?.data,
|
|
33
|
-
canCreateDirectMessages: !!conversation.memberAbility?.canCreateDirectMessages,
|
|
34
|
-
}), [
|
|
35
|
-
availableMembers,
|
|
36
|
-
existingDirectMessageData,
|
|
37
|
-
conversation.memberAbility?.canCreateDirectMessages,
|
|
38
|
-
]);
|
|
39
|
-
}
|
|
40
|
-
//# sourceMappingURL=use_message_available_members.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"use_message_available_members.js","sourceRoot":"","sources":["../../../src/hooks/direct_messages/use_message_available_members.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAA;AAChD,OAAO,EAAE,OAAO,EAAE,MAAM,OAAO,CAAA;AAG/B,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AACtC,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAChD,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAA;AACxD,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAA;AACxD,OAAO,EACL,6BAA6B,EAC7B,2CAA2C,GAC5C,MAAM,oCAAoC,CAAA;AAC3C,OAAO,EAEL,kCAAkC,GACnC,MAAM,0CAA0C,CAAA;AAEjD,MAAM,UAAU,0BAA0B,CACxC,YAAkC,EAClC,EAAE,OAAO,EAAwB;IAEjC,MAAM,SAAS,GAAG,YAAY,EAAE,CAAA;IAChC,MAAM,aAAa,GAAG,gBAAgB,EAAE,CAAA;IAExC,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,SAAS,CACjC;QACE,GAAG,EAAE,qBAAqB,YAAY,CAAC,EAAE,UAAU;QACnD,IAAI,EAAE,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,CAAC,MAAM,EAAE,QAAQ,EAAE,0BAA0B,CAAC,EAAE,EAAE;KAC7E,EACD,EAAE,OAAO,EAAE,CACZ,CAAA;IAED,MAAM,gBAAgB,GAAG,OAAO,CAAC,GAAG,EAAE;QACpC,IAAI,CAAC,OAAO,IAAI,CAAC,OAAO;YAAE,OAAO,EAAE,CAAA;QAEnC,MAAM,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,aAAa,CAAC,EAAE,CAAC,CAAA;QAClE,IAAI,aAAa,EAAE,sBAAsB;YAAE,OAAO,EAAE,CAAA;QAEpD,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,aAAa,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,sBAAsB,CAAC,CAAA;IACpF,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,aAAa,CAAC,EAAE,CAAC,CAAC,CAAA;IAExC,MAAM,kBAAkB,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,gBAAgB,CAAC,CAAC,CAAA;IAE7F,MAAM,EAAE,IAAI,EAAE,yBAAyB,EAAE,GAAG,QAAQ,CAAC;QACnD,QAAQ,EAAE,kBAAkB,CAC1B,2CAA2C,CAAC,kBAAkB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAC5E;QACD,OAAO,EAAE,GAAG,EAAE,CAAC,6BAA6B,CAAC,SAAS,EAAE,kBAAkB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACvF,OAAO,EAAE,kBAAkB,CAAC,MAAM,GAAG,CAAC;KACvC,CAAC,CAAA;IAEF,OAAO,OAAO,CACZ,GAAG,EAAE,CACH,kCAAkC,CAAC;QACjC,gBAAgB;QAChB,qBAAqB,EAAE,yBAAyB,EAAE,IAAI;QACtD,uBAAuB,EAAE,CAAC,CAAC,YAAY,CAAC,aAAa,EAAE,uBAAuB;KAC/E,CAAC,EACJ;QACE,gBAAgB;QAChB,yBAAyB;QACzB,YAAY,CAAC,aAAa,EAAE,uBAAuB;KACpD,CACF,CAAA;AACH,CAAC","sourcesContent":["import { useQuery } from '@tanstack/react-query'\nimport { useMemo } from 'react'\nimport { ConversationResource } from '../../types'\nimport { MemberResource } from '../../types/resources/member'\nimport { useApiGet } from '../use_api'\nimport { useApiClient } from '../use_api_client'\nimport { useCurrentPerson } from '../use_current_person'\nimport { getRequestQueryKey } from '../use_suspense_api'\nimport {\n findDirectMessageConversation,\n getFindDirectMessageConversationRequestArgs,\n} from './find_direct_message_conversation'\nimport {\n MessageAvailableMembersLink,\n resolveMessageAvailableMembersLink,\n} from './resolve_message_available_members_link'\n\nexport function useMessageAvailableMembers(\n conversation: ConversationResource,\n { enabled }: { enabled: boolean }\n): MessageAvailableMembersLink | undefined {\n const apiClient = useApiClient()\n const currentPerson = useCurrentPerson()\n\n const { data: members } = useApiGet<MemberResource[]>(\n {\n url: `/me/conversations/${conversation.id}/members`,\n data: { fields: { Member: ['name', 'avatar', 'direct_messages_disabled'] } },\n },\n { enabled }\n )\n\n const availableMembers = useMemo(() => {\n if (!enabled || !members) return []\n\n const currentMember = members.find(m => m.id === currentPerson.id)\n if (currentMember?.directMessagesDisabled) return []\n\n return members.filter(m => m.id !== currentPerson.id && !m.directMessagesDisabled)\n }, [enabled, members, currentPerson.id])\n\n const availablePersonIds = useMemo(() => availableMembers.map(m => m.id), [availableMembers])\n\n const { data: existingDirectMessageData } = useQuery({\n queryKey: getRequestQueryKey(\n getFindDirectMessageConversationRequestArgs(availablePersonIds.map(String))\n ),\n queryFn: () => findDirectMessageConversation(apiClient, availablePersonIds.map(String)),\n enabled: availablePersonIds.length > 0,\n })\n\n return useMemo(\n () =>\n resolveMessageAvailableMembersLink({\n availableMembers,\n existingConversations: existingDirectMessageData?.data,\n canCreateDirectMessages: !!conversation.memberAbility?.canCreateDirectMessages,\n }),\n [\n availableMembers,\n existingDirectMessageData,\n conversation.memberAbility?.canCreateDirectMessages,\n ]\n )\n}\n"]}
|
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
import { ConversationResource } from '../../types';
|
|
2
|
-
export declare function useMessageAvailableMembersAction(conversation: ConversationResource): {
|
|
3
|
-
label: string;
|
|
4
|
-
onPress: () => void;
|
|
5
|
-
} | undefined;
|
|
6
|
-
//# sourceMappingURL=use_message_available_members_action.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"use_message_available_members_action.d.ts","sourceRoot":"","sources":["../../../src/hooks/direct_messages/use_message_available_members_action.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAA;AAGlD,wBAAgB,gCAAgC,CAAC,YAAY,EAAE,oBAAoB;;;cA6BlF"}
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
import { StackActions, useNavigation } from '@react-navigation/native';
|
|
2
|
-
import { useMessageAvailableMembers } from './use_message_available_members';
|
|
3
|
-
export function useMessageAvailableMembersAction(conversation) {
|
|
4
|
-
const navigation = useNavigation();
|
|
5
|
-
const isDmDisabled = !!conversation.disabled && conversation.disabledReason === 'direct_messages_disabled';
|
|
6
|
-
const messageAvailableMembersLink = useMessageAvailableMembers(conversation, {
|
|
7
|
-
enabled: isDmDisabled,
|
|
8
|
-
});
|
|
9
|
-
if (!messageAvailableMembersLink)
|
|
10
|
-
return undefined;
|
|
11
|
-
return {
|
|
12
|
-
label: messageAvailableMembersLink.label,
|
|
13
|
-
onPress: () => {
|
|
14
|
-
if ('existingConversationId' in messageAvailableMembersLink) {
|
|
15
|
-
// replace instead of navigate/push so the disabled conversation isn't
|
|
16
|
-
// left in the back stack as a dead end
|
|
17
|
-
navigation.dispatch(StackActions.replace('Conversation', {
|
|
18
|
-
conversation_id: messageAvailableMembersLink.existingConversationId,
|
|
19
|
-
}));
|
|
20
|
-
}
|
|
21
|
-
else {
|
|
22
|
-
navigation.navigate('New', {
|
|
23
|
-
screen: 'ConversationSelectDirectMessageRecipients',
|
|
24
|
-
params: { preselected_people: messageAvailableMembersLink.recipients },
|
|
25
|
-
});
|
|
26
|
-
}
|
|
27
|
-
},
|
|
28
|
-
};
|
|
29
|
-
}
|
|
30
|
-
//# sourceMappingURL=use_message_available_members_action.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"use_message_available_members_action.js","sourceRoot":"","sources":["../../../src/hooks/direct_messages/use_message_available_members_action.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAA;AAEtE,OAAO,EAAE,0BAA0B,EAAE,MAAM,iCAAiC,CAAA;AAE5E,MAAM,UAAU,gCAAgC,CAAC,YAAkC;IACjF,MAAM,UAAU,GAAG,aAAa,EAAE,CAAA;IAClC,MAAM,YAAY,GAChB,CAAC,CAAC,YAAY,CAAC,QAAQ,IAAI,YAAY,CAAC,cAAc,KAAK,0BAA0B,CAAA;IACvF,MAAM,2BAA2B,GAAG,0BAA0B,CAAC,YAAY,EAAE;QAC3E,OAAO,EAAE,YAAY;KACtB,CAAC,CAAA;IAEF,IAAI,CAAC,2BAA2B;QAAE,OAAO,SAAS,CAAA;IAElD,OAAO;QACL,KAAK,EAAE,2BAA2B,CAAC,KAAK;QACxC,OAAO,EAAE,GAAG,EAAE;YACZ,IAAI,wBAAwB,IAAI,2BAA2B,EAAE,CAAC;gBAC5D,sEAAsE;gBACtE,uCAAuC;gBACvC,UAAU,CAAC,QAAQ,CACjB,YAAY,CAAC,OAAO,CAAC,cAAc,EAAE;oBACnC,eAAe,EAAE,2BAA2B,CAAC,sBAAsB;iBACpE,CAAC,CACH,CAAA;YACH,CAAC;iBAAM,CAAC;gBACN,UAAU,CAAC,QAAQ,CAAC,KAAK,EAAE;oBACzB,MAAM,EAAE,2CAA2C;oBACnD,MAAM,EAAE,EAAE,kBAAkB,EAAE,2BAA2B,CAAC,UAAU,EAAE;iBACvE,CAAC,CAAA;YACJ,CAAC;QACH,CAAC;KACF,CAAA;AACH,CAAC","sourcesContent":["import { StackActions, useNavigation } from '@react-navigation/native'\nimport { ConversationResource } from '../../types'\nimport { useMessageAvailableMembers } from './use_message_available_members'\n\nexport function useMessageAvailableMembersAction(conversation: ConversationResource) {\n const navigation = useNavigation()\n const isDmDisabled =\n !!conversation.disabled && conversation.disabledReason === 'direct_messages_disabled'\n const messageAvailableMembersLink = useMessageAvailableMembers(conversation, {\n enabled: isDmDisabled,\n })\n\n if (!messageAvailableMembersLink) return undefined\n\n return {\n label: messageAvailableMembersLink.label,\n onPress: () => {\n if ('existingConversationId' in messageAvailableMembersLink) {\n // replace instead of navigate/push so the disabled conversation isn't\n // left in the back stack as a dead end\n navigation.dispatch(\n StackActions.replace('Conversation', {\n conversation_id: messageAvailableMembersLink.existingConversationId,\n })\n )\n } else {\n navigation.navigate('New', {\n screen: 'ConversationSelectDirectMessageRecipients',\n params: { preselected_people: messageAvailableMembersLink.recipients },\n })\n }\n },\n }\n}\n"]}
|
|
@@ -1,72 +0,0 @@
|
|
|
1
|
-
import { resolveMessageAvailableMembersLink } from '../../hooks/direct_messages/resolve_message_available_members_link'
|
|
2
|
-
|
|
3
|
-
describe('resolveMessageAvailableMembersLink', () => {
|
|
4
|
-
const jim = { id: 1, name: 'Jim Halpert', avatar: 'jim.png' }
|
|
5
|
-
const pam = { id: 2, name: 'Pam Beesly', avatar: 'pam.png' }
|
|
6
|
-
|
|
7
|
-
it('returns undefined when there are no available members', () => {
|
|
8
|
-
const link = resolveMessageAvailableMembersLink({
|
|
9
|
-
availableMembers: [],
|
|
10
|
-
existingConversations: [],
|
|
11
|
-
canCreateDirectMessages: true,
|
|
12
|
-
})
|
|
13
|
-
|
|
14
|
-
expect(link).toBeUndefined()
|
|
15
|
-
})
|
|
16
|
-
|
|
17
|
-
it('returns undefined while the existing-conversation lookup is still loading', () => {
|
|
18
|
-
const link = resolveMessageAvailableMembersLink({
|
|
19
|
-
availableMembers: [jim],
|
|
20
|
-
existingConversations: undefined,
|
|
21
|
-
canCreateDirectMessages: true,
|
|
22
|
-
})
|
|
23
|
-
|
|
24
|
-
expect(link).toBeUndefined()
|
|
25
|
-
})
|
|
26
|
-
|
|
27
|
-
it('links to the existing conversation when one is found and not disabled', () => {
|
|
28
|
-
const link = resolveMessageAvailableMembersLink({
|
|
29
|
-
availableMembers: [jim],
|
|
30
|
-
existingConversations: [{ id: 42, disabled: false }],
|
|
31
|
-
canCreateDirectMessages: false,
|
|
32
|
-
})
|
|
33
|
-
|
|
34
|
-
expect(link).toEqual({ label: 'Message Jim', existingConversationId: 42 })
|
|
35
|
-
})
|
|
36
|
-
|
|
37
|
-
it('returns undefined when the existing conversation is itself disabled', () => {
|
|
38
|
-
const link = resolveMessageAvailableMembersLink({
|
|
39
|
-
availableMembers: [jim],
|
|
40
|
-
existingConversations: [{ id: 42, disabled: true }],
|
|
41
|
-
canCreateDirectMessages: true,
|
|
42
|
-
})
|
|
43
|
-
|
|
44
|
-
expect(link).toBeUndefined()
|
|
45
|
-
})
|
|
46
|
-
|
|
47
|
-
it('offers to start a new direct message when no conversation exists and the viewer can start one', () => {
|
|
48
|
-
const link = resolveMessageAvailableMembersLink({
|
|
49
|
-
availableMembers: [jim, pam],
|
|
50
|
-
existingConversations: [],
|
|
51
|
-
canCreateDirectMessages: true,
|
|
52
|
-
})
|
|
53
|
-
|
|
54
|
-
expect(link).toEqual({
|
|
55
|
-
label: 'Message the remaining 2 people',
|
|
56
|
-
recipients: [
|
|
57
|
-
{ id: '1', name: 'Jim Halpert', avatar: 'jim.png' },
|
|
58
|
-
{ id: '2', name: 'Pam Beesly', avatar: 'pam.png' },
|
|
59
|
-
],
|
|
60
|
-
})
|
|
61
|
-
})
|
|
62
|
-
|
|
63
|
-
it('returns undefined when no conversation exists and the viewer cannot start one', () => {
|
|
64
|
-
const link = resolveMessageAvailableMembersLink({
|
|
65
|
-
availableMembers: [jim],
|
|
66
|
-
existingConversations: [],
|
|
67
|
-
canCreateDirectMessages: false,
|
|
68
|
-
})
|
|
69
|
-
|
|
70
|
-
expect(link).toBeUndefined()
|
|
71
|
-
})
|
|
72
|
-
})
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
import { ApiCollection, ConversationResource } from '../../types'
|
|
2
|
-
import { ApiClient } from '../use_api_client'
|
|
3
|
-
|
|
4
|
-
export const getFindDirectMessageConversationRequestArgs = (participantIds: string[]) => ({
|
|
5
|
-
url: '/me/conversations',
|
|
6
|
-
data: {
|
|
7
|
-
fields: { Conversation: ['title', 'disabled'] },
|
|
8
|
-
filter: 'with_exact_direct_message_participants',
|
|
9
|
-
participant_ids: participantIds.join(','),
|
|
10
|
-
},
|
|
11
|
-
})
|
|
12
|
-
|
|
13
|
-
export const findDirectMessageConversation = (apiClient: ApiClient, participantIds: string[]) =>
|
|
14
|
-
apiClient.chat.get(getFindDirectMessageConversationRequestArgs(participantIds)) as Promise<
|
|
15
|
-
ApiCollection<ConversationResource>
|
|
16
|
-
>
|