@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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"message_report_screen.js","sourceRoot":"","sources":["../../src/screens/message_report_screen.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, { useCallback, useLayoutEffect, useMemo, useState } from 'react'\nimport { View, StyleSheet, TextInput, ScrollView } from 'react-native'\nimport type {\n NativeStackNavigationOptions,\n NativeStackScreenProps,\n} from '@react-navigation/native-stack'\nimport { StaticScreenProps, useNavigation, StackActions } from '@react-navigation/native'\nimport { Spinner, Text, KeyboardView } from '../components'\nimport BlankState from '../components/primitive/blank_state_primitive'\nimport { useTheme } from '../hooks'\nimport { useReportMessage } from '../hooks/use_report_message'\nimport {\n HeaderDismissButton,\n HeaderTextButton,\n} from '../components/display/platform_modal_header_buttons'\nimport { useSafeAreaInsets } from 'react-native-safe-area-context'\nimport { useConversationMessages } from '../hooks/use_conversation_messages'\nimport { MessageResource } from '../types'\nimport { MessageReportReason } from '../types/resources/message_report'\nimport { MessagePreview } from './message_report/components/message_preview'\nimport { ReportReasonList } from './message_report/components/report_reason_list'\nimport { platformFontWeightBold } from '../utils'\n\nconst MAX_DETAIL_LENGTH = 500\n\nexport const MessageReportScreenOptions = ({\n navigation,\n}: NativeStackScreenProps<any>): NativeStackNavigationOptions => ({\n presentation: 'modal',\n title: 'Report message',\n headerLeft: () => <HeaderDismissButton title=\"Cancel\" onPress={() => navigation.goBack()} />,\n})\n\nexport type MessageReportScreenProps = StaticScreenProps<{\n conversation_id: number\n message_id: string\n}>\n\nexport function MessageReportScreen({ route }: MessageReportScreenProps) {\n const { conversation_id, message_id } = route.params\n\n const { messages } = useConversationMessages({ conversation_id }, { refetchOnMount: false })\n const message = messages.find(m => m.id === message_id)\n\n if (!message) return null\n\n return <MessageReportScreenContent message={message} conversation_id={conversation_id} />\n}\n\nfunction MessageReportScreenContent({\n message,\n conversation_id,\n}: {\n message: MessageResource\n conversation_id: number\n}) {\n const styles = useStyles()\n const navigation = useNavigation()\n const [selectedReason, setSelectedReason] = useState<MessageReportReason | null>(null)\n const [reasonDetail, setReasonDetail] = useState('')\n const { mutate: submitReport, status } = useReportMessage(conversation_id, message.id)\n\n const handleReasonChange = useCallback((reason: MessageReportReason) => {\n setSelectedReason(reason)\n\n if (reason !== 'other') {\n setReasonDetail('')\n }\n }, [])\n\n const isFormValid = useMemo(() => {\n if (selectedReason === null) return false\n\n if (selectedReason === 'other' && reasonDetail.trim().length === 0) {\n return false\n }\n\n if (status === 'pending') return false\n\n return true\n }, [selectedReason, reasonDetail, status])\n\n const handleSubmit = useCallback(() => {\n if (!isFormValid || !selectedReason) return\n\n submitReport({\n reason: selectedReason,\n reasonDetail: selectedReason === 'other' ? reasonDetail : undefined,\n })\n }, [isFormValid, selectedReason, reasonDetail, submitReport])\n\n const handleClose = useCallback(() => {\n navigation.dispatch(StackActions.popTo('Conversation', { conversation_id }))\n }, [navigation, conversation_id])\n\n const HeaderRight = useCallback(\n () => <HeaderTextButton title=\"Submit\" onPress={handleSubmit} disabled={!isFormValid} />,\n [handleSubmit, isFormValid]\n )\n\n useLayoutEffect(() => {\n if (status === 'pending' || status === 'success') {\n navigation.setOptions({\n headerRight: () => null,\n })\n } else {\n navigation.setOptions({\n headerTitle: 'Report message',\n headerRight: HeaderRight,\n })\n }\n }, [HeaderRight, navigation, status])\n\n if (status === 'pending') {\n return (\n <View style={styles.fullScreenContainer}>\n <Spinner />\n <Text style={styles.loadingText}>Submitting report...</Text>\n </View>\n )\n }\n\n if (status === 'success') {\n return (\n <View style={styles.fullScreenContainer}>\n <BlankState.Root>\n <BlankState.Imagery name=\"general.checkCircle\" style={styles.successIcon} />\n <BlankState.Content>\n <BlankState.Heading style={styles.successTitle}>Message reported</BlankState.Heading>\n <BlankState.Text style={styles.successSubtitle}>\n The message has been reported and a church leader will be contacted.\n </BlankState.Text>\n </BlankState.Content>\n <BlankState.Button title=\"Close\" onPress={handleClose} size=\"lg\" variant=\"fill\" />\n </BlankState.Root>\n </View>\n )\n }\n\n if (status === 'error') {\n return (\n <BlankState.Root>\n <BlankState.Imagery name=\"general.exclamationTriangle\" />\n <BlankState.Content>\n <BlankState.Heading>Unable to submit report</BlankState.Heading>\n <BlankState.Text>\n We were unable to report this message. Please try again.\n </BlankState.Text>\n </BlankState.Content>\n <BlankState.Button title=\"Close\" onPress={handleClose} size=\"lg\" variant=\"outline\" />\n </BlankState.Root>\n )\n }\n\n return (\n <KeyboardView>\n <ScrollView contentContainerStyle={styles.container}>\n <Text style={styles.warningText}>\n Reporting this message will notify a church leader. The person you are reporting will not\n receive a notification from Church Center. If someone is in immediate danger, call local\n emergency services. Don&apos;t wait.\n </Text>\n\n <MessagePreview message={message} />\n\n <View style={styles.reasonSection}>\n <Text style={styles.fieldLabel}>\n What best describes the problem? <Text style={styles.required}>*</Text>\n </Text>\n\n <View style={styles.reasonListContainer}>\n <ReportReasonList selectedReason={selectedReason} onReasonChange={handleReasonChange} />\n </View>\n </View>\n\n {selectedReason === 'other' && (\n <View style={styles.detailSection}>\n <Text style={styles.fieldLabel}>\n Please provide more details <Text style={styles.required}>*</Text>\n </Text>\n <TextInput\n style={styles.textInput}\n multiline\n placeholder=\"Describe the issue...\"\n value={reasonDetail}\n onChangeText={setReasonDetail}\n maxLength={MAX_DETAIL_LENGTH}\n accessibilityLabel=\"Additional details\"\n accessibilityHint=\"Provide more information about why you're reporting this message\"\n />\n {reasonDetail.length >= MAX_DETAIL_LENGTH - 100 && (\n <Text variant=\"footnote\">\n {reasonDetail.length}/{MAX_DETAIL_LENGTH}\n </Text>\n )}\n </View>\n )}\n </ScrollView>\n </KeyboardView>\n )\n}\n\nconst useStyles = () => {\n const { bottom } = useSafeAreaInsets()\n const { colors } = useTheme()\n\n return StyleSheet.create({\n container: {\n padding: 16,\n paddingBottom: 16 + bottom,\n gap: 24,\n },\n fullHeight: {\n flex: 1,\n justifyContent: 'center',\n alignItems: 'center',\n },\n fullScreenContainer: {\n flex: 1,\n justifyContent: 'center',\n alignItems: 'center',\n backgroundColor: colors.surfaceColor100,\n },\n loadingText: {\n marginTop: 16,\n fontSize: 16,\n fontWeight: '600',\n color: colors.textColorDefaultPrimary,\n },\n warningText: {\n fontSize: 14,\n lineHeight: 20,\n color: colors.textColorDefaultSecondary,\n },\n reasonSection: {\n gap: 8,\n },\n fieldLabel: {\n fontSize: 16,\n fontWeight: platformFontWeightBold,\n color: colors.textColorDefaultPrimary,\n },\n required: {\n color: colors.statusErrorText,\n },\n reasonListContainer: {\n backgroundColor: colors.surfaceColor100,\n },\n detailSection: {\n gap: 8,\n },\n textInput: {\n color: colors.textColorDefaultPrimary,\n fontSize: 16,\n textAlignVertical: 'top',\n minHeight: 120,\n maxHeight: 200,\n borderWidth: 1,\n borderColor: colors.borderColorDefaultBase,\n borderRadius: 8,\n paddingHorizontal: 16,\n paddingVertical: 12,\n backgroundColor: colors.surfaceColor100,\n },\n successIcon: {\n color: colors.statusSuccessIcon,\n fontSize: 48,\n },\n successTitle: {\n fontSize: 24,\n marginBottom: 4,\n },\n successSubtitle: {\n fontSize: 16,\n marginBottom: 4,\n },\n })\n}\n"]}
@@ -1,5 +1,6 @@
1
1
  import type { AnalyticsMetadataResource } from './analytics_metadata';
