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

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 (60) hide show
  1. package/build/components/conversations/conversation_preview.d.ts.map +1 -1
  2. package/build/components/conversations/conversation_preview.js +3 -5
  3. package/build/components/conversations/conversation_preview.js.map +1 -1
  4. package/build/components/display/conversation_avatar.d.ts +16 -0
  5. package/build/components/display/conversation_avatar.d.ts.map +1 -0
  6. package/build/components/display/conversation_avatar.js +43 -0
  7. package/build/components/display/conversation_avatar.js.map +1 -0
  8. package/build/components/display/emoji_avatar.d.ts +10 -0
  9. package/build/components/display/emoji_avatar.d.ts.map +1 -0
  10. package/build/components/display/emoji_avatar.js +37 -0
  11. package/build/components/display/emoji_avatar.js.map +1 -0
  12. package/build/components/display/icon_avatar.d.ts +10 -0
  13. package/build/components/display/icon_avatar.d.ts.map +1 -0
  14. package/build/components/display/icon_avatar.js +36 -0
  15. package/build/components/display/icon_avatar.js.map +1 -0
  16. package/build/components/display/index.d.ts +3 -0
  17. package/build/components/display/index.d.ts.map +1 -1
  18. package/build/components/display/index.js +3 -0
  19. package/build/components/display/index.js.map +1 -1
  20. package/build/components/display/utils/avatar_gradient_colors.d.ts +14 -0
  21. package/build/components/display/utils/avatar_gradient_colors.d.ts.map +1 -0
  22. package/build/components/display/utils/avatar_gradient_colors.js +49 -0
  23. package/build/components/display/utils/avatar_gradient_colors.js.map +1 -0
  24. package/build/hooks/use_conversation.d.ts.map +1 -1
  25. package/build/hooks/use_conversation.js +4 -0
  26. package/build/hooks/use_conversation.js.map +1 -1
  27. package/build/hooks/use_new_conversation_from_filter.d.ts +12 -0
  28. package/build/hooks/use_new_conversation_from_filter.d.ts.map +1 -0
  29. package/build/hooks/use_new_conversation_from_filter.js +47 -0
  30. package/build/hooks/use_new_conversation_from_filter.js.map +1 -0
  31. package/build/screens/conversation_select_type_screen.d.ts +2 -0
  32. package/build/screens/conversation_select_type_screen.d.ts.map +1 -1
  33. package/build/screens/conversation_select_type_screen.js +39 -4
  34. package/build/screens/conversation_select_type_screen.js.map +1 -1
  35. package/build/screens/conversations/components/list_header_component.d.ts.map +1 -1
  36. package/build/screens/conversations/components/list_header_component.js +8 -3
  37. package/build/screens/conversations/components/list_header_component.js.map +1 -1
  38. package/build/screens/design_system_screen.d.ts.map +1 -1
  39. package/build/screens/design_system_screen.js +47 -1
  40. package/build/screens/design_system_screen.js.map +1 -1
  41. package/build/types/resources/conversation.d.ts +4 -0
  42. package/build/types/resources/conversation.d.ts.map +1 -1
  43. package/build/types/resources/conversation.js.map +1 -1
  44. package/build/utils/request/conversation.d.ts.map +1 -1
  45. package/build/utils/request/conversation.js +4 -0
  46. package/build/utils/request/conversation.js.map +1 -1
  47. package/package.json +2 -2
  48. package/src/components/conversations/conversation_preview.tsx +3 -7
  49. package/src/components/display/conversation_avatar.tsx +90 -0
  50. package/src/components/display/emoji_avatar.tsx +48 -0
  51. package/src/components/display/icon_avatar.tsx +52 -0
  52. package/src/components/display/index.ts +3 -0
  53. package/src/components/display/utils/avatar_gradient_colors.ts +87 -0
  54. package/src/hooks/use_conversation.ts +4 -0
  55. package/src/hooks/use_new_conversation_from_filter.ts +65 -0
  56. package/src/screens/conversation_select_type_screen.tsx +61 -12
  57. package/src/screens/conversations/components/list_header_component.tsx +11 -3
  58. package/src/screens/design_system_screen.tsx +66 -0
  59. package/src/types/resources/conversation.ts +4 -0
  60. package/src/utils/request/conversation.ts +4 -0
