@planningcenter/chat-react-native 3.31.0-rc.2 → 3.31.0-rc.3

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.
@@ -0,0 +1,12 @@
1
+ import { GraphId } from '../types/resources/group_resource';
2
+ export type NewConversationFromFilter = {
3
+ name: string;
4
+ sourceAppName: 'groups';
5
+ groupId: number;
6
+ } | {
7
+ name: string;
8
+ sourceAppName: 'services';
9
+ teamIds: number[];
10
+ };
11
+ export declare function useNewConversationFromFilter(chatGroupGraphId?: GraphId): NewConversationFromFilter | undefined;
12
+ //# sourceMappingURL=use_new_conversation_from_filter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use_new_conversation_from_filter.d.ts","sourceRoot":"","sources":["../../src/hooks/use_new_conversation_from_filter.ts"],"names":[],"mappings":"AACA,OAAO,EAAiB,OAAO,EAAE,MAAM,mCAAmC,CAAA;AAM1E,MAAM,MAAM,yBAAyB,GACjC;IACE,IAAI,EAAE,MAAM,CAAA;IACZ,aAAa,EAAE,QAAQ,CAAA;IACvB,OAAO,EAAE,MAAM,CAAA;CAChB,GACD;IACE,IAAI,EAAE,MAAM,CAAA;IACZ,aAAa,EAAE,UAAU,CAAA;IACzB,OAAO,EAAE,MAAM,EAAE,CAAA;CAClB,CAAA;AAEL,wBAAgB,4BAA4B,CAC1C,gBAAgB,CAAC,EAAE,OAAO,GACzB,yBAAyB,GAAG,SAAS,CA2CvC"}
@@ -0,0 +1,47 @@
1
+ import { useMemo } from 'react';
2
+ import { destructureChatGroupGraphId } from '../utils';
3
+ import { useApiGet } from './use_api';
4
+ import { useNewConversationEntry } from './use_new_conversation_entry';
5
+ export function useNewConversationFromFilter(chatGroupGraphId) {
6
+ const { sourceAppName, sourceType, sourceId } = destructureChatGroupGraphId(chatGroupGraphId);
7
+ const entryMode = useNewConversationEntry();
8
+ const isGroupsGroup = sourceAppName === 'Groups' && sourceType === 'Group';
9
+ const isServicesTeam = sourceAppName === 'Services' && sourceType === 'Team';
10
+ const { data: group } = useApiGet({
11
+ url: `/me/groups/${chatGroupGraphId}`,
12
+ data: { fields: { Group: ['name'] } },
13
+ enabled: !!chatGroupGraphId,
14
+ app: 'chat',
15
+ });
16
+ const { data: groupsGroup } = useApiGet({
17
+ url: `/me/groups/${sourceId}`,
18
+ data: { fields: { Group: ['can_create_conversation'] } },
19
+ enabled: isGroupsGroup && !!sourceId,
20
+ app: 'groups',
21
+ });
22
+ return useMemo(() => {
23
+ if (isGroupsGroup && group?.name && sourceId) {
24
+ const canCreate = entryMode === 'select_type' || entryMode === 'groups';
25
+ if (!canCreate)
26
+ return undefined;
27
+ if (!groupsGroup?.canCreateConversation)
28
+ return undefined;
29
+ return { name: group.name, sourceAppName: 'groups', groupId: sourceId };
30
+ }
31
+ if (isServicesTeam && group?.name && sourceId) {
32
+ const canCreate = entryMode === 'select_type' || entryMode === 'teams';
33
+ if (!canCreate)
34
+ return undefined;
35
+ return { name: group.name, sourceAppName: 'services', teamIds: [sourceId] };
36
+ }
37
+ return undefined;
38
+ }, [
39
+ group?.name,
40
+ sourceId,
41
+ entryMode,
42
+ isGroupsGroup,
43
+ isServicesTeam,
44
+ groupsGroup?.canCreateConversation,
45
+ ]);
46
+ }
47
+ //# sourceMappingURL=use_new_conversation_from_filter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use_new_conversation_from_filter.js","sourceRoot":"","sources":["../../src/hooks/use_new_conversation_from_filter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,OAAO,CAAA;AAG/B,OAAO,EAAE,2BAA2B,EAAE,MAAM,UAAU,CAAA;AACtD,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAA;AACrC,OAAO,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAA;AActE,MAAM,UAAU,4BAA4B,CAC1C,gBAA0B;IAE1B,MAAM,EAAE,aAAa,EAAE,UAAU,EAAE,QAAQ,EAAE,GAAG,2BAA2B,CAAC,gBAAgB,CAAC,CAAA;IAC7F,MAAM,SAAS,GAAG,uBAAuB,EAAE,CAAA;IAC3C,MAAM,aAAa,GAAG,aAAa,KAAK,QAAQ,IAAI,UAAU,KAAK,OAAO,CAAA;IAC1E,MAAM,cAAc,GAAG,aAAa,KAAK,UAAU,IAAI,UAAU,KAAK,MAAM,CAAA;IAE5E,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,SAAS,CAAgB;QAC/C,GAAG,EAAE,cAAc,gBAAgB,EAAE;QACrC,IAAI,EAAE,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,CAAC,MAAM,CAAC,EAAE,EAAE;QACrC,OAAO,EAAE,CAAC,CAAC,gBAAgB;QAC3B,GAAG,EAAE,MAAM;KACZ,CAAC,CAAA;IAEF,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,SAAS,CAAsB;QAC3D,GAAG,EAAE,cAAc,QAAQ,EAAE;QAC7B,IAAI,EAAE,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,CAAC,yBAAyB,CAAC,EAAE,EAAE;QACxD,OAAO,EAAE,aAAa,IAAI,CAAC,CAAC,QAAQ;QACpC,GAAG,EAAE,QAAQ;KACd,CAAC,CAAA;IAEF,OAAO,OAAO,CAAC,GAAG,EAAE;QAClB,IAAI,aAAa,IAAI,KAAK,EAAE,IAAI,IAAI,QAAQ,EAAE,CAAC;YAC7C,MAAM,SAAS,GAAG,SAAS,KAAK,aAAa,IAAI,SAAS,KAAK,QAAQ,CAAA;YACvE,IAAI,CAAC,SAAS;gBAAE,OAAO,SAAS,CAAA;YAChC,IAAI,CAAC,WAAW,EAAE,qBAAqB;gBAAE,OAAO,SAAS,CAAA;YACzD,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,aAAa,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAA;QACzE,CAAC;QAED,IAAI,cAAc,IAAI,KAAK,EAAE,IAAI,IAAI,QAAQ,EAAE,CAAC;YAC9C,MAAM,SAAS,GAAG,SAAS,KAAK,aAAa,IAAI,SAAS,KAAK,OAAO,CAAA;YACtE,IAAI,CAAC,SAAS;gBAAE,OAAO,SAAS,CAAA;YAChC,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,aAAa,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAA;QAC7E,CAAC;QAED,OAAO,SAAS,CAAA;IAClB,CAAC,EAAE;QACD,KAAK,EAAE,IAAI;QACX,QAAQ;QACR,SAAS;QACT,aAAa;QACb,cAAc;QACd,WAAW,EAAE,qBAAqB;KACnC,CAAC,CAAA;AACJ,CAAC","sourcesContent":["import { useMemo } from 'react'\nimport { GroupResource, GraphId } from '../types/resources/group_resource'\nimport { GroupsGroupResource } from '../types/resources/groups/groups_group_resource'\nimport { destructureChatGroupGraphId } from '../utils'\nimport { useApiGet } from './use_api'\nimport { useNewConversationEntry } from './use_new_conversation_entry'\n\nexport type NewConversationFromFilter =\n | {\n name: string\n sourceAppName: 'groups'\n groupId: number\n }\n | {\n name: string\n sourceAppName: 'services'\n teamIds: number[]\n }\n\nexport function useNewConversationFromFilter(\n chatGroupGraphId?: GraphId\n): NewConversationFromFilter | undefined {\n const { sourceAppName, sourceType, sourceId } = destructureChatGroupGraphId(chatGroupGraphId)\n const entryMode = useNewConversationEntry()\n const isGroupsGroup = sourceAppName === 'Groups' && sourceType === 'Group'\n const isServicesTeam = sourceAppName === 'Services' && sourceType === 'Team'\n\n const { data: group } = useApiGet<GroupResource>({\n url: `/me/groups/${chatGroupGraphId}`,\n data: { fields: { Group: ['name'] } },\n enabled: !!chatGroupGraphId,\n app: 'chat',\n })\n\n const { data: groupsGroup } = useApiGet<GroupsGroupResource>({\n url: `/me/groups/${sourceId}`,\n data: { fields: { Group: ['can_create_conversation'] } },\n enabled: isGroupsGroup && !!sourceId,\n app: 'groups',\n })\n\n return useMemo(() => {\n if (isGroupsGroup && group?.name && sourceId) {\n const canCreate = entryMode === 'select_type' || entryMode === 'groups'\n if (!canCreate) return undefined\n if (!groupsGroup?.canCreateConversation) return undefined\n return { name: group.name, sourceAppName: 'groups', groupId: sourceId }\n }\n\n if (isServicesTeam && group?.name && sourceId) {\n const canCreate = entryMode === 'select_type' || entryMode === 'teams'\n if (!canCreate) return undefined\n return { name: group.name, sourceAppName: 'services', teamIds: [sourceId] }\n }\n\n return undefined\n }, [\n group?.name,\n sourceId,\n entryMode,\n isGroupsGroup,\n isServicesTeam,\n groupsGroup?.canCreateConversation,\n ])\n}\n"]}
@@ -1,11 +1,13 @@
1
1
  import { StaticScreenProps } from '@react-navigation/native';