2
2
  import { ConversationBadgeResource } from './conversation_badge';
3
+ import { ConversationMembershipResource } from './conversation_membership';
3
4
  import { GroupResource } from './group_resource';
4
5
  import { MemberAbilityResource } from './member_ability';
5
6
  export interface ConversationResource {
@@ -7,9 +8,7 @@ export interface ConversationResource {
7
8
  id: number;
8
9
  badges?: ConversationBadgeResource[];
9
10
  analyticsMetadata?: AnalyticsMetadataResource;
10
- conversationMembership?: {
11
- lastReadMessageSortKey: string;
12
- };
11
+ conversationMembership?: ConversationMembershipResource;
13
12
  createdAt: string;
14
13
  deleted?: boolean;
15
14
  groups?: GroupResource[];
@@ -1 +1 @@
1
- {"version":3,"file":"conversation.d.ts","sourceRoot":"","sources":["../../../src/types/resources/conversation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,sBAAsB,CAAA;AACrE,OAAO,EAAE,yBAAyB,EAAE,MAAM,sBAAsB,CAAA;AAChE,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAChD,OAAO,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAA;AAExD,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,cAAc,CAAA;IACpB,EAAE,EAAE,MAAM,CAAA;IACV,MAAM,CAAC,EAAE,yBAAyB,EAAE,CAAA;IACpC,iBAAiB,CAAC,EAAE,yBAAyB,CAAA;IAC7C,sBAAsB,CAAC,EAAE;QACvB,sBAAsB,EAAE,MAAM,CAAA;KAC/B,CAAA;IACD,SAAS,EAAE,MAAM,CAAA;IACjB,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,MAAM,CAAC,EAAE,aAAa,EAAE,CAAA;IACxB,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAA;IAC5B,mBAAmB,CAAC,EAAE,MAAM,CAAA;IAC5B,qBAAqB,CAAC,EAAE,MAAM,CAAA;IAC9B,oBAAoB,CAAC,EAAE,MAAM,CAAA;IAC7B,sBAAsB,CAAC,EAAE,MAAM,CAAA;IAC/B,wBAAwB,CAAC,EAAE,MAAM,CAAA;IACjC,aAAa,CAAC,EAAE,qBAAqB,CAAA;IACrC,KAAK,EAAE,OAAO,CAAA;IACd,eAAe,EAAE,OAAO,CAAA;IACxB,KAAK,EAAE,MAAM,CAAA;IACb,WAAW,EAAE,MAAM,CAAA;IACnB,mBAAmB,CAAC,EAAE,MAAM,CAAA;IAC5B,SAAS,EAAE,MAAM,CAAA;CAClB"}
1
+ {"version":3,"file":"conversation.d.ts","sourceRoot":"","sources":["../../../src/types/resources/conversation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,sBAAsB,CAAA;AACrE,OAAO,EAAE,yBAAyB,EAAE,MAAM,sBAAsB,CAAA;AAChE,OAAO,EAAE,8BAA8B,EAAE,MAAM,2BAA2B,CAAA;AAC1E,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAChD,OAAO,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAA;AAExD,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,cAAc,CAAA;IACpB,EAAE,EAAE,MAAM,CAAA;IACV,MAAM,CAAC,EAAE,yBAAyB,EAAE,CAAA;IACpC,iBAAiB,CAAC,EAAE,yBAAyB,CAAA;IAC7C,sBAAsB,CAAC,EAAE,8BAA8B,CAAA;IACvD,SAAS,EAAE,MAAM,CAAA;IACjB,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,MAAM,CAAC,EAAE,aAAa,EAAE,CAAA;IACxB,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAA;IAC5B,mBAAmB,CAAC,EAAE,MAAM,CAAA;IAC5B,qBAAqB,CAAC,EAAE,MAAM,CAAA;IAC9B,oBAAoB,CAAC,EAAE,MAAM,CAAA;IAC7B,sBAAsB,CAAC,EAAE,MAAM,CAAA;IAC/B,wBAAwB,CAAC,EAAE,MAAM,CAAA;IACjC,aAAa,CAAC,EAAE,qBAAqB,CAAA;IACrC,KAAK,EAAE,OAAO,CAAA;IACd,eAAe,EAAE,OAAO,CAAA;IACxB,KAAK,EAAE,MAAM,CAAA;IACb,WAAW,EAAE,MAAM,CAAA;IACnB,mBAAmB,CAAC,EAAE,MAAM,CAAA;IAC5B,SAAS,EAAE,MAAM,CAAA;CAClB"}
@@ -1 +1 @@
1
- {"version":3,"file":"conversation.js","sourceRoot":"","sources":["../../../src/types/resources/conversation.ts"],"names":[],"mappings":"","sourcesContent":["import type { AnalyticsMetadataResource } from './analytics_metadata'\nimport { ConversationBadgeResource } from './conversation_badge'\nimport { GroupResource } from './group_resource'\nimport { MemberAbilityResource } from './member_ability'\n\nexport interface ConversationResource {\n type: 'Conversation'\n id: number\n badges?: ConversationBadgeResource[]\n analyticsMetadata?: AnalyticsMetadataResource\n conversationMembership?: {\n lastReadMessageSortKey: string\n }\n createdAt: string\n deleted?: boolean\n groups?: GroupResource[]\n previewAvatarUrls?: string[]\n lastMessageAuthorId?: string\n lastMessageAuthorName?: string\n lastMessageCreatedAt?: string\n lastMessageTextPreview?: string\n latestReadMessageSortKey?: string\n memberAbility?: MemberAbilityResource\n muted: boolean\n repliesDisabled: boolean\n title: string\n unreadCount: number\n unreadReactionCount?: number // Derived from Jolt events\n updatedAt: string\n}\n"]}
1
+ {"version":3,"file":"conversation.js","sourceRoot":"","sources":["../../../src/types/resources/conversation.ts"],"names":[],"mappings":"","sourcesContent":["import type { AnalyticsMetadataResource } from './analytics_metadata'\nimport { ConversationBadgeResource } from './conversation_badge'\nimport { ConversationMembershipResource } from './conversation_membership'\nimport { GroupResource } from './group_resource'\nimport { MemberAbilityResource } from './member_ability'\n\nexport interface ConversationResource {\n type: 'Conversation'\n id: number\n badges?: ConversationBadgeResource[]\n analyticsMetadata?: AnalyticsMetadataResource\n conversationMembership?: ConversationMembershipResource\n createdAt: string\n deleted?: boolean\n groups?: GroupResource[]\n previewAvatarUrls?: string[]\n lastMessageAuthorId?: string\n lastMessageAuthorName?: string\n lastMessageCreatedAt?: string\n lastMessageTextPreview?: string\n latestReadMessageSortKey?: string\n memberAbility?: MemberAbilityResource\n muted: boolean\n repliesDisabled: boolean\n title: string\n unreadCount: number\n unreadReactionCount?: number // Derived from Jolt events\n updatedAt: string\n}\n"]}
@@ -0,0 +1,14 @@
1
+ import { ResourceObject } from '../api_primitives';
2
+ export type NotificationLevelValue = 'everything' | 'nothing';
3
+ export type NotificationLevelDescription = string;
4
+ export interface ConversationMembershipResource extends ResourceObject {
5
+ type: 'ConversationMembership';
6
+ lastReadMessageSortKey: string;
7
+ notificationLevel: NotificationLevelValue;
8
+ notificationLevelDescription: NotificationLevelDescription;
9
+ notificationLevelOptions: Array<{
10
+ description: NotificationLevelDescription;
11
+ value: NotificationLevelValue;
12
+ }>;
13
+ }
14
+ //# sourceMappingURL=conversation_membership.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conversation_membership.d.ts","sourceRoot":"","sources":["../../../src/types/resources/conversation_membership.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AAElD,MAAM,MAAM,sBAAsB,GAAG,YAAY,GAAG,SAAS,CAAA;AAC7D,MAAM,MAAM,4BAA4B,GAAG,MAAM,CAAA;AAEjD,MAAM,WAAW,8BAA+B,SAAQ,cAAc;IACpE,IAAI,EAAE,wBAAwB,CAAA;IAC9B,sBAAsB,EAAE,MAAM,CAAA;IAC9B,iBAAiB,EAAE,sBAAsB,CAAA;IACzC,4BAA4B,EAAE,4BAA4B,CAAA;IAC1D,wBAAwB,EAAE,KAAK,CAAC;QAC9B,WAAW,EAAE,4BAA4B,CAAA;QACzC,KAAK,EAAE,sBAAsB,CAAA;KAC9B,CAAC,CAAA;CACH"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=conversation_membership.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conversation_membership.js","sourceRoot":"","sources":["../../../src/types/resources/conversation_membership.ts"],"names":[],"mappings":"","sourcesContent":["import { ResourceObject } from '../api_primitives'\n\nexport type NotificationLevelValue = 'everything' | 'nothing'\nexport type NotificationLevelDescription = string\n\nexport interface ConversationMembershipResource extends ResourceObject {\n type: 'ConversationMembership'\n lastReadMessageSortKey: string\n notificationLevel: NotificationLevelValue\n notificationLevelDescription: NotificationLevelDescription\n notificationLevelOptions: Array<{\n description: NotificationLevelDescription\n value: NotificationLevelValue\n }>\n}\n"]}
@@ -1,5 +1,6 @@
1
1
  export * from './analytics_metadata';
2
2
  export * from './conversation';
3
+ export * from './conversation_membership';
3
4
  export * from './member';
4
5
  export * from './message';
5
6
  export * from './oauth_token';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/types/resources/index.ts"],"names":[],"mappings":"AAAA,cAAc,sBAAsB,CAAA;AACpC,cAAc,gBAAgB,CAAA;AAC9B,cAAc,UAAU,CAAA;AACxB,cAAc,WAAW,CAAA;AACzB,cAAc,eAAe,CAAA;AAC7B,cAAc,UAAU,CAAA;AACxB,cAAc,UAAU,CAAA;AACxB,cAAc,aAAa,CAAA;AAC3B,cAAc,YAAY,CAAA;AAC1B,cAAc,gBAAgB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/types/resources/index.ts"],"names":[],"mappings":"AAAA,cAAc,sBAAsB,CAAA;AACpC,cAAc,gBAAgB,CAAA;AAC9B,cAAc,2BAA2B,CAAA;AACzC,cAAc,UAAU,CAAA;AACxB,cAAc,WAAW,CAAA;AACzB,cAAc,eAAe,CAAA;AAC7B,cAAc,UAAU,CAAA;AACxB,cAAc,UAAU,CAAA;AACxB,cAAc,aAAa,CAAA;AAC3B,cAAc,YAAY,CAAA;AAC1B,cAAc,gBAAgB,CAAA"}
@@ -1,5 +1,6 @@
1
1
  export * from './analytics_metadata';
2
2
  export * from './conversation';
3
+ export * from './conversation_membership';
3
4
  export * from './member';
4
5
  export * from './message';
5
6
  export * from './oauth_token';
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/types/resources/index.ts"],"names":[],"mappings":"AAAA,cAAc,sBAAsB,CAAA;AACpC,cAAc,gBAAgB,CAAA;AAC9B,cAAc,UAAU,CAAA;AACxB,cAAc,WAAW,CAAA;AACzB,cAAc,eAAe,CAAA;AAC7B,cAAc,UAAU,CAAA;AACxB,cAAc,UAAU,CAAA;AACxB,cAAc,aAAa,CAAA;AAC3B,cAAc,YAAY,CAAA;AAC1B,cAAc,gBAAgB,CAAA","sourcesContent":["export * from './analytics_metadata'\nexport * from './conversation'\nexport * from './member'\nexport * from './message'\nexport * from './oauth_token'\nexport * from './person'\nexport * from './groups'\nexport * from './app_grant'\nexport * from './services'\nexport * from './organization'\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/types/resources/index.ts"],"names":[],"mappings":"AAAA,cAAc,sBAAsB,CAAA;AACpC,cAAc,gBAAgB,CAAA;AAC9B,cAAc,2BAA2B,CAAA;AACzC,cAAc,UAAU,CAAA;AACxB,cAAc,WAAW,CAAA;AACzB,cAAc,eAAe,CAAA;AAC7B,cAAc,UAAU,CAAA;AACxB,cAAc,UAAU,CAAA;AACxB,cAAc,aAAa,CAAA;AAC3B,cAAc,YAAY,CAAA;AAC1B,cAAc,gBAAgB,CAAA","sourcesContent":["export * from './analytics_metadata'\nexport * from './conversation'\nexport * from './conversation_membership'\nexport * from './member'\nexport * from './message'\nexport * from './oauth_token'\nexport * from './person'\nexport * from './groups'\nexport * from './app_grant'\nexport * from './services'\nexport * from './organization'\n"]}
@@ -0,0 +1,19 @@
1
+ export declare const MESSAGE_REPORT_REASONS: {
2
+ readonly scam_or_fraud: "Scam or fraud";
3
+ readonly inappropriate_content: "Inappropriate or offensive content";
4
+ readonly harassment_or_bullying: "Harassment or bullying";
5
+ readonly spam: "Spam or irrelevant messages";
6
+ readonly private_information: "Private or sensitive information shared";
7
+ readonly other: "Other (please specify)";
8
+ };
9
+ export type MessageReportReason = keyof typeof MESSAGE_REPORT_REASONS;
10
+ export interface MessageReportPayload {
11
+ data: {
12
+ type: 'MessageReport';
13
+ attributes: {
14
+ reason: MessageReportReason;
15
+ reason_detail?: string;
16
+ };
17
+ };
18
+ }
19
+ //# sourceMappingURL=message_report.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"message_report.d.ts","sourceRoot":"","sources":["../../../src/types/resources/message_report.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,sBAAsB;;;;;;;CAOzB,CAAA;AAEV,MAAM,MAAM,mBAAmB,GAAG,MAAM,OAAO,sBAAsB,CAAA;AAErE,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE;QACJ,IAAI,EAAE,eAAe,CAAA;QACrB,UAAU,EAAE;YACV,MAAM,EAAE,mBAAmB,CAAA;YAC3B,aAAa,CAAC,EAAE,MAAM,CAAA;SACvB,CAAA;KACF,CAAA;CACF"}
@@ -0,0 +1,9 @@
1
+ export const MESSAGE_REPORT_REASONS = {
2
+ scam_or_fraud: 'Scam or fraud',
3
+ inappropriate_content: 'Inappropriate or offensive content',
4
+ harassment_or_bullying: 'Harassment or bullying',
5
+ spam: 'Spam or irrelevant messages',
6
+ private_information: 'Private or sensitive information shared',
7
+ other: 'Other (please specify)',
8
+ };
9
+ //# sourceMappingURL=message_report.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"message_report.js","sourceRoot":"","sources":["../../../src/types/resources/message_report.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,sBAAsB,GAAG;IACpC,aAAa,EAAE,eAAe;IAC9B,qBAAqB,EAAE,oCAAoC;IAC3D,sBAAsB,EAAE,wBAAwB;IAChD,IAAI,EAAE,6BAA6B;IACnC,mBAAmB,EAAE,yCAAyC;IAC9D,KAAK,EAAE,wBAAwB;CACvB,CAAA","sourcesContent":["export const MESSAGE_REPORT_REASONS = {\n scam_or_fraud: 'Scam or fraud',\n inappropriate_content: 'Inappropriate or offensive content',\n harassment_or_bullying: 'Harassment or bullying',\n spam: 'Spam or irrelevant messages',\n private_information: 'Private or sensitive information shared',\n other: 'Other (please specify)',\n} as const\n\nexport type MessageReportReason = keyof typeof MESSAGE_REPORT_REASONS\n\nexport interface MessageReportPayload {\n data: {\n type: 'MessageReport'\n attributes: {\n reason: MessageReportReason\n reason_detail?: string\n }\n }\n}\n"]}
@@ -0,0 +1,4 @@
1
+ type ObjType = Record<string, unknown> | unknown[] | unknown;
2
+ export declare function deepSnakeCaseKeys<T extends ObjType>(obj: T): T;
3
+ export {};
4
+ //# sourceMappingURL=deep_snake_case_keys.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deep_snake_case_keys.d.ts","sourceRoot":"","sources":["../../src/utils/deep_snake_case_keys.ts"],"names":[],"mappings":"AAEA,KAAK,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,EAAE,GAAG,OAAO,CAAA;AAE5D,wBAAgB,iBAAiB,CAAC,CAAC,SAAS,OAAO,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,CAW9D"}
@@ -0,0 +1,13 @@
1
+ import { isArray, isObject, mapKeys, mapValues, snakeCase } from 'lodash';
2
+ export function deepSnakeCaseKeys(obj) {
3
+ if (isArray(obj)) {
4
+ return obj.map(deepSnakeCaseKeys);
5
+ }
6
+ else if (isObject(obj)) {
7
+ return mapValues(
8
+ // @ts-ignore This mutates the object, but we don't care about the type here
9
+ mapKeys(obj, (_value, key) => snakeCase(key)), deepSnakeCaseKeys);
10
+ }
11
+ return obj;
12
+ }
13
+ //# sourceMappingURL=deep_snake_case_keys.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deep_snake_case_keys.js","sourceRoot":"","sources":["../../src/utils/deep_snake_case_keys.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAA;AAIzE,MAAM,UAAU,iBAAiB,CAAoB,GAAM;IACzD,IAAI,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QACjB,OAAO,GAAG,CAAC,GAAG,CAAC,iBAAiB,CAAM,CAAA;IACxC,CAAC;SAAM,IAAI,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QACzB,OAAO,SAAS;QACd,4EAA4E;QAC5E,OAAO,CAAC,GAAG,EAAE,CAAC,MAAc,EAAE,GAAW,EAAE,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,EAC7D,iBAAiB,CACb,CAAA;IACR,CAAC;IACD,OAAO,GAAG,CAAA;AACZ,CAAC","sourcesContent":["import { isArray, isObject, mapKeys, mapValues, snakeCase } from 'lodash'\n\ntype ObjType = Record<string, unknown> | unknown[] | unknown\n\nexport function deepSnakeCaseKeys<T extends ObjType>(obj: T): T {\n if (isArray(obj)) {\n return obj.map(deepSnakeCaseKeys) as T\n } else if (isObject(obj)) {\n return mapValues(\n // @ts-ignore This mutates the object, but we don't care about the type here\n mapKeys(obj, (_value: string, key: string) => snakeCase(key)),\n deepSnakeCaseKeys\n ) as T\n }\n return obj\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@planningcenter/chat-react-native",
3
- "version": "3.23.0",
3
+ "version": "3.23.1-qa-538.0",
4
4
  "description": "",
5
5
  "main": "build/index.js",
6
6
  "types": "build/index.d.ts",
@@ -58,5 +58,5 @@
58
58
  "react-native-url-polyfill": "^2.0.0",
59
59
  "typescript": "<5.6.0"
60
60
  },
61
- "gitHead": "781d6284a8e458dacb1b20c51af5351aeb675fa3"
61
+ "gitHead": "0532662f9a0830211e706a810de32cd1f5d84993"
62
62
  }
@@ -32,9 +32,15 @@ type RestrictedPressableProps = Omit<PressableProps, 'onLongPress'>
32
32
 
33
33
  export interface ToggleButtonProps extends RestrictedPressableProps {
34
34
  /**
35
- * Pressable container styles
35
+ * Whether the toggle button is active/checked
36
36
  */
37
37
  active: boolean
38
+ /**
39
+ * Required accessibility label for screen readers.
40
+ * When title is provided, this provides additional context.
41
+ * When title is omitted (icon-only mode), this is the primary label.
42
+ */
43
+ accessibilityLabel: string
38
44
  /**
39
45
  * Specifies whether fonts should be scaled down automatically to fit given style constraints.
40
46
  */
@@ -60,9 +66,10 @@ export interface ToggleButtonProps extends RestrictedPressableProps {
60
66
  */
61
67
  minimumFontScale?: number
62
68
  /**
63
- * Renders as text within the button
69
+ * Renders as text within the button.
70
+ * When omitted, button displays in icon-only mode.
64
71
  */
65
- title: string
72
+ title?: string
66
73
  /**
67
74
  * Pressable container styles
68
75
  */
@@ -75,6 +82,7 @@ export interface ToggleButtonProps extends RestrictedPressableProps {
75
82
 
76
83
  export function ToggleButton({
77
84
  active,
85
+ accessibilityLabel,
78
86
  adjustsFontSizeToFit = false,
79
87
  allowFontScaling = true,
80
88
  iconNameLeft,
@@ -87,6 +95,7 @@ export function ToggleButton({
87
95
  onPress,
88
96
  ...props
89
97
  }: ToggleButtonProps) {
98
+ const hasTitle = Boolean(title)
90
99
  const styles = useStyles({ active, maxFontSizeMultiplier })
91
100
  const { colors } = useTheme()
92
101
  const overrideStyles = StyleSheet.flatten(style) // Ensures the pressed styles still get applied
@@ -108,11 +117,12 @@ export function ToggleButton({
108
117
  ...overrideStyles,
109
118
  })}
110
119
  accessibilityRole="togglebutton"
120
+ accessibilityLabel={accessibilityLabel}
111
121
  accessibilityState={{ checked: active }}
112
122
  android_ripple={{ color: androidRippleColor, borderless: false, foreground: true }}
113
123
  onPress={handlePress}
114
124
  accessibilityShowsLargeContentViewer
115
- accessibilityLargeContentTitle={title}
125
+ accessibilityLargeContentTitle={accessibilityLabel}
116
126
  {...props}
117
127
  >
118
128
  {iconNameLeft && (
@@ -122,17 +132,19 @@ export function ToggleButton({
122
132
  maxFontSizeMultiplier={maxFontSizeMultiplier}
123
133
  />
124
134
  )}
125
- <Text
126
- allowFontScaling={allowFontScaling}
127
- minimumFontScale={minimumFontScale}
128
- maxFontSizeMultiplier={maxFontSizeMultiplier}
129
- adjustsFontSizeToFit={adjustsFontSizeToFit}
130
- numberOfLines={1}
131
- style={styles.text}
132
- variant="tertiary"
133
- >
134
- {title}
135
- </Text>
135
+ {hasTitle && (
136
+ <Text
137
+ allowFontScaling={allowFontScaling}
138
+ minimumFontScale={minimumFontScale}
139
+ maxFontSizeMultiplier={maxFontSizeMultiplier}
140
+ adjustsFontSizeToFit={adjustsFontSizeToFit}
141
+ numberOfLines={1}
142
+ style={styles.text}
143
+ variant="tertiary"
144
+ >
145
+ {title}
146
+ </Text>
147
+ )}
136
148
  {iconNameRight && (
137
149
  <Icon
138
150
  name={iconNameRight}
@@ -235,7 +235,7 @@ type FormSheetActionAppearanceUnion =
235
235
 
236
236
  interface FormSheetActionProps {
237
237
  title: string
238
- iconName: IconString
238
+ iconName?: IconString
239
239
  onPress: () => void
240
240
  accessibilityLabel?: string
241
241
  accessibilityHint?: string
@@ -265,7 +265,9 @@ function FormSheetAction({
265
265
  style={styles.actionPressable}
266
266
  disabled={disabled}
267
267
  >
268
- <Icon name={iconName} size={16} accessibilityElementsHidden style={styles.actionIcon} />
268
+ {iconName && (
269
+ <Icon name={iconName} size={16} accessibilityElementsHidden style={styles.actionIcon} />
270
+ )}
269
271
  <Text style={styles.actionTitle}>{title}</Text>
270
272
  </PlatformPressable>
271
273
  )
@@ -21,3 +21,4 @@ export * from './use_submit_age_check'
21
21
  export * from './use_organization'
22
22
  export * from './use_product_analytics'
23
23
  export * from './use_people_person'
24
+ export * from './use_new_conversation_entry'
@@ -38,7 +38,12 @@ export const getConversationRequestArgs = ({ conversation_id }: { conversation_i
38
38
  'can_reply',
39
39
  'can_delete_non_authored_messages',
40
40
  ],
41
- ConversationMembership: ['last_read_message_sort_key'],
41
+ ConversationMembership: [
42
+ 'last_read_message_sort_key',
43
+ 'notification_level',
44
+ 'notification_level_description',
45
+ 'notification_level_options',
46
+ ],
42
47
  ConversationBadge: ['app_name', 'pco_resource_type', 'text'],
43
48
  Group: ['type', 'id', 'links', 'name', 'source_app_name', 'source_type'],
44
49
  },
@@ -0,0 +1,82 @@
1
+ import { Updater, useMutation, useQueryClient } from '@tanstack/react-query'
2
+ import { ApiResource, ConversationMembershipResource, ConversationResource } from '../types'
3
+ import { useApiClient } from './use_api_client'
4
+ import { getConversationRequestArgs } from './use_conversation'
5
+ import { getRequestQueryKey } from './use_suspense_api'
6
+ import { deepSnakeCaseKeys } from '../utils/deep_snake_case_keys'
7
+ import { throwResponseError } from '../utils/response_error'
8
+
9
+ export const useConversationMembershipUpdate = ({
10
+ conversation_id,
11
+ }: {
12
+ conversation_id: number
13
+ }) => {
14
+ const apiClient = useApiClient()
15
+ const queryClient = useQueryClient()
16
+ const requestArgs = getConversationRequestArgs({ conversation_id })
17
+ const conversationMembershipFields = requestArgs.data.fields.ConversationMembership.join(',')
18
+ const queryKey = getRequestQueryKey(requestArgs)
19
+
20
+ return useMutation({
21
+ throwOnError: true,
22
+ onMutate: async (attributes: Partial<ConversationMembershipResource>) => {
23
+ queryClient.setQueryData<ApiResource<ConversationResource>>(
24
+ queryKey,
25
+ updateConversationMembershipAttributes(attributes)
26
+ )
27
+ },
28
+ mutationKey: ['updateConversationMembership', conversation_id],
29
+ mutationFn: async (attributes: Partial<ConversationMembershipResource>) => {
30
+ return apiClient.chat
31
+ .patch<ApiResource<ConversationMembershipResource>>({
32
+ url: `/me/conversation/${conversation_id}/conversation_membership`,
33
+ data: {
34
+ data: {
35
+ type: 'ConversationMembership',
36
+ attributes: deepSnakeCaseKeys(attributes),
37
+ },
38
+ fields: {
39
+ ConversationMembership: conversationMembershipFields,
40
+ },
41
+ },
42
+ })
43
+ .catch(throwResponseError)
44
+ },
45
+ onSuccess: response => {
46
+ const membership = response.data
47
+
48
+ queryClient.setQueryData<ApiResource<ConversationResource>>(
49
+ queryKey,
50
+ updateConversationMembershipAttributes(membership)
51
+ )
52
+ },
53
+ })
54
+ }
55
+
56
+ const updateConversationMembershipAttributes =
57
+ (
58
+ membership: Partial<ConversationMembershipResource>
59
+ ): Updater<
60
+ ApiResource<ConversationResource> | undefined,
61
+ ApiResource<ConversationResource> | undefined
62
+ > =>
63
+ conversationData =>
64
+ mergeConversationMembership(conversationData, membership)
65
+
66
+ const mergeConversationMembership = (
67
+ conversationData: ApiResource<ConversationResource> | undefined,
68
+ membership: Partial<ConversationMembershipResource>
69
+ ) => {
70
+ if (!conversationData) return undefined
71
+
72
+ const previousMembership: Partial<ConversationMembershipResource> =
73
+ conversationData.data.conversationMembership || {}
74
+
75
+ return {
76
+ ...conversationData,
77
+ conversationMembership: {
78
+ ...previousMembership,
79
+ ...membership,
80
+ },
81
+ }
82
+ }
@@ -35,6 +35,7 @@ export function useFeatures() {
35
35
 
36
36
  export const availableFeatures = {
37
37
  threaded_replies: 'ROLLOUT_MOBILE_threaded_replies_v1',
38
+ message_reporting: 'ROLLOUT_MOBILE_message_reporting',
38
39
  }
39
40
 
40
41
  const stableEmptyFeatures: ApiCollection<FeatureResource> = {
@@ -0,0 +1,31 @@
1
+ import { useMemo } from 'react'
2
+ import { useAppGrants } from './use_chat_permissions'
3
+
4
+ export type NewConversationEntryMode = 'select_type' | 'groups' | 'teams' | 'none'
5
+
6
+ export function useNewConversationEntry(): NewConversationEntryMode {
7
+ const appGrants = useAppGrants()
8
+
9
+ return useMemo(() => {
10
+ const canCreateGroupsConversations = appGrants.data?.some(
11
+ g => g.createConversations && g.appName === 'Groups'
12
+ )
13
+ const canCreateServicesConversations = appGrants.data?.some(
14
+ g => g.createConversations && g.appName === 'Services'
15
+ )
16
+
17
+ if (canCreateGroupsConversations && canCreateServicesConversations) {
18
+ return 'select_type'
19
+ }
20
+
21
+ if (canCreateGroupsConversations) {
22
+ return 'groups'
23
+ }
24
+
25
+ if (canCreateServicesConversations) {
26
+ return 'teams'
27
+ }
28
+
29
+ return 'none'
30
+ }, [appGrants.data])
31
+ }
@@ -0,0 +1,37 @@
1
+ import { useMutation } from '@tanstack/react-query'
2
+ import { useApiClient } from './use_api_client'
3
+ import { Haptic } from '../utils/native_adapters'
4
+ import { MessageReportReason, MessageReportPayload } from '../types/resources/message_report'
5
+
6
+ export const useReportMessage = (conversationId: number, messageId: string) => {
7
+ const apiClient = useApiClient()
8
+
9
+ return useMutation({
10
+ mutationFn: async ({
11
+ reason,
12
+ reasonDetail,
13
+ }: {
14
+ reason: MessageReportReason
15
+ reasonDetail?: string
16
+ }) => {
17
+ const url = `/me/conversations/${conversationId}/messages/${messageId}/report`
18
+ const data: MessageReportPayload = {
19
+ data: {
20
+ type: 'MessageReport',
21
+ attributes: {
22
+ reason,
23
+ ...(reasonDetail && { reason_detail: reasonDetail }),
24
+ },
25
+ },
26
+ }
27
+
28
+ return apiClient.chat.post({ url, data })
29
+ },
30
+ onSuccess: () => {
31
+ Haptic.notificationSuccess()
32
+ },
33
+ onError: () => {
34
+ Haptic.notificationError()
35
+ },
36
+ })
37
+ }
@@ -35,14 +35,19 @@ import {
35
35
  ConversationScreenTitle,
36
36
  } from '../screens/conversation_screen'
37
37
  import { ConversationSelectGroupRecipientsScreen } from '../screens/conversation_select_recipients/conversation_select_group_recipients_screen'
38
- import { ConversationSelectRecipientsScreen } from '../screens/conversation_select_recipients/conversation_select_recipients_screen'
39
38
  import { ConversationSelectTeamsILeadRecipientsScreen } from '../screens/conversation_select_recipients/conversation_select_teams_i_lead_recipients_screen'
39
+ import { ConversationNewEntryScreen } from '../screens/conversation_select_recipients/conversation_new_entry_screen'
40
+ import {
41
+ ConversationSelectTypeScreen,
42
+ ConversationSelectTypeScreenOptions,
43
+ } from '../screens/conversation_select_type_screen'
40
44
  import { ConversationsScreen } from '../screens/conversations/conversations_screen'
41
45
  import { GetHelpScreen } from '../screens/get_help_screen'
42
46
  import {
43
47
  MessageActionsScreen,
44
48
  MessageActionsScreenOptions,
45
49
  } from '../screens/message_actions_screen'
50
+ import { MessageReportScreen, MessageReportScreenOptions } from '../screens/message_report_screen'
46
51
  import { NotFound } from '../screens/not_found'
47
52
  import { ReactionsScreen, ReactionsScreenOptions } from '../screens/reactions_screen'
48
53
  import { ScreenLayoutWithChatAccessGate } from './screenLayout'
@@ -56,14 +61,14 @@ const HEADER_BACK_BUTTON_LAYOUT_RESET_STYLES = {
56
61
  }
57
62
 
58
63
  export const NewConversationStack = createNativeStackNavigator({
59
- initialRouteName: 'ConversationSelectRecipients',
64
+ initialRouteName: 'ConversationNewEntry',
60
65
  screenOptions: {
61
66
  headerBackButtonDisplayMode: 'minimal',
62
67
  },
63
68
  screenLayout: ScreenLayoutWithChatAccessGate,
64
69
  screens: {
65
- ConversationSelectRecipients: {
66
- screen: ConversationSelectRecipientsScreen,
70
+ ConversationNewEntry: {
71
+ screen: ConversationNewEntryScreen,
67
72
  options: ({ navigation }) => ({
68
73
  title: 'New conversation',
69
74
  headerRight: (props: NativeStackHeaderRightProps) => (
@@ -104,13 +109,13 @@ export const NewConversationStack = createNativeStackNavigator({
104
109
  },
105
110
  ConversationNew: {
106
111
  screen: ConversationNewScreen,
107
- options: ({ navigation }) => ({
112
+ options: ({ navigation, route }) => ({
108
113
  title: 'New conversation',
109
114
  headerLeft: () => null,
110
115
  headerRight: (props: NativeStackHeaderRightProps) => (
111
116
  <HeaderTextButton
112
117
  {...props}
113
- onPress={() => navigation.getParent()?.goBack()}
118
+ onPress={() => navigation.popTo('Conversations', route.params)}
114
119
  title="Cancel"
115
120
  />
116
121
  ),
@@ -235,10 +240,18 @@ export const ChatStack = createNativeStackNavigator({
235
240
  // Something about sheetAllowedDetents declared inline breaks TS
236
241
  options: MessageActionsScreenOptions,
237
242
  },
243
+ MessageReport: {
244
+ screen: MessageReportScreen,
245
+ options: MessageReportScreenOptions,
246
+ },
238
247
  AttachmentActions: {
239
248
  screen: AttachmentActionsScreen,
240
249
  options: AttachmentActionsScreenOptions,
241
250
  },
251
+ ConversationSelectType: {
252
+ screen: ConversationSelectTypeScreen,
253
+ options: ConversationSelectTypeScreenOptions,
254
+ },
242
255
  Reactions: {
243
256
  screen: ReactionsScreen,
244
257
  options: ReactionsScreenOptions,