@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.
- package/build/components/display/toggle_button.d.ts +11 -4
- package/build/components/display/toggle_button.d.ts.map +1 -1
- package/build/components/display/toggle_button.js +6 -5
- package/build/components/display/toggle_button.js.map +1 -1
- package/build/components/primitive/form_sheet.d.ts +1 -1
- package/build/components/primitive/form_sheet.d.ts.map +1 -1
- package/build/components/primitive/form_sheet.js +1 -1
- package/build/components/primitive/form_sheet.js.map +1 -1
- package/build/hooks/index.d.ts +1 -0
- package/build/hooks/index.d.ts.map +1 -1
- package/build/hooks/index.js +1 -0
- package/build/hooks/index.js.map +1 -1
- package/build/hooks/use_conversation.d.ts.map +1 -1
- package/build/hooks/use_conversation.js +6 -1
- package/build/hooks/use_conversation.js.map +1 -1
- package/build/hooks/use_conversation_membership.d.ts +5 -0
- package/build/hooks/use_conversation_membership.d.ts.map +1 -0
- package/build/hooks/use_conversation_membership.js +54 -0
- package/build/hooks/use_conversation_membership.js.map +1 -0
- package/build/hooks/use_features.d.ts +1 -0
- package/build/hooks/use_features.d.ts.map +1 -1
- package/build/hooks/use_features.js +1 -0
- package/build/hooks/use_features.js.map +1 -1
- package/build/hooks/use_new_conversation_entry.d.ts +3 -0
- package/build/hooks/use_new_conversation_entry.d.ts.map +1 -0
- package/build/hooks/use_new_conversation_entry.js +20 -0
- package/build/hooks/use_new_conversation_entry.js.map +1 -0
- package/build/hooks/use_report_message.d.ts +6 -0
- package/build/hooks/use_report_message.d.ts.map +1 -0
- package/build/hooks/use_report_message.js +28 -0
- package/build/hooks/use_report_message.js.map +1 -0
- package/build/navigation/index.d.ts +18 -8
- package/build/navigation/index.d.ts.map +1 -1
- package/build/navigation/index.js +16 -6
- package/build/navigation/index.js.map +1 -1
- package/build/screens/conversation_details_screen.d.ts.map +1 -1
- package/build/screens/conversation_details_screen.js +18 -10
- package/build/screens/conversation_details_screen.js.map +1 -1
- package/build/screens/conversation_filter_recipients/conversation_filter_recipients_screen.js +5 -3
- package/build/screens/conversation_filter_recipients/conversation_filter_recipients_screen.js.map +1 -1
- package/build/screens/conversation_select_recipients/conversation_new_entry_screen.d.ts +4 -0
- package/build/screens/conversation_select_recipients/conversation_new_entry_screen.d.ts.map +1 -0
- package/build/screens/conversation_select_recipients/conversation_new_entry_screen.js +67 -0
- package/build/screens/conversation_select_recipients/conversation_new_entry_screen.js.map +1 -0
- package/build/screens/conversation_select_recipients/conversation_select_teams_i_lead_recipients_screen.d.ts.map +1 -1
- package/build/screens/conversation_select_recipients/conversation_select_teams_i_lead_recipients_screen.js +17 -2
- package/build/screens/conversation_select_recipients/conversation_select_teams_i_lead_recipients_screen.js.map +1 -1
- package/build/screens/conversation_select_type_screen.d.ts +11 -0
- package/build/screens/conversation_select_type_screen.d.ts.map +1 -0
- package/build/screens/conversation_select_type_screen.js +32 -0
- package/build/screens/conversation_select_type_screen.js.map +1 -0
- package/build/screens/conversations/components/list_header_component.d.ts.map +1 -1
- package/build/screens/conversations/components/list_header_component.js +54 -25
- package/build/screens/conversations/components/list_header_component.js.map +1 -1
- package/build/screens/index.d.ts +1 -1
- package/build/screens/index.d.ts.map +1 -1
- package/build/screens/index.js +1 -1
- package/build/screens/index.js.map +1 -1
- package/build/screens/message_actions_screen.js +14 -2
- package/build/screens/message_actions_screen.js.map +1 -1
- package/build/screens/message_report/components/message_preview.d.ts +10 -0
- package/build/screens/message_report/components/message_preview.d.ts.map +1 -0
- package/build/screens/message_report/components/message_preview.js +81 -0
- package/build/screens/message_report/components/message_preview.js.map +1 -0
- package/build/screens/message_report/components/report_reason_list.d.ts +9 -0
- package/build/screens/message_report/components/report_reason_list.d.ts.map +1 -0
- package/build/screens/message_report/components/report_reason_list.js +67 -0
- package/build/screens/message_report/components/report_reason_list.js.map +1 -0
- package/build/screens/message_report_screen.d.ts +10 -0
- package/build/screens/message_report_screen.d.ts.map +1 -0
- package/build/screens/message_report_screen.js +214 -0
- package/build/screens/message_report_screen.js.map +1 -0
- package/build/types/resources/conversation.d.ts +2 -3
- package/build/types/resources/conversation.d.ts.map +1 -1
- package/build/types/resources/conversation.js.map +1 -1
- package/build/types/resources/conversation_membership.d.ts +14 -0
- package/build/types/resources/conversation_membership.d.ts.map +1 -0
- package/build/types/resources/conversation_membership.js +2 -0
- package/build/types/resources/conversation_membership.js.map +1 -0
- package/build/types/resources/index.d.ts +1 -0
- package/build/types/resources/index.d.ts.map +1 -1
- package/build/types/resources/index.js +1 -0
- package/build/types/resources/index.js.map +1 -1
- package/build/types/resources/message_report.d.ts +19 -0
- package/build/types/resources/message_report.d.ts.map +1 -0
- package/build/types/resources/message_report.js +9 -0
- package/build/types/resources/message_report.js.map +1 -0
- package/build/utils/deep_snake_case_keys.d.ts +4 -0
- package/build/utils/deep_snake_case_keys.d.ts.map +1 -0
- package/build/utils/deep_snake_case_keys.js +13 -0
- package/build/utils/deep_snake_case_keys.js.map +1 -0
- package/package.json +2 -2
- package/src/components/display/toggle_button.tsx +27 -15
- package/src/components/primitive/form_sheet.tsx +4 -2
- package/src/hooks/index.ts +1 -0
- package/src/hooks/use_conversation.ts +6 -1
- package/src/hooks/use_conversation_membership.ts +82 -0
- package/src/hooks/use_features.ts +1 -0
- package/src/hooks/use_new_conversation_entry.ts +31 -0
- package/src/hooks/use_report_message.ts +37 -0
- package/src/navigation/index.tsx +19 -6
- package/src/screens/conversation_details_screen.tsx +34 -16
- package/src/screens/conversation_filter_recipients/conversation_filter_recipients_screen.tsx +10 -3
- package/src/screens/conversation_select_recipients/conversation_new_entry_screen.tsx +100 -0
- package/src/screens/conversation_select_recipients/conversation_select_teams_i_lead_recipients_screen.tsx +23 -3
- package/src/screens/conversation_select_type_screen.tsx +53 -0
- package/src/screens/conversations/components/list_header_component.tsx +103 -67
- package/src/screens/index.ts +1 -1
- package/src/screens/message_actions_screen.tsx +24 -2
- package/src/screens/message_report/components/message_preview.tsx +99 -0
- package/src/screens/message_report/components/report_reason_list.tsx +106 -0
- package/src/screens/message_report_screen.tsx +278 -0
- package/src/types/resources/conversation.ts +2 -3
- package/src/types/resources/conversation_membership.ts +15 -0
- package/src/types/resources/index.ts +1 -0
- package/src/types/resources/message_report.ts +20 -0
- package/src/utils/deep_snake_case_keys.ts +16 -0
- package/build/screens/conversation_select_recipients/conversation_select_recipients_screen.d.ts +0 -4
- package/build/screens/conversation_select_recipients/conversation_select_recipients_screen.d.ts.map +0 -1
- package/build/screens/conversation_select_recipients/conversation_select_recipients_screen.js +0 -146
- package/build/screens/conversation_select_recipients/conversation_select_recipients_screen.js.map +0 -1
- 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'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
|
|
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?:
|
|
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 @@
|
|
|
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 +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 +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 @@
|
|
|
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": "
|
|
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
|
-
*
|
|
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
|
|
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={
|
|
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
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
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
|
|
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
|
-
|
|
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
|
)
|
package/src/hooks/index.ts
CHANGED
|
@@ -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: [
|
|
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
|
+
}
|
package/src/navigation/index.tsx
CHANGED
|
@@ -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: '
|
|
64
|
+
initialRouteName: 'ConversationNewEntry',
|
|
60
65
|
screenOptions: {
|
|
61
66
|
headerBackButtonDisplayMode: 'minimal',
|
|
62
67
|
},
|
|
63
68
|
screenLayout: ScreenLayoutWithChatAccessGate,
|
|
64
69
|
screens: {
|
|
65
|
-
|
|
66
|
-
screen:
|
|
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.
|
|
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,
|