@planningcenter/chat-react-native 3.23.0 → 3.23.1-qa-538.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (122) hide show
  1. package/build/components/display/toggle_button.d.ts +11 -4
  2. package/build/components/display/toggle_button.d.ts.map +1 -1
  3. package/build/components/display/toggle_button.js +6 -5
  4. package/build/components/display/toggle_button.js.map +1 -1
  5. package/build/components/primitive/form_sheet.d.ts +1 -1
  6. package/build/components/primitive/form_sheet.d.ts.map +1 -1
  7. package/build/components/primitive/form_sheet.js +1 -1
  8. package/build/components/primitive/form_sheet.js.map +1 -1
  9. package/build/hooks/index.d.ts +1 -0
  10. package/build/hooks/index.d.ts.map +1 -1
  11. package/build/hooks/index.js +1 -0
  12. package/build/hooks/index.js.map +1 -1
  13. package/build/hooks/use_conversation.d.ts.map +1 -1
  14. package/build/hooks/use_conversation.js +6 -1
  15. package/build/hooks/use_conversation.js.map +1 -1
  16. package/build/hooks/use_conversation_membership.d.ts +5 -0
  17. package/build/hooks/use_conversation_membership.d.ts.map +1 -0
  18. package/build/hooks/use_conversation_membership.js +54 -0
  19. package/build/hooks/use_conversation_membership.js.map +1 -0
  20. package/build/hooks/use_features.d.ts +1 -0
  21. package/build/hooks/use_features.d.ts.map +1 -1
  22. package/build/hooks/use_features.js +1 -0
  23. package/build/hooks/use_features.js.map +1 -1
  24. package/build/hooks/use_new_conversation_entry.d.ts +3 -0
  25. package/build/hooks/use_new_conversation_entry.d.ts.map +1 -0
  26. package/build/hooks/use_new_conversation_entry.js +20 -0
  27. package/build/hooks/use_new_conversation_entry.js.map +1 -0
  28. package/build/hooks/use_report_message.d.ts +6 -0
  29. package/build/hooks/use_report_message.d.ts.map +1 -0
  30. package/build/hooks/use_report_message.js +28 -0
  31. package/build/hooks/use_report_message.js.map +1 -0
  32. package/build/navigation/index.d.ts +18 -8
  33. package/build/navigation/index.d.ts.map +1 -1
  34. package/build/navigation/index.js +16 -6
  35. package/build/navigation/index.js.map +1 -1
  36. package/build/screens/conversation_details_screen.d.ts.map +1 -1
  37. package/build/screens/conversation_details_screen.js +18 -10
  38. package/build/screens/conversation_details_screen.js.map +1 -1
  39. package/build/screens/conversation_filter_recipients/conversation_filter_recipients_screen.js +5 -3
  40. package/build/screens/conversation_filter_recipients/conversation_filter_recipients_screen.js.map +1 -1
  41. package/build/screens/conversation_select_recipients/conversation_new_entry_screen.d.ts +4 -0
  42. package/build/screens/conversation_select_recipients/conversation_new_entry_screen.d.ts.map +1 -0
  43. package/build/screens/conversation_select_recipients/conversation_new_entry_screen.js +67 -0
  44. package/build/screens/conversation_select_recipients/conversation_new_entry_screen.js.map +1 -0
  45. package/build/screens/conversation_select_recipients/conversation_select_teams_i_lead_recipients_screen.d.ts.map +1 -1
  46. package/build/screens/conversation_select_recipients/conversation_select_teams_i_lead_recipients_screen.js +17 -2
  47. package/build/screens/conversation_select_recipients/conversation_select_teams_i_lead_recipients_screen.js.map +1 -1
  48. package/build/screens/conversation_select_type_screen.d.ts +11 -0
  49. package/build/screens/conversation_select_type_screen.d.ts.map +1 -0
  50. package/build/screens/conversation_select_type_screen.js +32 -0
  51. package/build/screens/conversation_select_type_screen.js.map +1 -0
  52. package/build/screens/conversations/components/list_header_component.d.ts.map +1 -1
  53. package/build/screens/conversations/components/list_header_component.js +54 -25
  54. package/build/screens/conversations/components/list_header_component.js.map +1 -1
  55. package/build/screens/index.d.ts +1 -1
  56. package/build/screens/index.d.ts.map +1 -1
  57. package/build/screens/index.js +1 -1
  58. package/build/screens/index.js.map +1 -1
  59. package/build/screens/message_actions_screen.js +14 -2
  60. package/build/screens/message_actions_screen.js.map +1 -1
  61. package/build/screens/message_report/components/message_preview.d.ts +10 -0
  62. package/build/screens/message_report/components/message_preview.d.ts.map +1 -0
  63. package/build/screens/message_report/components/message_preview.js +81 -0
  64. package/build/screens/message_report/components/message_preview.js.map +1 -0
  65. package/build/screens/message_report/components/report_reason_list.d.ts +9 -0
  66. package/build/screens/message_report/components/report_reason_list.d.ts.map +1 -0
  67. package/build/screens/message_report/components/report_reason_list.js +67 -0
  68. package/build/screens/message_report/components/report_reason_list.js.map +1 -0
  69. package/build/screens/message_report_screen.d.ts +10 -0
  70. package/build/screens/message_report_screen.d.ts.map +1 -0
  71. package/build/screens/message_report_screen.js +214 -0
  72. package/build/screens/message_report_screen.js.map +1 -0
  73. package/build/types/resources/conversation.d.ts +2 -3
  74. package/build/types/resources/conversation.d.ts.map +1 -1
  75. package/build/types/resources/conversation.js.map +1 -1
  76. package/build/types/resources/conversation_membership.d.ts +14 -0
  77. package/build/types/resources/conversation_membership.d.ts.map +1 -0
  78. package/build/types/resources/conversation_membership.js +2 -0
  79. package/build/types/resources/conversation_membership.js.map +1 -0
  80. package/build/types/resources/index.d.ts +1 -0
  81. package/build/types/resources/index.d.ts.map +1 -1
  82. package/build/types/resources/index.js +1 -0
  83. package/build/types/resources/index.js.map +1 -1
  84. package/build/types/resources/message_report.d.ts +19 -0
  85. package/build/types/resources/message_report.d.ts.map +1 -0
  86. package/build/types/resources/message_report.js +9 -0
  87. package/build/types/resources/message_report.js.map +1 -0
  88. package/build/utils/deep_snake_case_keys.d.ts +4 -0
  89. package/build/utils/deep_snake_case_keys.d.ts.map +1 -0
  90. package/build/utils/deep_snake_case_keys.js +13 -0
  91. package/build/utils/deep_snake_case_keys.js.map +1 -0
  92. package/package.json +2 -2
  93. package/src/components/display/toggle_button.tsx +27 -15
  94. package/src/components/primitive/form_sheet.tsx +4 -2
  95. package/src/hooks/index.ts +1 -0
  96. package/src/hooks/use_conversation.ts +6 -1
  97. package/src/hooks/use_conversation_membership.ts +82 -0
  98. package/src/hooks/use_features.ts +1 -0
  99. package/src/hooks/use_new_conversation_entry.ts +31 -0
  100. package/src/hooks/use_report_message.ts +37 -0
  101. package/src/navigation/index.tsx +19 -6
  102. package/src/screens/conversation_details_screen.tsx +34 -16
  103. package/src/screens/conversation_filter_recipients/conversation_filter_recipients_screen.tsx +10 -3
  104. package/src/screens/conversation_select_recipients/conversation_new_entry_screen.tsx +100 -0
  105. package/src/screens/conversation_select_recipients/conversation_select_teams_i_lead_recipients_screen.tsx +23 -3
  106. package/src/screens/conversation_select_type_screen.tsx +53 -0
  107. package/src/screens/conversations/components/list_header_component.tsx +103 -67
  108. package/src/screens/index.ts +1 -1
  109. package/src/screens/message_actions_screen.tsx +24 -2
  110. package/src/screens/message_report/components/message_preview.tsx +99 -0
  111. package/src/screens/message_report/components/report_reason_list.tsx +106 -0
  112. package/src/screens/message_report_screen.tsx +278 -0
  113. package/src/types/resources/conversation.ts +2 -3
  114. package/src/types/resources/conversation_membership.ts +15 -0
  115. package/src/types/resources/index.ts +1 -0
  116. package/src/types/resources/message_report.ts +20 -0
  117. package/src/utils/deep_snake_case_keys.ts +16 -0
  118. package/build/screens/conversation_select_recipients/conversation_select_recipients_screen.d.ts +0 -4
  119. package/build/screens/conversation_select_recipients/conversation_select_recipients_screen.d.ts.map +0 -1
  120. package/build/screens/conversation_select_recipients/conversation_select_recipients_screen.js +0 -146
  121. package/build/screens/conversation_select_recipients/conversation_select_recipients_screen.js.map +0 -1
  122. package/src/screens/conversation_select_recipients/conversation_select_recipients_screen.tsx +0 -215