2
2
  import React from 'react';
3
+ import type { NewConversationFromFilter } from '../hooks/use_new_conversation_from_filter';
3
4
  import { AppName } from '../types/resources/app_name';
4
5
  import { GraphId } from '../types/resources/group_resource';
5
6
  export declare const ConversationSelectTypeScreenOptions: import("@react-navigation/native-stack").NativeStackNavigationOptions;
6
7
  export type ConversationSelectTypeScreenProps = StaticScreenProps<{
7
8
  chat_group_graph_id?: GraphId;
8
9
  group_source_app_name?: AppName;
10
+ newConversationFromFilter?: NewConversationFromFilter;
9
11
  }>;
10
12
  export declare function ConversationSelectTypeScreen({ route }: ConversationSelectTypeScreenProps): React.JSX.Element;
11
13
  //# sourceMappingURL=conversation_select_type_screen.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"conversation_select_type_screen.d.ts","sourceRoot":"","sources":["../../src/screens/conversation_select_type_screen.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAiB,MAAM,0BAA0B,CAAA;AAC3E,OAAO,KAAK,MAAM,OAAO,CAAA;AAEzB,OAAO,EAAE,OAAO,EAAE,MAAM,6BAA6B,CAAA;AACrD,OAAO,EAAE,OAAO,EAAE,MAAM,mCAAmC,CAAA;AAG3D,eAAO,MAAM,mCAAmC,uEAE9C,CAAA;AAEF,MAAM,MAAM,iCAAiC,GAAG,iBAAiB,CAAC;IAChE,mBAAmB,CAAC,EAAE,OAAO,CAAA;IAC7B,qBAAqB,CAAC,EAAE,OAAO,CAAA;CAChC,CAAC,CAAA;AAEF,wBAAgB,4BAA4B,CAAC,EAAE,KAAK,EAAE,EAAE,iCAAiC,qBA0CxF"}