@@ -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"]}
@@ -1 +1 @@
1
- {"version":3,"file":"design_system_screen.d.ts","sourceRoot":"","sources":["../../src/screens/design_system_screen.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAmB,MAAM,OAAO,CAAA;AAmFvC,wBAAgB,kBAAkB,sBAiBjC"}
1
+ {"version":3,"file":"design_system_screen.d.ts","sourceRoot":"","sources":["../../src/screens/design_system_screen.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAmB,MAAM,OAAO,CAAA;AAsFvC,wBAAgB,kBAAkB,sBAiBjC"}
@@ -1,7 +1,7 @@
1
1
  import { FontAwesomeIcon } from '@fortawesome/react-native-fontawesome';
2
2
  import React, { useState } from 'react';
3
3
  import { Alert, Pressable, ScrollView, StyleSheet, View } from 'react-native';
4
- import { Avatar, AvatarGroup, Badge, Banner, BannerCollapsible, Button, ToggleButton, Heading, Icon, IconButton, Image, Person, Spinner, Switch, Text, TextButton, TextInlineButton, ImageAttachmentPreview, } from '../components/display';
4
+ import { Avatar, AvatarGroup, Badge, Banner, BannerCollapsible, Button, ConversationAvatar, EmojiAvatar, IconAvatar, ToggleButton, Heading, Icon, IconButton, Image, Person, Spinner, Switch, Text, TextButton, TextInlineButton, ImageAttachmentPreview, } from '../components/display';
5
5
  import { VideoAttachmentPreview } from '../components/display/video_attachment_preview';
6
6
  import BannerPrimitive from '../components/primitive/banner_primitive';
7
7
  import BlankState from '../components/primitive/blank_state_primitive';
@@ -417,6 +417,52 @@ function ImageIconsSection({ isLast }) {
417
417
  <AvatarGroup sourceUris={[]} showFallback={true} fallbackIconName="general.heart" size="sm"/>
418
418
  </Row>
419
419
  </Group>
420
+ <Group title="IconAvatar" description="Renders a FontAwesome icon centered on a gradient background. Used by ConversationAvatar for icon-type custom avatars, and reusable in the avatar picker UI.">
421
+ <Row>
422
+ <IconAvatar iconKey="church" color="warm-sunset" size="lg"/>
423
+ <IconAvatar iconKey="guitar" color="cosmic" size="lg"/>
424
+ <IconAvatar iconKey="music" color="iris" size="md"/>
425
+ <IconAvatar iconKey="dove" color="rose-teal" size="sm"/>
426
+ <IconAvatar iconKey="cross" color="gold" size="xs"/>
427
+ </Row>
428
+ <Row>
429
+ <IconAvatar iconKey="church" color="garden" size="lg"/>
430
+ <IconAvatar iconKey="church" color="twilight" size="lg"/>
431
+ <IconAvatar iconKey="church" color="amethyst" size="lg"/>
432
+ <IconAvatar iconKey="church" color="rainbow" size="lg"/>
433
+ </Row>
434
+ </Group>
435
+ <Group title="EmojiAvatar" description="Renders an emoji centered on a gradient background. Used by ConversationAvatar for emoji-type custom avatars.">
436
+ <Row>
437
+ <EmojiAvatar emoji="🎉" color="warm-sunset" size="lg"/>
438
+ <EmojiAvatar emoji="🔥" color="cosmic" size="lg"/>
439
+ <EmojiAvatar emoji="💬" color="iris" size="md"/>
440
+ <EmojiAvatar emoji="⭐" color="gold" size="sm"/>
441
+ <EmojiAvatar emoji="🎵" color="navy-purple" size="xs"/>
442
+ </Row>
443
+ </Group>
444
+ <Group title="ConversationAvatar" description="Smart avatar that resolves a conversation's custom avatar (image, icon, or emoji) or falls back to the member AvatarGroup. Takes a conversation object and delegates to IconAvatar, EmojiAvatar, or AvatarGroup.">
445
+ <Row>
446
+ <ConversationAvatar conversation={{
447
+ customAvatarType: 'icon',
448
+ customAvatarKey: 'church',
449
+ customAvatarColor: 'warm-sunset',
450
+ }}/>
451
+ <ConversationAvatar conversation={{
452
+ customAvatarType: 'emoji',
453
+ customAvatarKey: '🎉',
454
+ customAvatarColor: 'cosmic',
455
+ }}/>
456
+ <ConversationAvatar conversation={{
457
+ customAvatarType: 'image',
458
+ customAvatarImageUrl: URL.avatar,
459
+ }}/>
460
+ <ConversationAvatar conversation={{
461
+ previewAvatarUrls: URL.two_avatars,
462
+ }}/>
463
+ <ConversationAvatar conversation={{}} fallbackIconName="people.noTextMessage"/>
464
+ </Row>
465
+ </Group>
420
466
  <Group title="Icon" description="Displays any icon from @planningcenter/icons. Missing icons will fallback to a grey circle. Styling with `fontSize` will allow it to scale with the device's text a11y size.">
421
467
  <Row>
422
468
  {/* @ts-expect-error - Testing missing icon fallback */}