@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.
Files changed (80) hide show
  1. package/build/components/conversation/messages_disabled_banners.d.ts +1 -5
  2. package/build/components/conversation/messages_disabled_banners.d.ts.map +1 -1
  3. package/build/components/conversation/messages_disabled_banners.js +4 -8
  4. package/build/components/conversation/messages_disabled_banners.js.map +1 -1
  5. package/build/hooks/direct_messages/use_find_or_create_direct_message_conversation.d.ts.map +1 -1
  6. package/build/hooks/direct_messages/use_find_or_create_direct_message_conversation.js +8 -1
  7. package/build/hooks/direct_messages/use_find_or_create_direct_message_conversation.js.map +1 -1
  8. package/build/hooks/use_conversation.d.ts.map +1 -1
  9. package/build/hooks/use_conversation.js +0 -1
  10. package/build/hooks/use_conversation.js.map +1 -1
  11. package/build/hooks/use_conversation_jolt_events.d.ts.map +1 -1
  12. package/build/hooks/use_conversation_jolt_events.js +9 -1
  13. package/build/hooks/use_conversation_jolt_events.js.map +1 -1
  14. package/build/hooks/use_conversation_messages.d.ts +1 -0
  15. package/build/hooks/use_conversation_messages.d.ts.map +1 -1
  16. package/build/hooks/use_conversation_messages.js +2 -2
  17. package/build/hooks/use_conversation_messages.js.map +1 -1
  18. package/build/hooks/use_conversations_actions.d.ts.map +1 -1
  19. package/build/hooks/use_conversations_actions.js +12 -1
  20. package/build/hooks/use_conversations_actions.js.map +1 -1
  21. package/build/screens/conversation_screen.d.ts.map +1 -1
  22. package/build/screens/conversation_screen.js +3 -5
  23. package/build/screens/conversation_screen.js.map +1 -1
  24. package/build/screens/conversation_select_recipients/conversation_select_direct_message_recipients_screen.d.ts +1 -1
  25. package/build/screens/conversation_select_recipients/conversation_select_direct_message_recipients_screen.d.ts.map +1 -1
  26. package/build/screens/conversation_select_recipients/conversation_select_direct_message_recipients_screen.js +2 -13
  27. package/build/screens/conversation_select_recipients/conversation_select_direct_message_recipients_screen.js.map +1 -1
  28. package/build/screens/conversation_select_recipients/types/screen_props.d.ts +0 -2
  29. package/build/screens/conversation_select_recipients/types/screen_props.d.ts.map +1 -1
  30. package/build/screens/conversation_select_recipients/types/screen_props.js.map +1 -1
  31. package/build/screens/conversations/components/list_header_component.js +1 -1
  32. package/build/screens/conversations/components/list_header_component.js.map +1 -1
  33. package/build/types/jolt_events/reaction_events.d.ts +1 -0
  34. package/build/types/jolt_events/reaction_events.d.ts.map +1 -1
  35. package/build/types/jolt_events/reaction_events.js.map +1 -1
  36. package/build/types/resources/direct_message_candidate.d.ts +0 -1
  37. package/build/types/resources/direct_message_candidate.d.ts.map +1 -1
  38. package/build/types/resources/direct_message_candidate.js.map +1 -1
  39. package/build/types/resources/member.d.ts +0 -1
  40. package/build/types/resources/member.d.ts.map +1 -1
  41. package/build/types/resources/member.js.map +1 -1
  42. package/build/types/resources/member_ability.d.ts +0 -1
  43. package/build/types/resources/member_ability.d.ts.map +1 -1
  44. package/build/types/resources/member_ability.js.map +1 -1
  45. package/package.json +3 -3
  46. package/src/components/conversation/messages_disabled_banners.tsx +4 -31
  47. package/src/hooks/direct_messages/use_find_or_create_direct_message_conversation.ts +11 -2
  48. package/src/hooks/use_conversation.ts +0 -1
  49. package/src/hooks/use_conversation_jolt_events.ts +6 -1
  50. package/src/hooks/use_conversation_messages.ts +6 -5
  51. package/src/hooks/use_conversations_actions.ts +13 -1
  52. package/src/screens/conversation_screen.tsx +5 -11
  53. package/src/screens/conversation_select_recipients/conversation_select_direct_message_recipients_screen.tsx +4 -18
  54. package/src/screens/conversation_select_recipients/types/screen_props.tsx +0 -2
  55. package/src/screens/conversations/components/list_header_component.tsx +6 -6
  56. package/src/types/jolt_events/reaction_events.ts +1 -0
  57. package/src/types/resources/direct_message_candidate.ts +0 -5
  58. package/src/types/resources/member.ts +0 -1
  59. package/src/types/resources/member_ability.ts +0 -1
  60. package/build/hooks/direct_messages/find_direct_message_conversation.d.ts +0 -14
  61. package/build/hooks/direct_messages/find_direct_message_conversation.d.ts.map +0 -1
  62. package/build/hooks/direct_messages/find_direct_message_conversation.js +0 -10
  63. package/build/hooks/direct_messages/find_direct_message_conversation.js.map +0 -1
  64. package/build/hooks/direct_messages/resolve_message_available_members_link.d.ts +0 -16
  65. package/build/hooks/direct_messages/resolve_message_available_members_link.d.ts.map +0 -1
  66. package/build/hooks/direct_messages/resolve_message_available_members_link.js +0 -24
  67. package/build/hooks/direct_messages/resolve_message_available_members_link.js.map +0 -1
  68. package/build/hooks/direct_messages/use_message_available_members.d.ts +0 -6
  69. package/build/hooks/direct_messages/use_message_available_members.d.ts.map +0 -1
  70. package/build/hooks/direct_messages/use_message_available_members.js +0 -40
  71. package/build/hooks/direct_messages/use_message_available_members.js.map +0 -1
  72. package/build/hooks/direct_messages/use_message_available_members_action.d.ts +0 -6
  73. package/build/hooks/direct_messages/use_message_available_members_action.d.ts.map +0 -1
  74. package/build/hooks/direct_messages/use_message_available_members_action.js +0 -30
  75. package/build/hooks/direct_messages/use_message_available_members_action.js.map +0 -1
  76. package/src/__tests__/hooks/resolve_message_available_members_link.test.ts +0 -72
  77. package/src/hooks/direct_messages/find_direct_message_conversation.ts +0 -16
  78. package/src/hooks/direct_messages/resolve_message_available_members_link.ts +0 -42
  79. package/src/hooks/direct_messages/use_message_available_members.ts +0 -65
  80. 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 { Button, Text } from '../display'
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
- import { findDirectMessageConversation } from './find_direct_message_conversation'
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({
@@ -47,7 +47,6 @@ export const getConversationRequestArgs = ({ conversation_id }: { conversation_i
47
47
  'leader',
48
48
  'can_reply',
49
49
  'can_delete_non_authored_messages',
50
- 'can_create_direct_messages',
51
50
  ],
52
51
  ConversationMembership: [
53
52
  'last_read_message_sort_key',
@@ -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.invalidateQueries({ queryKey })
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 } = useSuspensePaginator<MessageResource>(
11
- getMessagesRequestArgs({ conversation_id, reply_root_id }),
12
- opts
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
- <ConversationStartBanner conversation={conversation} hasMessages={true} />
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
- route,
22
- }: ConversationSelectRecipientsScreenProps) {
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>
@@ -6,6 +6,7 @@ interface BaseReactionEventData extends Record<string, unknown> {
6
6
  author_id: number
7
7
  conversation_id: number
8
8
  message_sort_key: string
9
+ message_author_id: number
9
10
  reply_root_id?: string | null
10
11
  created_at: string
11
12
  organization_id: number
@@ -10,8 +10,3 @@ export interface DirectMessageCandidateResource extends ResourceObject {
10
10
  under_18: boolean
11
11
  directMessagesDisabled: boolean
12
12
  }
13
-
14
- export type PreselectedDirectMessagePerson = Pick<
15
- DirectMessageCandidateResource,
16
- 'id' | 'name' | 'avatar'
17
- >
@@ -5,7 +5,6 @@ export interface MemberResource {
5
5
  avatar: string
6
6
  badges: MemberBadge[]
7
7
  child: boolean
8
- directMessagesDisabled?: boolean
9
8
  gender: string | null
10
9
  role?: string
11
10
  }
@@ -5,5 +5,4 @@ export interface MemberAbilityResource {
5
5
  canDeleteNonAuthoredMessages: boolean
6
6
  leader: boolean
7
7
  canReply: boolean
8
- canCreateDirectMessages: boolean
9
8
  }
@@ -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
- >