@@ -1,146 +0,0 @@
1
- import { useNavigation } from '@react-navigation/native';
2
- import React from 'react';
3
- import { ScrollView, StyleSheet, View } from 'react-native';
4
- import { Button, Heading } from '../../components';
5
- import BlankState from '../../components/primitive/blank_state_primitive';
6
- import { useGroupsGroups } from '../../hooks/use_groups_groups';
7
- import { useSafeAreaInsets } from 'react-native-safe-area-context';
8
- import { ViewMoreLinkRow } from './components/view_more_link_row';
9
- import { GroupsWithoutChatDisclaimerRow } from './components/groups_without_chat_disclaimer_row';
10
- import { useServiceTypesWithTeams } from '../conversation_filter_recipients/hooks/use_service_types_with_teams';
11
- import { TeamFilterTypes } from '../conversation_filter_recipients/types';
12
- import { TeamRecipientRow } from './components/team_recipient_row';
13
- import { GroupsRecipientRow } from './components/groups_recipient_row';
14
- import { DefaultLoading } from '../../components/page/loading';
15
- import { useAppGrants } from '../../hooks';
16
- import { Haptic } from '../../utils/native_adapters';
17
- const MAX_VISIBLE_RECIPIENTS = 5;
18
- export const ConversationSelectRecipientsScreen = ({ route, }) => {
19
- const styles = useStyles();
20
- const navigation = useNavigation();
21
- const appGrants = useAppGrants();
22
- const canCreateGroupsConversations = appGrants.data?.some(g => g.createConversations && g.appName === 'Groups');
23
- const canCreateServicesConversations = appGrants.data?.some(g => g.createConversations && g.appName === 'Services');
24
- const { data: groups = [], isFetching: isGroupsFetching } = useGroupsGroups();
25
- const groupsWithCreatePermission = groups.filter(g => g.canCreateConversation);
26
- const visibleGroups = groupsWithCreatePermission.slice(0, MAX_VISIBLE_RECIPIENTS);
27
- const hasMoreGroups = groupsWithCreatePermission.length > MAX_VISIBLE_RECIPIENTS;
28
- const hasGroupsWithoutChatPermission = groups.length > groupsWithCreatePermission.length;
29
- const showGroupsDisclaimer = hasGroupsWithoutChatPermission && !hasMoreGroups;
30
- const handleGroupsNavigateToConversationNew = (group) => {
31
- navigation.navigate('New', {
32
- screen: 'ConversationNew',
33
- params: {
34
- group_id: group.id,
35
- source_app_name: 'Groups',
36
- ...route.params,
37
- },
38
- });
39
- };
40
- const handleGroupsViewMore = () => {
41
- navigation.navigate('New', {
42
- screen: 'ConversationSelectGroupRecipients',
43
- params: {
44
- ...route.params,
45
- },
46
- });
47
- };
48
- const { serviceTypes, isFetching: isServiceTypesFetching } = useServiceTypesWithTeams();
49
- const visibleServiceTypes = serviceTypes.slice(0, MAX_VISIBLE_RECIPIENTS);
50
- const hasMoreServiceTypes = serviceTypes.length > MAX_VISIBLE_RECIPIENTS;
51
- const hasServiceTypes = serviceTypes.length > 0;
52
- const handleTeamsNavigateToConversationNew = (teams) => {
53
- const teamIds = teams.map(team => team.id);
54
- navigation.navigate('New', {
55
- screen: 'ConversationNew',
56
- params: {
57
- team_ids: teamIds,
58
- source_app_name: 'Services',
59
- ...route.params,
60
- },
61
- });
62
- };
63
- const handleServiceTypesViewMore = () => {
64
- navigation.navigate('New', {
65
- screen: 'ConversationSelectTeamsILeadRecipients',
66
- params: {
67
- ...route.params,
68
- },
69
- });
70
- };
71
- return (<ScrollView contentContainerStyle={styles.contentContainer}>
72
- {canCreateGroupsConversations && (<View style={styles.section}>
73
- <View style={styles.sectionHeader}>
74
- <Heading variant="h3">My groups</Heading>
75
- </View>
76
- <View>
77
- {isGroupsFetching ? (<DefaultLoading />) : groupsWithCreatePermission.length === 0 ? (<RecipientsBlankState subtitle="Join a group with chat enabled and permissions to start a new conversation."/>) : (<>
78
- {visibleGroups.map(group => {
79
- return (<GroupsRecipientRow key={group.id} group={group} onPress={handleGroupsNavigateToConversationNew}/>);
80
- })}
81
- {hasMoreGroups && (<ViewMoreLinkRow onPress={handleGroupsViewMore} accessibilityHint="Navigate to a full list of your groups."/>)}
82
- {showGroupsDisclaimer && <GroupsWithoutChatDisclaimerRow />}
83
- </>)}
84
- </View>
85
- </View>)}
86
- {canCreateServicesConversations && (<View style={styles.section}>
87
- <View style={styles.sectionHeader}>
88
- <Heading variant="h3">Teams I lead</Heading>
89
- <Button style={styles.selectTeamsButton} onPress={() => {
90
- Haptic.impactLight();
91
- navigation.navigate('New', {
92
- screen: 'ConversationFilterRecipients',
93
- params: {
94
- source_app_name: 'Services',
95
- team_filter_type: hasServiceTypes
96
- ? TeamFilterTypes.TeamsIlead
97
- : TeamFilterTypes.All,
98
- },
99
- });
100
- }} title="Select teams" variant="outline" iconNameLeft="general.search" size="sm"/>
101
- </View>
102
- <View>
103
- {isServiceTypesFetching ? (<DefaultLoading />) : hasServiceTypes ? (<>
104
- {visibleServiceTypes.map(serviceType => {
105
- return (<TeamRecipientRow key={serviceType.id} serviceType={serviceType} onPress={handleTeamsNavigateToConversationNew}/>);
106
- })}
107
- {hasMoreServiceTypes && (<ViewMoreLinkRow onPress={handleServiceTypesViewMore} accessibilityHint="Navigate to a full list of teams you lead."/>)}
108
- </>) : (<RecipientsBlankState subtitle="You don't lead any teams."/>)}
109
- </View>
110
- </View>)}
111
- </ScrollView>);
112
- };
113
- const RecipientsBlankState = ({ subtitle }) => {
114
- const styles = useStyles();
115
- return (<BlankState.Root style={styles.blankState}>
116
- <BlankState.Imagery name="general.outlinedTextMessage"/>
117
- <BlankState.Content>
118
- <BlankState.Text>{subtitle}</BlankState.Text>
119
- </BlankState.Content>
120
- </BlankState.Root>);
121
- };
122
- const useStyles = () => {
123
- const { bottom } = useSafeAreaInsets();
124
- return StyleSheet.create({
125
- contentContainer: {
126
- gap: 24,
127
- paddingTop: 16,
128
- paddingBottom: 16 + bottom,
129
- },
130
- section: {
131
- flex: 1,
132
- },
133
- sectionHeader: {
134
- flexDirection: 'row',
135
- justifyContent: 'space-between',
136
- paddingHorizontal: 16,
137
- paddingBottom: 4,
138
- },
139
- selectTeamsButton: {},
140
- blankState: {
141
- marginTop: 24,
142
- marginBottom: 48,
143
- },
144
- });
145
- };
146
- //# sourceMappingURL=conversation_select_recipients_screen.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"conversation_select_recipients_screen.js","sourceRoot":"","sources":["../../../src/screens/conversation_select_recipients/conversation_select_recipients_screen.tsx"],"names":[],"mappings":"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","sourcesContent":["import { useNavigation } from '@react-navigation/native'\nimport React from 'react'\nimport { ScrollView, StyleSheet, View } from 'react-native'\nimport { Button, Heading } from '../../components'\nimport BlankState from '../../components/primitive/blank_state_primitive'\nimport { GroupsGroupResource } from '../../types'\nimport { useGroupsGroups } from '../../hooks/use_groups_groups'\nimport { useSafeAreaInsets } from 'react-native-safe-area-context'\nimport { ConversationSelectRecipientsScreenProps } from './types/screen_props'\nimport { ViewMoreLinkRow } from './components/view_more_link_row'\nimport { GroupsWithoutChatDisclaimerRow } from './components/groups_without_chat_disclaimer_row'\nimport { useServiceTypesWithTeams } from '../conversation_filter_recipients/hooks/use_service_types_with_teams'\nimport { ServiceTypeWithTeams, TeamFilterTypes } from '../conversation_filter_recipients/types'\nimport { TeamRecipientRow } from './components/team_recipient_row'\nimport { GroupsRecipientRow } from './components/groups_recipient_row'\nimport { DefaultLoading } from '../../components/page/loading'\nimport { useAppGrants } from '../../hooks'\nimport { Haptic } from '../../utils/native_adapters'\n\nconst MAX_VISIBLE_RECIPIENTS = 5\n\nexport const ConversationSelectRecipientsScreen = ({\n route,\n}: ConversationSelectRecipientsScreenProps) => {\n const styles = useStyles()\n const navigation = useNavigation()\n const appGrants = useAppGrants()\n const canCreateGroupsConversations = appGrants.data?.some(\n g => g.createConversations && g.appName === 'Groups'\n )\n const canCreateServicesConversations = appGrants.data?.some(\n g => g.createConversations && g.appName === 'Services'\n )\n const { data: groups = [], isFetching: isGroupsFetching } = useGroupsGroups()\n const groupsWithCreatePermission = groups.filter(g => g.canCreateConversation)\n const visibleGroups = groupsWithCreatePermission.slice(0, MAX_VISIBLE_RECIPIENTS)\n const hasMoreGroups = groupsWithCreatePermission.length > MAX_VISIBLE_RECIPIENTS\n const hasGroupsWithoutChatPermission = groups.length > groupsWithCreatePermission.length\n const showGroupsDisclaimer = hasGroupsWithoutChatPermission && !hasMoreGroups\n\n const handleGroupsNavigateToConversationNew = (group: GroupsGroupResource) => {\n navigation.navigate('New', {\n screen: 'ConversationNew',\n params: {\n group_id: group.id,\n source_app_name: 'Groups',\n ...route.params,\n },\n })\n }\n\n const handleGroupsViewMore = () => {\n navigation.navigate('New', {\n screen: 'ConversationSelectGroupRecipients',\n params: {\n ...route.params,\n },\n })\n }\n\n const { serviceTypes, isFetching: isServiceTypesFetching } = useServiceTypesWithTeams()\n const visibleServiceTypes = serviceTypes.slice(0, MAX_VISIBLE_RECIPIENTS)\n const hasMoreServiceTypes = serviceTypes.length > MAX_VISIBLE_RECIPIENTS\n const hasServiceTypes = serviceTypes.length > 0\n\n const handleTeamsNavigateToConversationNew = (teams: ServiceTypeWithTeams['teams']) => {\n const teamIds = teams.map(team => team.id)\n\n navigation.navigate('New', {\n screen: 'ConversationNew',\n params: {\n team_ids: teamIds,\n source_app_name: 'Services',\n ...route.params,\n },\n })\n }\n\n const handleServiceTypesViewMore = () => {\n navigation.navigate('New', {\n screen: 'ConversationSelectTeamsILeadRecipients',\n params: {\n ...route.params,\n },\n })\n }\n\n return (\n <ScrollView contentContainerStyle={styles.contentContainer}>\n {canCreateGroupsConversations && (\n <View style={styles.section}>\n <View style={styles.sectionHeader}>\n <Heading variant=\"h3\">My groups</Heading>\n </View>\n <View>\n {isGroupsFetching ? (\n <DefaultLoading />\n ) : groupsWithCreatePermission.length === 0 ? (\n <RecipientsBlankState subtitle=\"Join a group with chat enabled and permissions to start a new conversation.\" />\n ) : (\n <>\n {visibleGroups.map(group => {\n return (\n <GroupsRecipientRow\n key={group.id}\n group={group}\n onPress={handleGroupsNavigateToConversationNew}\n />\n )\n })}\n {hasMoreGroups && (\n <ViewMoreLinkRow\n onPress={handleGroupsViewMore}\n accessibilityHint=\"Navigate to a full list of your groups.\"\n />\n )}\n {showGroupsDisclaimer && <GroupsWithoutChatDisclaimerRow />}\n </>\n )}\n </View>\n </View>\n )}\n {canCreateServicesConversations && (\n <View style={styles.section}>\n <View style={styles.sectionHeader}>\n <Heading variant=\"h3\">Teams I lead</Heading>\n <Button\n style={styles.selectTeamsButton}\n onPress={() => {\n Haptic.impactLight()\n navigation.navigate('New', {\n screen: 'ConversationFilterRecipients',\n params: {\n source_app_name: 'Services',\n team_filter_type: hasServiceTypes\n ? TeamFilterTypes.TeamsIlead\n : TeamFilterTypes.All,\n },\n })\n }}\n title=\"Select teams\"\n variant=\"outline\"\n iconNameLeft=\"general.search\"\n size=\"sm\"\n />\n </View>\n <View>\n {isServiceTypesFetching ? (\n <DefaultLoading />\n ) : hasServiceTypes ? (\n <>\n {visibleServiceTypes.map(serviceType => {\n return (\n <TeamRecipientRow\n key={serviceType.id}\n serviceType={serviceType}\n onPress={handleTeamsNavigateToConversationNew}\n />\n )\n })}\n {hasMoreServiceTypes && (\n <ViewMoreLinkRow\n onPress={handleServiceTypesViewMore}\n accessibilityHint=\"Navigate to a full list of teams you lead.\"\n />\n )}\n </>\n ) : (\n <RecipientsBlankState subtitle=\"You don't lead any teams.\" />\n )}\n </View>\n </View>\n )}\n </ScrollView>\n )\n}\n\nconst RecipientsBlankState = ({ subtitle }: { subtitle: string }) => {\n const styles = useStyles()\n\n return (\n <BlankState.Root style={styles.blankState}>\n <BlankState.Imagery name=\"general.outlinedTextMessage\" />\n <BlankState.Content>\n <BlankState.Text>{subtitle}</BlankState.Text>\n </BlankState.Content>\n </BlankState.Root>\n )\n}\n\nconst useStyles = () => {\n const { bottom } = useSafeAreaInsets()\n\n return StyleSheet.create({\n contentContainer: {\n gap: 24,\n paddingTop: 16,\n paddingBottom: 16 + bottom,\n },\n section: {\n flex: 1,\n },\n sectionHeader: {\n flexDirection: 'row',\n justifyContent: 'space-between',\n paddingHorizontal: 16,\n paddingBottom: 4,\n },\n selectTeamsButton: {},\n blankState: {\n marginTop: 24,\n marginBottom: 48,\n },\n })\n}\n"]}
@@ -1,215 +0,0 @@
1
- import { useNavigation } from '@react-navigation/native'
2
- import React from 'react'
3
- import { ScrollView, StyleSheet, View } from 'react-native'
4
- import { Button, Heading } from '../../components'
5
- import BlankState from '../../components/primitive/blank_state_primitive'
6
- import { GroupsGroupResource } from '../../types'
7
- import { useGroupsGroups } from '../../hooks/use_groups_groups'
8
- import { useSafeAreaInsets } from 'react-native-safe-area-context'
9
- import { ConversationSelectRecipientsScreenProps } from './types/screen_props'
10
- import { ViewMoreLinkRow } from './components/view_more_link_row'
11
- import { GroupsWithoutChatDisclaimerRow } from './components/groups_without_chat_disclaimer_row'
12
- import { useServiceTypesWithTeams } from '../conversation_filter_recipients/hooks/use_service_types_with_teams'
13
- import { ServiceTypeWithTeams, TeamFilterTypes } from '../conversation_filter_recipients/types'
14
- import { TeamRecipientRow } from './components/team_recipient_row'
15
- import { GroupsRecipientRow } from './components/groups_recipient_row'
16
- import { DefaultLoading } from '../../components/page/loading'
17
- import { useAppGrants } from '../../hooks'
18
- import { Haptic } from '../../utils/native_adapters'
19
-
20
- const MAX_VISIBLE_RECIPIENTS = 5
21
-
22
- export const ConversationSelectRecipientsScreen = ({
23
- route,
24
- }: ConversationSelectRecipientsScreenProps) => {
25
- const styles = useStyles()
26
- const navigation = useNavigation()
27
- const appGrants = useAppGrants()
28
- const canCreateGroupsConversations = appGrants.data?.some(
29
- g => g.createConversations && g.appName === 'Groups'
30
- )
31
- const canCreateServicesConversations = appGrants.data?.some(
32
- g => g.createConversations && g.appName === 'Services'
33
- )
34
- const { data: groups = [], isFetching: isGroupsFetching } = useGroupsGroups()
35
- const groupsWithCreatePermission = groups.filter(g => g.canCreateConversation)
36
- const visibleGroups = groupsWithCreatePermission.slice(0, MAX_VISIBLE_RECIPIENTS)
37
- const hasMoreGroups = groupsWithCreatePermission.length > MAX_VISIBLE_RECIPIENTS
38
- const hasGroupsWithoutChatPermission = groups.length > groupsWithCreatePermission.length
39
- const showGroupsDisclaimer = hasGroupsWithoutChatPermission && !hasMoreGroups
40
-
41
- const handleGroupsNavigateToConversationNew = (group: GroupsGroupResource) => {
42
- navigation.navigate('New', {
43
- screen: 'ConversationNew',
44
- params: {
45
- group_id: group.id,
46
- source_app_name: 'Groups',
47
- ...route.params,
48
- },
49
- })
50
- }
51
-
52
- const handleGroupsViewMore = () => {
53
- navigation.navigate('New', {
54
- screen: 'ConversationSelectGroupRecipients',
55
- params: {
56
- ...route.params,
57
- },
58
- })
59
- }
60
-
61
- const { serviceTypes, isFetching: isServiceTypesFetching } = useServiceTypesWithTeams()
62
- const visibleServiceTypes = serviceTypes.slice(0, MAX_VISIBLE_RECIPIENTS)
63
- const hasMoreServiceTypes = serviceTypes.length > MAX_VISIBLE_RECIPIENTS
64
- const hasServiceTypes = serviceTypes.length > 0
65
-
66
- const handleTeamsNavigateToConversationNew = (teams: ServiceTypeWithTeams['teams']) => {
67
- const teamIds = teams.map(team => team.id)
68
-
69
- navigation.navigate('New', {
70
- screen: 'ConversationNew',
71
- params: {
72
- team_ids: teamIds,
73
- source_app_name: 'Services',
74
- ...route.params,
75
- },
76
- })
77
- }
78
-
79
- const handleServiceTypesViewMore = () => {
80
- navigation.navigate('New', {
81
- screen: 'ConversationSelectTeamsILeadRecipients',
82
- params: {
83
- ...route.params,
84
- },
85
- })
86
- }
87
-
88
- return (
89
- <ScrollView contentContainerStyle={styles.contentContainer}>
90
- {canCreateGroupsConversations && (
91
- <View style={styles.section}>
92
- <View style={styles.sectionHeader}>
93
- <Heading variant="h3">My groups</Heading>
94
- </View>
95
- <View>
96
- {isGroupsFetching ? (
97
- <DefaultLoading />
98
- ) : groupsWithCreatePermission.length === 0 ? (
99
- <RecipientsBlankState subtitle="Join a group with chat enabled and permissions to start a new conversation." />
100
- ) : (
101
- <>
102
- {visibleGroups.map(group => {
103
- return (
104
- <GroupsRecipientRow
105
- key={group.id}
106
- group={group}
107
- onPress={handleGroupsNavigateToConversationNew}
108
- />
109
- )
110
- })}
111
- {hasMoreGroups && (
112
- <ViewMoreLinkRow
113
- onPress={handleGroupsViewMore}
114
- accessibilityHint="Navigate to a full list of your groups."
115
- />
116
- )}
117
- {showGroupsDisclaimer && <GroupsWithoutChatDisclaimerRow />}
118
- </>
119
- )}
120
- </View>
121
- </View>
122
- )}
123
- {canCreateServicesConversations && (
124
- <View style={styles.section}>
125
- <View style={styles.sectionHeader}>
126
- <Heading variant="h3">Teams I lead</Heading>
127
- <Button
128
- style={styles.selectTeamsButton}
129
- onPress={() => {
130
- Haptic.impactLight()
131
- navigation.navigate('New', {
132
- screen: 'ConversationFilterRecipients',
133
- params: {
134
- source_app_name: 'Services',
135
- team_filter_type: hasServiceTypes
136
- ? TeamFilterTypes.TeamsIlead
137
- : TeamFilterTypes.All,
138
- },
139
- })
140
- }}
141
- title="Select teams"
142
- variant="outline"
143
- iconNameLeft="general.search"
144
- size="sm"
145
- />
146
- </View>
147
- <View>
148
- {isServiceTypesFetching ? (
149
- <DefaultLoading />
150
- ) : hasServiceTypes ? (
151
- <>
152
- {visibleServiceTypes.map(serviceType => {
153
- return (
154
- <TeamRecipientRow
155
- key={serviceType.id}
156
- serviceType={serviceType}
157
- onPress={handleTeamsNavigateToConversationNew}
158
- />
159
- )
160
- })}
161
- {hasMoreServiceTypes && (
162
- <ViewMoreLinkRow
163
- onPress={handleServiceTypesViewMore}
164
- accessibilityHint="Navigate to a full list of teams you lead."
165
- />
166
- )}
167
- </>
168
- ) : (
169
- <RecipientsBlankState subtitle="You don't lead any teams." />
170
- )}
171
- </View>
172
- </View>
173
- )}
174
- </ScrollView>
175
- )
176
- }
177
-
178
- const RecipientsBlankState = ({ subtitle }: { subtitle: string }) => {
179
- const styles = useStyles()
180
-
181
- return (
182
- <BlankState.Root style={styles.blankState}>
183
- <BlankState.Imagery name="general.outlinedTextMessage" />
184
- <BlankState.Content>
185
- <BlankState.Text>{subtitle}</BlankState.Text>
186
- </BlankState.Content>
187
- </BlankState.Root>
188
- )
189
- }
190
-
191
- const useStyles = () => {
192
- const { bottom } = useSafeAreaInsets()
193
-
194
- return StyleSheet.create({
195
- contentContainer: {
196
- gap: 24,
197
- paddingTop: 16,
198
- paddingBottom: 16 + bottom,
199
- },
200
- section: {
201
- flex: 1,
202
- },
203
- sectionHeader: {
204
- flexDirection: 'row',
205
- justifyContent: 'space-between',
206
- paddingHorizontal: 16,
207
- paddingBottom: 4,
208
- },
209
- selectTeamsButton: {},
210
- blankState: {
211
- marginTop: 24,
212
- marginBottom: 48,
213
- },
214
- })
215
- }