1
+ {"version":3,"file":"conversation_select_type_screen.d.ts","sourceRoot":"","sources":["../../src/screens/conversation_select_type_screen.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAiB,MAAM,0BAA0B,CAAA;AAC3E,OAAO,KAAK,MAAM,OAAO,CAAA;AAGzB,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,2CAA2C,CAAA;AAC1F,OAAO,EAAE,OAAO,EAAE,MAAM,6BAA6B,CAAA;AACrD,OAAO,EAAE,OAAO,EAAE,MAAM,mCAAmC,CAAA;AAG3D,eAAO,MAAM,mCAAmC,uEAE9C,CAAA;AAEF,MAAM,MAAM,iCAAiC,GAAG,iBAAiB,CAAC;IAChE,mBAAmB,CAAC,EAAE,OAAO,CAAA;IAC7B,qBAAqB,CAAC,EAAE,OAAO,CAAA;IAC/B,yBAAyB,CAAC,EAAE,yBAAyB,CAAA;CACtD,CAAC,CAAA;AAEF,wBAAgB,4BAA4B,CAAC,EAAE,KAAK,EAAE,EAAE,iCAAiC,qBAwFxF"}
@@ -1,19 +1,53 @@
1
1
  import { useNavigation } from '@react-navigation/native';
2
2
  import React from 'react';
3
3
  import FormSheet, { getFormSheetScreenOptions } from '../components/primitive/form_sheet';
4
+ import { useNewConversationEntry } from '../hooks/use_new_conversation_entry';
4
5
  import { Haptic } from '../utils/native_adapters';
5
6
  export const ConversationSelectTypeScreenOptions = getFormSheetScreenOptions({
6
7
  headerTitle: 'New conversation',
7
8
  });
8
9
  export function ConversationSelectTypeScreen({ route }) {
9
10
  const navigation = useNavigation();
11
+ const entryMode = useNewConversationEntry();
12
+ const { newConversationFromFilter, chat_group_graph_id, group_source_app_name } = route.params || {};
13
+ const filterParams = { chat_group_graph_id, group_source_app_name };
14
+ const canCreateGroups = entryMode === 'select_type' || entryMode === 'groups';
15
+ const canCreateTeams = entryMode === 'select_type' || entryMode === 'teams';
16
+ const handleFilterPress = () => {
17
+ if (!newConversationFromFilter)
18
+ return;
19
+ Haptic.impactLight();
20
+ navigation.goBack();
21
+ requestAnimationFrame(() => {
22
+ if (newConversationFromFilter.sourceAppName === 'groups') {
23
+ navigation.navigate('New', {
24
+ screen: 'ConversationNew',
25
+ params: {
26
+ ...filterParams,
27
+ source_app_name: 'Groups',
28
+ group_id: newConversationFromFilter.groupId,
29
+ },
30
+ });
31
+ }
32
+ else {
33
+ navigation.navigate('New', {
34
+ screen: 'ConversationNew',
35
+ params: {
36
+ ...filterParams,
37
+ source_app_name: 'Services',
38
+ team_ids: newConversationFromFilter.teamIds,
39
+ },
40
+ });
41
+ }
42
+ });
43
+ };
10
44
  const handleGroupPress = () => {
11
45
  Haptic.impactLight();
12
46
  navigation.goBack();
13
47
  requestAnimationFrame(() => {
14
48
  navigation.navigate('New', {
15
49
  screen: 'ConversationSelectGroupRecipients',
16
- params: { ...route.params },
50
+ params: filterParams,
17
51
  });
18
52
  });
19
53
  };
@@ -23,7 +57,7 @@ export function ConversationSelectTypeScreen({ route }) {
23
57
  requestAnimationFrame(() => {
24
58
  navigation.navigate('New', {
25
59
  screen: 'ConversationSelectTeamsILeadRecipients',
26
- params: { ...route.params },
60
+ params: filterParams,
27
61
  });
28
62
  });
29
63
  };
@@ -31,8 +65,9 @@ export function ConversationSelectTypeScreen({ route }) {
31
65
  <FormSheet.Header>
32
66
  <FormSheet.HeaderTitle>Start a conversation by</FormSheet.HeaderTitle>
33
67
  </FormSheet.Header>
34
- <FormSheet.Action title="Group" onPress={handleGroupPress} accessibilityHint="Opens group selection screen"/>
35
- <FormSheet.Action title="Team" onPress={handleTeamPress} accessibilityHint="Opens team selection screen"/>
68
+ {newConversationFromFilter && (<FormSheet.Action title={`New conversation in ${newConversationFromFilter.name}`} onPress={handleFilterPress} accessibilityHint="Creates a conversation pre-scoped to the current filter"/>)}
69
+ {canCreateGroups && (<FormSheet.Action title="Group" onPress={handleGroupPress} accessibilityHint="Opens group selection screen"/>)}
70
+ {canCreateTeams && (<FormSheet.Action title="Team" onPress={handleTeamPress} accessibilityHint="Opens team selection screen"/>)}
36
71
  </FormSheet.Root>);
37
72
  }
38
73
  //# sourceMappingURL=conversation_select_type_screen.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"conversation_select_type_screen.js","sourceRoot":"","sources":["../../src/screens/conversation_select_type_screen.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAqB,aAAa,EAAE,MAAM,0BAA0B,CAAA;AAC3E,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,SAAS,EAAE,EAAE,yBAAyB,EAAE,MAAM,oCAAoC,CAAA;AAGzF,OAAO,EAAE,MAAM,EAAE,MAAM,0BAA0B,CAAA;AAEjD,MAAM,CAAC,MAAM,mCAAmC,GAAG,yBAAyB,CAAC;IAC3E,WAAW,EAAE,kBAAkB;CAChC,CAAC,CAAA;AAOF,MAAM,UAAU,4BAA4B,CAAC,EAAE,KAAK,EAAqC;IACvF,MAAM,UAAU,GAAG,aAAa,EAAE,CAAA;IAElC,MAAM,gBAAgB,GAAG,GAAG,EAAE;QAC5B,MAAM,CAAC,WAAW,EAAE,CAAA;QACpB,UAAU,CAAC,MAAM,EAAE,CAAA;QACnB,qBAAqB,CAAC,GAAG,EAAE;YACzB,UAAU,CAAC,QAAQ,CAAC,KAAK,EAAE;gBACzB,MAAM,EAAE,mCAAmC;gBAC3C,MAAM,EAAE,EAAE,GAAG,KAAK,CAAC,MAAM,EAAE;aAC5B,CAAC,CAAA;QACJ,CAAC,CAAC,CAAA;IACJ,CAAC,CAAA;IAED,MAAM,eAAe,GAAG,GAAG,EAAE;QAC3B,MAAM,CAAC,WAAW,EAAE,CAAA;QACpB,UAAU,CAAC,MAAM,EAAE,CAAA;QACnB,qBAAqB,CAAC,GAAG,EAAE;YACzB,UAAU,CAAC,QAAQ,CAAC,KAAK,EAAE;gBACzB,MAAM,EAAE,wCAAwC;gBAChD,MAAM,EAAE,EAAE,GAAG,KAAK,CAAC,MAAM,EAAE;aAC5B,CAAC,CAAA;QACJ,CAAC,CAAC,CAAA;IACJ,CAAC,CAAA;IAED,OAAO,CACL,CAAC,SAAS,CAAC,IAAI,CACb;MAAA,CAAC,SAAS,CAAC,MAAM,CACf;QAAA,CAAC,SAAS,CAAC,WAAW,CAAC,uBAAuB,EAAE,SAAS,CAAC,WAAW,CACvE;MAAA,EAAE,SAAS,CAAC,MAAM,CAClB;MAAA,CAAC,SAAS,CAAC,MAAM,CACf,KAAK,CAAC,OAAO,CACb,OAAO,CAAC,CAAC,gBAAgB,CAAC,CAC1B,iBAAiB,CAAC,8BAA8B,EAElD;MAAA,CAAC,SAAS,CAAC,MAAM,CACf,KAAK,CAAC,MAAM,CACZ,OAAO,CAAC,CAAC,eAAe,CAAC,CACzB,iBAAiB,CAAC,6BAA6B,EAEnD;IAAA,EAAE,SAAS,CAAC,IAAI,CAAC,CAClB,CAAA;AACH,CAAC","sourcesContent":["import { StaticScreenProps, useNavigation } from '@react-navigation/native'\nimport React from 'react'\nimport FormSheet, { getFormSheetScreenOptions } from '../components/primitive/form_sheet'\nimport { AppName } from '../types/resources/app_name'\nimport { GraphId } from '../types/resources/group_resource'\nimport { Haptic } from '../utils/native_adapters'\n\nexport const ConversationSelectTypeScreenOptions = getFormSheetScreenOptions({\n headerTitle: 'New conversation',\n})\n\nexport type ConversationSelectTypeScreenProps = StaticScreenProps<{\n chat_group_graph_id?: GraphId\n group_source_app_name?: AppName\n}>\n\nexport function ConversationSelectTypeScreen({ route }: ConversationSelectTypeScreenProps) {\n const navigation = useNavigation()\n\n const handleGroupPress = () => {\n Haptic.impactLight()\n navigation.goBack()\n requestAnimationFrame(() => {\n navigation.navigate('New', {\n screen: 'ConversationSelectGroupRecipients',\n params: { ...route.params },\n })\n })\n }\n\n const handleTeamPress = () => {\n Haptic.impactLight()\n navigation.goBack()\n requestAnimationFrame(() => {\n navigation.navigate('New', {\n screen: 'ConversationSelectTeamsILeadRecipients',\n params: { ...route.params },\n })\n })\n }\n\n return (\n <FormSheet.Root>\n <FormSheet.Header>\n <FormSheet.HeaderTitle>Start a conversation by</FormSheet.HeaderTitle>\n </FormSheet.Header>\n <FormSheet.Action\n title=\"Group\"\n onPress={handleGroupPress}\n accessibilityHint=\"Opens group selection screen\"\n />\n <FormSheet.Action\n title=\"Team\"\n onPress={handleTeamPress}\n accessibilityHint=\"Opens team selection screen\"\n />\n </FormSheet.Root>\n )\n}\n"]}
1
+ {"version":3,"file":"conversation_select_type_screen.js","sourceRoot":"","sources":["../../src/screens/conversation_select_type_screen.tsx"],"names":[],"mappings":"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","sourcesContent":["import { StaticScreenProps, useNavigation } from '@react-navigation/native'\nimport React from 'react'\nimport FormSheet, { getFormSheetScreenOptions } from '../components/primitive/form_sheet'\nimport { useNewConversationEntry } from '../hooks/use_new_conversation_entry'\nimport type { NewConversationFromFilter } from '../hooks/use_new_conversation_from_filter'\nimport { AppName } from '../types/resources/app_name'\nimport { GraphId } from '../types/resources/group_resource'\nimport { Haptic } from '../utils/native_adapters'\n\nexport const ConversationSelectTypeScreenOptions = getFormSheetScreenOptions({\n headerTitle: 'New conversation',\n})\n\nexport type ConversationSelectTypeScreenProps = StaticScreenProps<{\n chat_group_graph_id?: GraphId\n group_source_app_name?: AppName\n newConversationFromFilter?: NewConversationFromFilter\n}>\n\nexport function ConversationSelectTypeScreen({ route }: ConversationSelectTypeScreenProps) {\n const navigation = useNavigation()\n const entryMode = useNewConversationEntry()\n const { newConversationFromFilter, chat_group_graph_id, group_source_app_name } =\n route.params || {}\n\n const filterParams = { chat_group_graph_id, group_source_app_name }\n const canCreateGroups = entryMode === 'select_type' || entryMode === 'groups'\n const canCreateTeams = entryMode === 'select_type' || entryMode === 'teams'\n\n const handleFilterPress = () => {\n if (!newConversationFromFilter) return\n\n Haptic.impactLight()\n navigation.goBack()\n requestAnimationFrame(() => {\n if (newConversationFromFilter.sourceAppName === 'groups') {\n navigation.navigate('New', {\n screen: 'ConversationNew',\n params: {\n ...filterParams,\n source_app_name: 'Groups' as AppName,\n group_id: newConversationFromFilter.groupId,\n },\n })\n } else {\n navigation.navigate('New', {\n screen: 'ConversationNew',\n params: {\n ...filterParams,\n source_app_name: 'Services' as AppName,\n team_ids: newConversationFromFilter.teamIds,\n },\n })\n }\n })\n }\n\n const handleGroupPress = () => {\n Haptic.impactLight()\n navigation.goBack()\n requestAnimationFrame(() => {\n navigation.navigate('New', {\n screen: 'ConversationSelectGroupRecipients',\n params: filterParams,\n })\n })\n }\n\n const handleTeamPress = () => {\n Haptic.impactLight()\n navigation.goBack()\n requestAnimationFrame(() => {\n navigation.navigate('New', {\n screen: 'ConversationSelectTeamsILeadRecipients',\n params: filterParams,\n })\n })\n }\n\n return (\n <FormSheet.Root>\n <FormSheet.Header>\n <FormSheet.HeaderTitle>Start a conversation by</FormSheet.HeaderTitle>\n </FormSheet.Header>\n {newConversationFromFilter && (\n <FormSheet.Action\n title={`New conversation in ${newConversationFromFilter.name}`}\n onPress={handleFilterPress}\n accessibilityHint=\"Creates a conversation pre-scoped to the current filter\"\n />\n )}\n {canCreateGroups && (\n <FormSheet.Action\n title=\"Group\"\n onPress={handleGroupPress}\n accessibilityHint=\"Opens group selection screen\"\n />\n )}\n {canCreateTeams && (\n <FormSheet.Action\n title=\"Team\"\n onPress={handleTeamPress}\n accessibilityHint=\"Opens team selection screen\"\n />\n )}\n </FormSheet.Root>\n )\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"list_header_component.d.ts","sourceRoot":"","sources":["../../../../src/screens/conversations/components/list_header_component.tsx"],"names":[],"mappings":"AACA,OAAO,KAA+B,MAAM,OAAO,CAAA;AAwBnD,eAAO,MAAM,mBAAmB,yBA+K/B,CAAA"}
1
+ {"version":3,"file":"list_header_component.d.ts","sourceRoot":"","sources":["../../../../src/screens/conversations/components/list_header_component.tsx"],"names":[],"mappings":"AACA,OAAO,KAA+B,MAAM,OAAO,CAAA;AA0BnD,eAAO,MAAM,mBAAmB,yBAqL/B,CAAA"}
@@ -8,6 +8,7 @@ import { useAppName } from '../../../hooks/use_app_name';
8
8
  import { useMarkAllRead } from '../../../hooks/use_conversations_actions';
9
9
  import { useCanDisplayGroups } from '../../../hooks/use_groups';
10
10
  import { useNewConversationEntry } from '../../../hooks/use_new_conversation_entry';
11
+ import { useNewConversationFromFilter } from '../../../hooks/use_new_conversation_from_filter';
11
12
  import { MAX_FONT_SIZE_MULTIPLIER_LANDMARK } from '../../../utils';
12
13
  import { Haptic } from '../../../utils/native_adapters';
13
14
  import { ChatGroupBadge } from './chat_group_badge';
@@ -30,6 +31,7 @@ export const ListHeaderComponent = () => {
30
31
  const { markAllRead, isPending } = useMarkAllRead();
31
32
  const canCreateConversations = useCanCreateConversations();
32
33
  const entryMode = useNewConversationEntry();
34
+ const newConversationFromFilter = useNewConversationFromFilter(chat_group_graph_id);
33
35
  const appName = useAppName();
34
36
  const active = useMemo(() => {
35
37
  if (chat_group_graph_id) {
@@ -44,8 +46,11 @@ export const ListHeaderComponent = () => {
44
46
  return FilterTypes.All;
45
47
  }, [chat_group_graph_id, group_source_app_name]);
46
48
  const handleNewConversationNavigation = useCallback(() => {
47
- if (entryMode === 'select_type') {
48
- return navigation.navigate('ConversationSelectType', { ...route.params });
49
+ if (newConversationFromFilter || entryMode === 'select_type') {
50
+ return navigation.navigate('ConversationSelectType', {
51
+ ...route.params,
52
+ newConversationFromFilter,
53
+ });
49
54
  }
50
55
  if (entryMode === 'groups') {
51
56
  return navigation.navigate('New', {
@@ -59,7 +64,7 @@ export const ListHeaderComponent = () => {
59
64
  params: { ...route.params },
60
65
  });
61
66
  }
62
- }, [navigation, route.params, entryMode]);
67
+ }, [navigation, route.params, entryMode, newConversationFromFilter]);
63
68
  const handleMoreOptions = useCallback(() => {
64
69
  navigation.navigate('ConversationsMoreActions');
65
70
  }, [navigation]);
@@ -1 +1 @@
1
- {"version":3,"file":"list_header_component.js","sourceRoot":"","sources":["../../../../src/screens/conversations/components/list_header_component.tsx"],"names":[],"mappings":"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","sourcesContent":["import { RouteProp, useNavigation, useRoute } from '@react-navigation/native'\nimport React, { useCallback, useMemo } from 'react'\nimport { Alert, ScrollView, StyleSheet, View } from 'react-native'\nimport { Heading, TextButton, ToggleButton } from '../../../components'\nimport { useAtFontScaleBreakpoint, useCurrentPersonCache, useTheme } from '../../../hooks'\nimport { useCanCreateConversations } from '../../../hooks'\nimport { useAppName } from '../../../hooks/use_app_name'\nimport { useMarkAllRead } from '../../../hooks/use_conversations_actions'\nimport { useCanDisplayGroups } from '../../../hooks/use_groups'\nimport { useNewConversationEntry } from '../../../hooks/use_new_conversation_entry'\nimport { MAX_FONT_SIZE_MULTIPLIER_LANDMARK } from '../../../utils'\nimport { Haptic } from '../../../utils/native_adapters'\nimport { ConversationsScreenProps } from '../conversations_screen'\nimport { ChatGroupBadge } from './chat_group_badge'\nimport { ListHeaderActionButton } from './list_header_action_button'\n\nconst ROW_PADDING_HORIZONTAL = 16\n\nenum FilterTypes {\n All = 'All',\n Groups = 'Groups',\n Teams = 'Teams',\n More = 'More',\n}\n\nexport const ListHeaderComponent = () => {\n const navigation = useNavigation()\n const canFilterByTeams = useCanDisplayGroups({ source_app_name: 'Services', source_type: 'Team' })\n const canFilterByGroups = useCanDisplayGroups({ source_app_name: 'Groups', source_type: 'Group' })\n const route = useRoute<RouteProp<ConversationsScreenProps['route']>>()\n const { chat_group_graph_id, group_source_app_name = '' } = route.params || {}\n const currentPersonCache = useCurrentPersonCache()\n const { markAllRead, isPending } = useMarkAllRead()\n const canCreateConversations = useCanCreateConversations()\n const entryMode = useNewConversationEntry()\n const appName = useAppName()\n\n const active: FilterTypes = useMemo(() => {\n if (chat_group_graph_id) {\n return FilterTypes.More\n } else if (/groups/i.test(group_source_app_name)) {\n return FilterTypes.Groups\n } else if (/services/i.test(group_source_app_name)) {\n return FilterTypes.Teams\n }\n\n return FilterTypes.All\n }, [chat_group_graph_id, group_source_app_name])\n\n const handleNewConversationNavigation = useCallback(() => {\n if (entryMode === 'select_type') {\n return navigation.navigate('ConversationSelectType', { ...route.params })\n }\n\n if (entryMode === 'groups') {\n return navigation.navigate('New', {\n screen: 'ConversationSelectGroupRecipients',\n params: { ...route.params },\n })\n }\n\n if (entryMode === 'teams') {\n return navigation.navigate('New', {\n screen: 'ConversationSelectTeamsILeadRecipients',\n params: { ...route.params },\n })\n }\n }, [navigation, route.params, entryMode])\n\n const handleMoreOptions = useCallback(() => {\n navigation.navigate('ConversationsMoreActions')\n }, [navigation])\n\n const handleOpenConversationFilters = useCallback(() => {\n navigation.navigate('ConversationFilters', {\n chat_group_graph_id,\n group_source_app_name,\n })\n }, [navigation, chat_group_graph_id, group_source_app_name])\n\n const handleMarkAllRead = useCallback(() => {\n currentPersonCache.update({ unreadCount: 0 })\n Haptic.notificationSuccess()\n markAllRead()\n }, [currentPersonCache, markAllRead])\n\n const alertMarkAllRead = useCallback(() => {\n if (active === FilterTypes.All) return handleMarkAllRead()\n\n Alert.alert('Mark all read', 'This includes conversations not shown by the current filter.', [\n { text: 'Cancel' },\n { text: 'OK', onPress: () => handleMarkAllRead() },\n ])\n }, [active, handleMarkAllRead])\n\n const hasSomeSourceFilterCapability = canFilterByTeams || canFilterByGroups\n const hasMultiSourceFilterCapabilities = canFilterByTeams && canFilterByGroups\n const shouldShowHeaderFiltersButton =\n hasSomeSourceFilterCapability && !hasMultiSourceFilterCapabilities\n const moreFiltersButtonA11yLabel = shouldShowHeaderFiltersButton\n ? 'View filters'\n : 'View more filters'\n\n const moreFiltersButtonProps = {\n onPress: handleOpenConversationFilters,\n active: active === FilterTypes.More,\n iconNameRight: 'general.threeReducingHorizontalBars' as const,\n accessibilityLabel: moreFiltersButtonA11yLabel,\n }\n\n const styles = useStyles({ shouldShowHeaderFiltersButton })\n\n return (\n <View style={styles.listHeader}>\n <View style={styles.headingRow}>\n <View style={styles.titleContainer}>\n <Heading numberOfLines={1} variant=\"h2\">\n Conversations\n </Heading>\n <TextButton\n onPress={alertMarkAllRead}\n disabled={isPending}\n maxFontSizeMultiplier={MAX_FONT_SIZE_MULTIPLIER_LANDMARK}\n accessibilityShowsLargeContentViewer\n accessibilityLargeContentTitle=\"Mark all read\"\n >\n Mark all read\n </TextButton>\n </View>\n <View style={styles.actionsContainer}>\n {canCreateConversations && (\n <ListHeaderActionButton\n name=\"churchCenter.signups\"\n onPress={handleNewConversationNavigation}\n accessibilityLabel=\"New conversation\"\n testID=\"conversations-new-conversation-button\"\n maxFontSizeMultiplier={MAX_FONT_SIZE_MULTIPLIER_LANDMARK}\n />\n )}\n {appName !== 'services' && (\n <ListHeaderActionButton\n name=\"general.threeDots\"\n onPress={handleMoreOptions}\n accessibilityLabel=\"More options\"\n maxFontSizeMultiplier={MAX_FONT_SIZE_MULTIPLIER_LANDMARK}\n />\n )}\n {shouldShowHeaderFiltersButton && <ToggleButton {...moreFiltersButtonProps} />}\n </View>\n </View>\n {hasMultiSourceFilterCapabilities && (\n <ScrollView\n horizontal\n showsHorizontalScrollIndicator={false}\n contentContainerStyle={styles.filterRow}\n accessibilityRole=\"toolbar\"\n >\n <ToggleButton\n title={FilterTypes.All}\n active={active === FilterTypes.All}\n onPress={() =>\n navigation.setParams({\n chat_group_graph_id: undefined,\n group_source_app_name: undefined,\n })\n }\n accessibilityLabel=\"Show all conversations\"\n style={styles.filterButton}\n />\n <ToggleButton\n title={FilterTypes.Groups}\n active={active === FilterTypes.Groups}\n onPress={() =>\n navigation.setParams({\n chat_group_graph_id: undefined,\n group_source_app_name: 'Groups',\n })\n }\n accessibilityLabel=\"Filter to group conversations\"\n style={styles.filterButton}\n />\n\n <ToggleButton\n title={FilterTypes.Teams}\n active={active === FilterTypes.Teams}\n onPress={() =>\n navigation.setParams({\n chat_group_graph_id: undefined,\n group_source_app_name: 'Services',\n })\n }\n accessibilityLabel=\"Filter to team conversations\"\n style={styles.filterButton}\n />\n <ToggleButton {...moreFiltersButtonProps} />\n </ScrollView>\n )}\n <ChatGroupBadge rowPaddingHorizontal={ROW_PADDING_HORIZONTAL} />\n </View>\n )\n}\n\nconst useStyles = ({\n shouldShowHeaderFiltersButton,\n}: {\n shouldShowHeaderFiltersButton: boolean\n}) => {\n const theme = useTheme()\n const atFontScaleBreakpoint = useAtFontScaleBreakpoint(\n shouldShowHeaderFiltersButton ? 1.2 : undefined\n )\n\n return StyleSheet.create({\n listHeader: {\n borderBottomWidth: 1,\n borderBottomColor: theme.colors.fillColorNeutral050Base,\n paddingBottom: 16,\n gap: 16,\n },\n headingRow: {\n gap: 12,\n flexDirection: atFontScaleBreakpoint ? 'column' : 'row',\n alignItems: atFontScaleBreakpoint ? 'flex-start' : 'center',\n justifyContent: 'space-between',\n paddingBottom: atFontScaleBreakpoint ? 4 : 0,\n paddingHorizontal: ROW_PADDING_HORIZONTAL,\n },\n titleContainer: {\n gap: 8,\n },\n actionsContainer: {\n flexDirection: 'row',\n gap: 8,\n alignItems: 'center',\n },\n markAllReadRow: {\n paddingBottom: 4,\n },\n filterRow: {\n flexDirection: 'row',\n justifyContent: 'flex-start',\n gap: 8,\n paddingHorizontal: ROW_PADDING_HORIZONTAL,\n flexGrow: 1,\n },\n filterButton: {\n flex: 1,\n minWidth: 65,\n },\n })\n}\n"]}
1
+ {"version":3,"file":"list_header_component.js","sourceRoot":"","sources":["../../../../src/screens/conversations/components/list_header_component.tsx"],"names":[],"mappings":"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","sourcesContent":["import { RouteProp, useNavigation, useRoute } from '@react-navigation/native'\nimport React, { useCallback, useMemo } from 'react'\nimport { Alert, ScrollView, StyleSheet, View } from 'react-native'\nimport { Heading, TextButton, ToggleButton } from '../../../components'\nimport { useAtFontScaleBreakpoint, useCurrentPersonCache, useTheme } from '../../../hooks'\nimport { useCanCreateConversations } from '../../../hooks'\nimport { useAppName } from '../../../hooks/use_app_name'\nimport { useMarkAllRead } from '../../../hooks/use_conversations_actions'\nimport { useCanDisplayGroups } from '../../../hooks/use_groups'\nimport { useNewConversationEntry } from '../../../hooks/use_new_conversation_entry'\nimport { useNewConversationFromFilter } from '../../../hooks/use_new_conversation_from_filter'\nimport { GraphId } from '../../../types/resources/group_resource'\nimport { MAX_FONT_SIZE_MULTIPLIER_LANDMARK } from '../../../utils'\nimport { Haptic } from '../../../utils/native_adapters'\nimport { ConversationsScreenProps } from '../conversations_screen'\nimport { ChatGroupBadge } from './chat_group_badge'\nimport { ListHeaderActionButton } from './list_header_action_button'\n\nconst ROW_PADDING_HORIZONTAL = 16\n\nenum FilterTypes {\n All = 'All',\n Groups = 'Groups',\n Teams = 'Teams',\n More = 'More',\n}\n\nexport const ListHeaderComponent = () => {\n const navigation = useNavigation()\n const canFilterByTeams = useCanDisplayGroups({ source_app_name: 'Services', source_type: 'Team' })\n const canFilterByGroups = useCanDisplayGroups({ source_app_name: 'Groups', source_type: 'Group' })\n const route = useRoute<RouteProp<ConversationsScreenProps['route']>>()\n const { chat_group_graph_id, group_source_app_name = '' } = route.params || {}\n const currentPersonCache = useCurrentPersonCache()\n const { markAllRead, isPending } = useMarkAllRead()\n const canCreateConversations = useCanCreateConversations()\n const entryMode = useNewConversationEntry()\n const newConversationFromFilter = useNewConversationFromFilter(\n chat_group_graph_id as GraphId | undefined\n )\n const appName = useAppName()\n\n const active: FilterTypes = useMemo(() => {\n if (chat_group_graph_id) {\n return FilterTypes.More\n } else if (/groups/i.test(group_source_app_name)) {\n return FilterTypes.Groups\n } else if (/services/i.test(group_source_app_name)) {\n return FilterTypes.Teams\n }\n\n return FilterTypes.All\n }, [chat_group_graph_id, group_source_app_name])\n\n const handleNewConversationNavigation = useCallback(() => {\n if (newConversationFromFilter || entryMode === 'select_type') {\n return navigation.navigate('ConversationSelectType', {\n ...route.params,\n newConversationFromFilter,\n })\n }\n\n if (entryMode === 'groups') {\n return navigation.navigate('New', {\n screen: 'ConversationSelectGroupRecipients',\n params: { ...route.params },\n })\n }\n\n if (entryMode === 'teams') {\n return navigation.navigate('New', {\n screen: 'ConversationSelectTeamsILeadRecipients',\n params: { ...route.params },\n })\n }\n }, [navigation, route.params, entryMode, newConversationFromFilter])\n\n const handleMoreOptions = useCallback(() => {\n navigation.navigate('ConversationsMoreActions')\n }, [navigation])\n\n const handleOpenConversationFilters = useCallback(() => {\n navigation.navigate('ConversationFilters', {\n chat_group_graph_id,\n group_source_app_name,\n })\n }, [navigation, chat_group_graph_id, group_source_app_name])\n\n const handleMarkAllRead = useCallback(() => {\n currentPersonCache.update({ unreadCount: 0 })\n Haptic.notificationSuccess()\n markAllRead()\n }, [currentPersonCache, markAllRead])\n\n const alertMarkAllRead = useCallback(() => {\n if (active === FilterTypes.All) return handleMarkAllRead()\n\n Alert.alert('Mark all read', 'This includes conversations not shown by the current filter.', [\n { text: 'Cancel' },\n { text: 'OK', onPress: () => handleMarkAllRead() },\n ])\n }, [active, handleMarkAllRead])\n\n const hasSomeSourceFilterCapability = canFilterByTeams || canFilterByGroups\n const hasMultiSourceFilterCapabilities = canFilterByTeams && canFilterByGroups\n const shouldShowHeaderFiltersButton =\n hasSomeSourceFilterCapability && !hasMultiSourceFilterCapabilities\n const moreFiltersButtonA11yLabel = shouldShowHeaderFiltersButton\n ? 'View filters'\n : 'View more filters'\n\n const moreFiltersButtonProps = {\n onPress: handleOpenConversationFilters,\n active: active === FilterTypes.More,\n iconNameRight: 'general.threeReducingHorizontalBars' as const,\n accessibilityLabel: moreFiltersButtonA11yLabel,\n }\n\n const styles = useStyles({ shouldShowHeaderFiltersButton })\n\n return (\n <View style={styles.listHeader}>\n <View style={styles.headingRow}>\n <View style={styles.titleContainer}>\n <Heading numberOfLines={1} variant=\"h2\">\n Conversations\n </Heading>\n <TextButton\n onPress={alertMarkAllRead}\n disabled={isPending}\n maxFontSizeMultiplier={MAX_FONT_SIZE_MULTIPLIER_LANDMARK}\n accessibilityShowsLargeContentViewer\n accessibilityLargeContentTitle=\"Mark all read\"\n >\n Mark all read\n </TextButton>\n </View>\n <View style={styles.actionsContainer}>\n {canCreateConversations && (\n <ListHeaderActionButton\n name=\"churchCenter.signups\"\n onPress={handleNewConversationNavigation}\n accessibilityLabel=\"New conversation\"\n testID=\"conversations-new-conversation-button\"\n maxFontSizeMultiplier={MAX_FONT_SIZE_MULTIPLIER_LANDMARK}\n />\n )}\n {appName !== 'services' && (\n <ListHeaderActionButton\n name=\"general.threeDots\"\n onPress={handleMoreOptions}\n accessibilityLabel=\"More options\"\n maxFontSizeMultiplier={MAX_FONT_SIZE_MULTIPLIER_LANDMARK}\n />\n )}\n {shouldShowHeaderFiltersButton && <ToggleButton {...moreFiltersButtonProps} />}\n </View>\n </View>\n {hasMultiSourceFilterCapabilities && (\n <ScrollView\n horizontal\n showsHorizontalScrollIndicator={false}\n contentContainerStyle={styles.filterRow}\n accessibilityRole=\"toolbar\"\n >\n <ToggleButton\n title={FilterTypes.All}\n active={active === FilterTypes.All}\n onPress={() =>\n navigation.setParams({\n chat_group_graph_id: undefined,\n group_source_app_name: undefined,\n })\n }\n accessibilityLabel=\"Show all conversations\"\n style={styles.filterButton}\n />\n <ToggleButton\n title={FilterTypes.Groups}\n active={active === FilterTypes.Groups}\n onPress={() =>\n navigation.setParams({\n chat_group_graph_id: undefined,\n group_source_app_name: 'Groups',\n })\n }\n accessibilityLabel=\"Filter to group conversations\"\n style={styles.filterButton}\n />\n\n <ToggleButton\n title={FilterTypes.Teams}\n active={active === FilterTypes.Teams}\n onPress={() =>\n navigation.setParams({\n chat_group_graph_id: undefined,\n group_source_app_name: 'Services',\n })\n }\n accessibilityLabel=\"Filter to team conversations\"\n style={styles.filterButton}\n />\n <ToggleButton {...moreFiltersButtonProps} />\n </ScrollView>\n )}\n <ChatGroupBadge rowPaddingHorizontal={ROW_PADDING_HORIZONTAL} />\n </View>\n )\n}\n\nconst useStyles = ({\n shouldShowHeaderFiltersButton,\n}: {\n shouldShowHeaderFiltersButton: boolean\n}) => {\n const theme = useTheme()\n const atFontScaleBreakpoint = useAtFontScaleBreakpoint(\n shouldShowHeaderFiltersButton ? 1.2 : undefined\n )\n\n return StyleSheet.create({\n listHeader: {\n borderBottomWidth: 1,\n borderBottomColor: theme.colors.fillColorNeutral050Base,\n paddingBottom: 16,\n gap: 16,\n },\n headingRow: {\n gap: 12,\n flexDirection: atFontScaleBreakpoint ? 'column' : 'row',\n alignItems: atFontScaleBreakpoint ? 'flex-start' : 'center',\n justifyContent: 'space-between',\n paddingBottom: atFontScaleBreakpoint ? 4 : 0,\n paddingHorizontal: ROW_PADDING_HORIZONTAL,\n },\n titleContainer: {\n gap: 8,\n },\n actionsContainer: {\n flexDirection: 'row',\n gap: 8,\n alignItems: 'center',\n },\n markAllReadRow: {\n paddingBottom: 4,\n },\n filterRow: {\n flexDirection: 'row',\n justifyContent: 'flex-start',\n gap: 8,\n paddingHorizontal: ROW_PADDING_HORIZONTAL,\n flexGrow: 1,\n },\n filterButton: {\n flex: 1,\n minWidth: 65,\n },\n })\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@planningcenter/chat-react-native",
3
- "version": "3.31.0-rc.2",
3
+ "version": "3.31.0-rc.3",
4
4
  "description": "",
5
5
  "main": "build/index.js",
6
6
  "types": "build/index.d.ts",
@@ -64,5 +64,5 @@
64
64
  "react-native-url-polyfill": "^2.0.0",
65
65
  "typescript": "<5.6.0"
66
66
  },
67
- "gitHead": "a98992870b2d23326ff218e8a1210296f69789db"
67
+ "gitHead": "6473265458f0f5c60670f6fdedff1a333a65898a"
68
68
  }
@@ -0,0 +1,65 @@
1
+ import { useMemo } from 'react'
2
+ import { GroupResource, GraphId } from '../types/resources/group_resource'
3
+ import { GroupsGroupResource } from '../types/resources/groups/groups_group_resource'
4
+ import { destructureChatGroupGraphId } from '../utils'
5
+ import { useApiGet } from './use_api'
6
+ import { useNewConversationEntry } from './use_new_conversation_entry'
7
+
8
+ export type NewConversationFromFilter =
9
+ | {
10
+ name: string
11
+ sourceAppName: 'groups'
12
+ groupId: number
13
+ }
14
+ | {
15
+ name: string
16
+ sourceAppName: 'services'
17
+ teamIds: number[]
18
+ }
19
+
20
+ export function useNewConversationFromFilter(
21
+ chatGroupGraphId?: GraphId
22
+ ): NewConversationFromFilter | undefined {
23
+ const { sourceAppName, sourceType, sourceId } = destructureChatGroupGraphId(chatGroupGraphId)
24
+ const entryMode = useNewConversationEntry()
25
+ const isGroupsGroup = sourceAppName === 'Groups' && sourceType === 'Group'
26
+ const isServicesTeam = sourceAppName === 'Services' && sourceType === 'Team'
27
+
28
+ const { data: group } = useApiGet<GroupResource>({
29
+ url: `/me/groups/${chatGroupGraphId}`,
30
+ data: { fields: { Group: ['name'] } },
31
+ enabled: !!chatGroupGraphId,
32
+ app: 'chat',
33
+ })
34
+
35
+ const { data: groupsGroup } = useApiGet<GroupsGroupResource>({
36
+ url: `/me/groups/${sourceId}`,
37
+ data: { fields: { Group: ['can_create_conversation'] } },
38
+ enabled: isGroupsGroup && !!sourceId,
39
+ app: 'groups',
40
+ })
41
+
42
+ return useMemo(() => {
43
+ if (isGroupsGroup && group?.name && sourceId) {
44
+ const canCreate = entryMode === 'select_type' || entryMode === 'groups'
45
+ if (!canCreate) return undefined
46
+ if (!groupsGroup?.canCreateConversation) return undefined
47
+ return { name: group.name, sourceAppName: 'groups', groupId: sourceId }
48
+ }
49
+
50
+ if (isServicesTeam && group?.name && sourceId) {
51
+ const canCreate = entryMode === 'select_type' || entryMode === 'teams'
52
+ if (!canCreate) return undefined
53
+ return { name: group.name, sourceAppName: 'services', teamIds: [sourceId] }
54
+ }
55
+
56
+ return undefined
57
+ }, [
58
+ group?.name,
59
+ sourceId,
60
+ entryMode,
61
+ isGroupsGroup,
62
+ isServicesTeam,
63
+ groupsGroup?.canCreateConversation,
64
+ ])
65
+ }
@@ -1,6 +1,8 @@
1
1
  import { StaticScreenProps, useNavigation } from '@react-navigation/native'
2
2
  import React from 'react'
3
3
  import FormSheet, { getFormSheetScreenOptions } from '../components/primitive/form_sheet'
4
+ import { useNewConversationEntry } from '../hooks/use_new_conversation_entry'
5
+ import type { NewConversationFromFilter } from '../hooks/use_new_conversation_from_filter'
4
6
  import { AppName } from '../types/resources/app_name'
5
7
  import { GraphId } from '../types/resources/group_resource'
6
8
  import { Haptic } from '../utils/native_adapters'
@@ -12,10 +14,46 @@ export const ConversationSelectTypeScreenOptions = getFormSheetScreenOptions({
12
14
  export type ConversationSelectTypeScreenProps = StaticScreenProps<{
13
15
  chat_group_graph_id?: GraphId
14
16
  group_source_app_name?: AppName
17
+ newConversationFromFilter?: NewConversationFromFilter
15
18
  }>
16
19
 
17
20
  export function ConversationSelectTypeScreen({ route }: ConversationSelectTypeScreenProps) {
18
21
  const navigation = useNavigation()
22
+ const entryMode = useNewConversationEntry()
23
+ const { newConversationFromFilter, chat_group_graph_id, group_source_app_name } =
24
+ route.params || {}
25
+
26
+ const filterParams = { chat_group_graph_id, group_source_app_name }
27
+ const canCreateGroups = entryMode === 'select_type' || entryMode === 'groups'
28
+ const canCreateTeams = entryMode === 'select_type' || entryMode === 'teams'
29
+
30
+ const handleFilterPress = () => {
31
+ if (!newConversationFromFilter) return
32
+
33
+ Haptic.impactLight()
34
+ navigation.goBack()
35
+ requestAnimationFrame(() => {
36
+ if (newConversationFromFilter.sourceAppName === 'groups') {
37
+ navigation.navigate('New', {
38
+ screen: 'ConversationNew',
39
+ params: {
40
+ ...filterParams,
41
+ source_app_name: 'Groups' as AppName,
42
+ group_id: newConversationFromFilter.groupId,
43
+ },
44
+ })
45
+ } else {
46
+ navigation.navigate('New', {
47
+ screen: 'ConversationNew',
48
+ params: {
49
+ ...filterParams,
50
+ source_app_name: 'Services' as AppName,
51
+ team_ids: newConversationFromFilter.teamIds,
52
+ },
53
+ })
54
+ }
55
+ })
56
+ }
19
57
 
20
58
  const handleGroupPress = () => {
21
59
  Haptic.impactLight()
@@ -23,7 +61,7 @@ export function ConversationSelectTypeScreen({ route }: ConversationSelectTypeSc
23
61
  requestAnimationFrame(() => {
24
62
  navigation.navigate('New', {
25
63
  screen: 'ConversationSelectGroupRecipients',
26
- params: { ...route.params },
64
+ params: filterParams,
27
65
  })
28
66
  })
29
67
  }
@@ -34,7 +72,7 @@ export function ConversationSelectTypeScreen({ route }: ConversationSelectTypeSc
34
72
  requestAnimationFrame(() => {
35
73
  navigation.navigate('New', {
36
74
  screen: 'ConversationSelectTeamsILeadRecipients',
37
- params: { ...route.params },
75
+ params: filterParams,
38
76
  })
39
77
  })
40
78
  }
@@ -44,16 +82,27 @@ export function ConversationSelectTypeScreen({ route }: ConversationSelectTypeSc
44
82
  <FormSheet.Header>
45
83
  <FormSheet.HeaderTitle>Start a conversation by</FormSheet.HeaderTitle>
46
84
  </FormSheet.Header>
47
- <FormSheet.Action
48
- title="Group"
49
- onPress={handleGroupPress}
50
- accessibilityHint="Opens group selection screen"
51
- />
52
- <FormSheet.Action
53
- title="Team"
54
- onPress={handleTeamPress}
55
- accessibilityHint="Opens team selection screen"
56
- />
85
+ {newConversationFromFilter && (
86
+ <FormSheet.Action
87
+ title={`New conversation in ${newConversationFromFilter.name}`}
88
+ onPress={handleFilterPress}
89
+ accessibilityHint="Creates a conversation pre-scoped to the current filter"
90
+ />
91
+ )}
92
+ {canCreateGroups && (
93
+ <FormSheet.Action
94
+ title="Group"
95
+ onPress={handleGroupPress}
96
+ accessibilityHint="Opens group selection screen"
97
+ />
98
+ )}
99
+ {canCreateTeams && (
100
+ <FormSheet.Action
101
+ title="Team"
102
+ onPress={handleTeamPress}
103
+ accessibilityHint="Opens team selection screen"
104
+ />
105
+ )}
57
106
  </FormSheet.Root>
58
107
  )
59
108
  }
@@ -8,6 +8,8 @@ import { useAppName } from '../../../hooks/use_app_name'
8
8
  import { useMarkAllRead } from '../../../hooks/use_conversations_actions'
9
9
  import { useCanDisplayGroups } from '../../../hooks/use_groups'
10
10
  import { useNewConversationEntry } from '../../../hooks/use_new_conversation_entry'
11
+ import { useNewConversationFromFilter } from '../../../hooks/use_new_conversation_from_filter'
12
+ import { GraphId } from '../../../types/resources/group_resource'
11
13
  import { MAX_FONT_SIZE_MULTIPLIER_LANDMARK } from '../../../utils'
12
14
  import { Haptic } from '../../../utils/native_adapters'
13
15
  import { ConversationsScreenProps } from '../conversations_screen'
@@ -33,6 +35,9 @@ export const ListHeaderComponent = () => {
33
35
  const { markAllRead, isPending } = useMarkAllRead()
34
36
  const canCreateConversations = useCanCreateConversations()
35
37
  const entryMode = useNewConversationEntry()
38
+ const newConversationFromFilter = useNewConversationFromFilter(
39
+ chat_group_graph_id as GraphId | undefined
40
+ )
36
41
  const appName = useAppName()
37
42
 
38
43
  const active: FilterTypes = useMemo(() => {
@@ -48,8 +53,11 @@ export const ListHeaderComponent = () => {
48
53
  }, [chat_group_graph_id, group_source_app_name])
49
54
 
50
55
  const handleNewConversationNavigation = useCallback(() => {
51
- if (entryMode === 'select_type') {
52
- return navigation.navigate('ConversationSelectType', { ...route.params })
56
+ if (newConversationFromFilter || entryMode === 'select_type') {
57
+ return navigation.navigate('ConversationSelectType', {
58
+ ...route.params,
59
+ newConversationFromFilter,
60
+ })
53
61
  }
54
62
 
55
63
  if (entryMode === 'groups') {
@@ -65,7 +73,7 @@ export const ListHeaderComponent = () => {
65
73
  params: { ...route.params },
66
74
  })
67
75
  }
68
- }, [navigation, route.params, entryMode])
76
+ }, [navigation, route.params, entryMode, newConversationFromFilter])
69
77
 
70
78
  const handleMoreOptions = useCallback(() => {
71
79
  navigation.navigate('ConversationsMoreActions')