@planningcenter/chat-react-native 3.36.2-rc.3 → 3.37.0-rc.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.
@@ -8,10 +8,6 @@ export type GroupMembersForNewConversationResult = Omit<UseSuspensePaginatorResu
8
8
  adultMembers: MemberResource[];
9
9
  childMembers: MemberResource[];
10
10
  };
11
- /**
12
- * This is specifically for the new conversation screen because we assign
13
- * the "Conversation owner" badge to the current person.
14
- */
15
11
  export declare function useGroupMembersForNewConversation({ id, gender, }: {
16
12
  id: number;
17
13
  gender: string | null;
@@ -1 +1 @@
1
- {"version":3,"file":"use_group_members_for_new_conversation.d.ts","sourceRoot":"","sources":["../../../src/hooks/groups/use_group_members_for_new_conversation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,cAAc,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AACzE,OAAO,EAAE,yBAAyB,EAAE,MAAM,iEAAiE,CAAA;AAE3G,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAA;AAE1D,KAAK,0BAA0B,CAAC,CAAC,SAAS,cAAc,IAAI,UAAU,CACpE,OAAO,oBAAoB,CAAC,CAAC,CAAC,CAC/B,CAAA;AAED,MAAM,MAAM,oCAAoC,GAAG,IAAI,CACrD,0BAA0B,CAAC,yBAAyB,CAAC,EAAE,8CAA8C;AACrG,MAAM,CACP,GAAG;IACF,IAAI,EAAE,cAAc,EAAE,CAAA;IACtB,YAAY,EAAE,cAAc,EAAE,CAAA;IAC9B,YAAY,EAAE,cAAc,EAAE,CAAA;CAC/B,CAAA;AAED;;;GAGG;AACH,wBAAgB,iCAAiC,CAAC,EAChD,EAAE,EACF,MAAM,GACP,EAAE;IACD,EAAE,EAAE,MAAM,CAAA;IACV,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;CACtB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAwCA"}
1
+ {"version":3,"file":"use_group_members_for_new_conversation.d.ts","sourceRoot":"","sources":["../../../src/hooks/groups/use_group_members_for_new_conversation.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAC5D,OAAO,EAAE,yBAAyB,EAAE,MAAM,iEAAiE,CAAA;AAE3G,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAA;AAE1D,KAAK,0BAA0B,CAAC,CAAC,SAAS,cAAc,IAAI,UAAU,CACpE,OAAO,oBAAoB,CAAC,CAAC,CAAC,CAC/B,CAAA;AAED,MAAM,MAAM,oCAAoC,GAAG,IAAI,CACrD,0BAA0B,CAAC,yBAAyB,CAAC,EAAE,8CAA8C;AACrG,MAAM,CACP,GAAG;IACF,IAAI,EAAE,cAAc,EAAE,CAAA;IACtB,YAAY,EAAE,cAAc,EAAE,CAAA;IAC9B,YAAY,EAAE,cAAc,EAAE,CAAA;CAC/B,CAAA;AAED,wBAAgB,iCAAiC,CAAC,EAChD,EAAE,EACF,MAAM,GACP,EAAE;IACD,EAAE,EAAE,MAAM,CAAA;IACV,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;CACtB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA4CA"}
@@ -1,11 +1,7 @@
1
- import { useCurrentPerson } from '../use_current_person';
1
+ import { useMemo } from 'react';
2
+ import { useEnrichPeople } from '../use_enrich_people';
2
3
  import { useSuspensePaginator } from '../use_suspense_api';
3
- /**
4
- * This is specifically for the new conversation screen because we assign
5
- * the "Conversation owner" badge to the current person.
6
- */
7
4
  export function useGroupMembersForNewConversation({ id, gender, }) {
8
- const currentPerson = useCurrentPerson();
9
5
  const response = useSuspensePaginator({
10
6
  url: `/me/groups/${id}/memberships`,
11
7
  data: {
@@ -20,12 +16,15 @@ export function useGroupMembersForNewConversation({ id, gender, }) {
20
16
  app: 'groups',
21
17
  });
22
18
  const { data: memberships = [] } = response;
19
+ const personIds = useMemo(() => memberships.map(m => +m.person.id), [memberships]);
20
+ const enrichmentMap = useEnrichPeople({ personIds, groupId: id });
23
21
  const members = memberships.map(membership => {
24
22
  const { person } = membership;
23
+ const enrichment = enrichmentMap.get(+person.id);
25
24
  return {
26
25
  type: 'Member',
27
26
  avatar: person.avatarUrl,
28
- badges: buildBadges(membership, currentPerson.id),
27
+ badges: enrichment?.badges ?? [],
29
28
  child: person.child,
30
29
  gender: person.gender,
31
30
  id: +person.id,
@@ -43,15 +42,4 @@ export function useGroupMembersForNewConversation({ id, gender, }) {
43
42
  childMembers,
44
43
  };
45
44
  }
46
- function buildBadges(membership, currentPersonId) {
47
- const { person } = membership;
48
- const badges = [];
49
- if (membership.role === 'leader') {
50
- badges.push({ title: 'Leader' });
51
- }
52
- if (person.id === currentPersonId) {
53
- badges.push({ title: 'Conversation owner' });
54
- }
55
- return badges;
56
- }
57
45
  //# sourceMappingURL=use_group_members_for_new_conversation.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"use_group_members_for_new_conversation.js","sourceRoot":"","sources":["../../../src/hooks/groups/use_group_members_for_new_conversation.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAA;AACxD,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAA;AAe1D;;;GAGG;AACH,MAAM,UAAU,iCAAiC,CAAC,EAChD,EAAE,EACF,MAAM,GAIP;IACC,MAAM,aAAa,GAAG,gBAAgB,EAAE,CAAA;IACxC,MAAM,QAAQ,GAAG,oBAAoB,CAA4B;QAC/D,GAAG,EAAE,cAAc,EAAE,cAAc;QACnC,IAAI,EAAE;YACJ,OAAO,EAAE,GAAG;YACZ,OAAO,EAAE,CAAC,QAAQ,CAAC;YACnB,MAAM,EAAE;gBACN,UAAU,EAAE,CAAC,cAAc,CAAC;gBAC5B,MAAM,EAAE,CAAC,YAAY,EAAE,MAAM,EAAE,YAAY,EAAE,WAAW,EAAE,OAAO,EAAE,QAAQ,CAAC;aAC7E;YACD,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACzC;QACD,GAAG,EAAE,QAAQ;KACd,CAAC,CAAA;IAEF,MAAM,EAAE,IAAI,EAAE,WAAW,GAAG,EAAE,EAAE,GAAG,QAAQ,CAAA;IAC3C,MAAM,OAAO,GAAqB,WAAW,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE;QAC7D,MAAM,EAAE,MAAM,EAAE,GAAG,UAAU,CAAA;QAC7B,OAAO;YACL,IAAI,EAAE,QAAQ;YACd,MAAM,EAAE,MAAM,CAAC,SAAS;YACxB,MAAM,EAAE,WAAW,CAAC,UAAU,EAAE,aAAa,CAAC,EAAE,CAAC;YACjD,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE;YACd,IAAI,EAAE,GAAG,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,QAAQ,EAAE;YAC9C,MAAM,EAAE,EAAE;YACV,IAAI,EAAE,UAAU,CAAC,IAAI;SACtB,CAAA;IACH,CAAC,CAAC,CAAA;IACF,MAAM,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;IAC5D,MAAM,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;IAE3D,OAAO;QACL,GAAG,QAAQ;QACX,IAAI,EAAE,OAAO;QACb,YAAY;QACZ,YAAY;KACb,CAAA;AACH,CAAC;AAED,SAAS,WAAW,CAClB,UAAqC,EACrC,eAAuB;IAEvB,MAAM,EAAE,MAAM,EAAE,GAAG,UAAU,CAAA;IAC7B,MAAM,MAAM,GAAG,EAAE,CAAA;IACjB,IAAI,UAAU,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QACjC,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAA;IAClC,CAAC;IACD,IAAI,MAAM,CAAC,EAAE,KAAK,eAAe,EAAE,CAAC;QAClC,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,oBAAoB,EAAE,CAAC,CAAA;IAC9C,CAAC;IACD,OAAO,MAAM,CAAA;AACf,CAAC","sourcesContent":["import { MemberBadge, MemberResource, ResourceObject } from '../../types'\nimport { GroupsGroupMemberResource } from '../../types/resources/groups/groups_member_resource_with_person'\nimport { useCurrentPerson } from '../use_current_person'\nimport { useSuspensePaginator } from '../use_suspense_api'\n\ntype UseSuspensePaginatorResult<T extends ResourceObject> = ReturnType<\n typeof useSuspensePaginator<T>\n>\n\nexport type GroupMembersForNewConversationResult = Omit<\n UseSuspensePaginatorResult<GroupsGroupMemberResource>, // We are passing our own \"members\" data shape\n 'data'\n> & {\n data: MemberResource[]\n adultMembers: MemberResource[]\n childMembers: MemberResource[]\n}\n\n/**\n * This is specifically for the new conversation screen because we assign\n * the \"Conversation owner\" badge to the current person.\n */\nexport function useGroupMembersForNewConversation({\n id,\n gender,\n}: {\n id: number\n gender: string | null\n}) {\n const currentPerson = useCurrentPerson()\n const response = useSuspensePaginator<GroupsGroupMemberResource>({\n url: `/me/groups/${id}/memberships`,\n data: {\n perPage: 100,\n include: ['person'],\n fields: {\n Membership: ['person, role'],\n Person: ['avatar_url', 'name', 'first_name', 'last_name', 'child', 'gender'],\n },\n ...(gender ? { where: { gender } } : {}),\n },\n app: 'groups',\n })\n\n const { data: memberships = [] } = response\n const members: MemberResource[] = memberships.map(membership => {\n const { person } = membership\n return {\n type: 'Member',\n avatar: person.avatarUrl,\n badges: buildBadges(membership, currentPerson.id),\n child: person.child,\n gender: person.gender,\n id: +person.id,\n name: `${person.firstName} ${person.lastName}`,\n source: [],\n role: membership.role,\n }\n })\n const adultMembers = members.filter(member => !member.child)\n const childMembers = members.filter(member => member.child)\n\n return {\n ...response,\n data: members,\n adultMembers,\n childMembers,\n }\n}\n\nfunction buildBadges(\n membership: GroupsGroupMemberResource,\n currentPersonId: number\n): MemberBadge[] {\n const { person } = membership\n const badges = []\n if (membership.role === 'leader') {\n badges.push({ title: 'Leader' })\n }\n if (person.id === currentPersonId) {\n badges.push({ title: 'Conversation owner' })\n }\n return badges\n}\n"]}
1
+ {"version":3,"file":"use_group_members_for_new_conversation.js","sourceRoot":"","sources":["../../../src/hooks/groups/use_group_members_for_new_conversation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,OAAO,CAAA;AAG/B,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AACtD,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAA;AAe1D,MAAM,UAAU,iCAAiC,CAAC,EAChD,EAAE,EACF,MAAM,GAIP;IACC,MAAM,QAAQ,GAAG,oBAAoB,CAA4B;QAC/D,GAAG,EAAE,cAAc,EAAE,cAAc;QACnC,IAAI,EAAE;YACJ,OAAO,EAAE,GAAG;YACZ,OAAO,EAAE,CAAC,QAAQ,CAAC;YACnB,MAAM,EAAE;gBACN,UAAU,EAAE,CAAC,cAAc,CAAC;gBAC5B,MAAM,EAAE,CAAC,YAAY,EAAE,MAAM,EAAE,YAAY,EAAE,WAAW,EAAE,OAAO,EAAE,QAAQ,CAAC;aAC7E;YACD,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACzC;QACD,GAAG,EAAE,QAAQ;KACd,CAAC,CAAA;IAEF,MAAM,EAAE,IAAI,EAAE,WAAW,GAAG,EAAE,EAAE,GAAG,QAAQ,CAAA;IAC3C,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC,CAAA;IAClF,MAAM,aAAa,GAAG,eAAe,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAA;IAEjE,MAAM,OAAO,GAAqB,WAAW,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE;QAC7D,MAAM,EAAE,MAAM,EAAE,GAAG,UAAU,CAAA;QAC7B,MAAM,UAAU,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;QAChD,OAAO;YACL,IAAI,EAAE,QAAQ;YACd,MAAM,EAAE,MAAM,CAAC,SAAS;YACxB,MAAM,EAAE,UAAU,EAAE,MAAM,IAAI,EAAE;YAChC,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE;YACd,IAAI,EAAE,GAAG,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,QAAQ,EAAE;YAC9C,MAAM,EAAE,EAAE;YACV,IAAI,EAAE,UAAU,CAAC,IAAI;SACtB,CAAA;IACH,CAAC,CAAC,CAAA;IAEF,MAAM,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;IAC5D,MAAM,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;IAE3D,OAAO;QACL,GAAG,QAAQ;QACX,IAAI,EAAE,OAAO;QACb,YAAY;QACZ,YAAY;KACb,CAAA;AACH,CAAC","sourcesContent":["import { useMemo } from 'react'\nimport { MemberResource, ResourceObject } from '../../types'\nimport { GroupsGroupMemberResource } from '../../types/resources/groups/groups_member_resource_with_person'\nimport { useEnrichPeople } from '../use_enrich_people'\nimport { useSuspensePaginator } from '../use_suspense_api'\n\ntype UseSuspensePaginatorResult<T extends ResourceObject> = ReturnType<\n typeof useSuspensePaginator<T>\n>\n\nexport type GroupMembersForNewConversationResult = Omit<\n UseSuspensePaginatorResult<GroupsGroupMemberResource>, // We are passing our own \"members\" data shape\n 'data'\n> & {\n data: MemberResource[]\n adultMembers: MemberResource[]\n childMembers: MemberResource[]\n}\n\nexport function useGroupMembersForNewConversation({\n id,\n gender,\n}: {\n id: number\n gender: string | null\n}) {\n const response = useSuspensePaginator<GroupsGroupMemberResource>({\n url: `/me/groups/${id}/memberships`,\n data: {\n perPage: 100,\n include: ['person'],\n fields: {\n Membership: ['person, role'],\n Person: ['avatar_url', 'name', 'first_name', 'last_name', 'child', 'gender'],\n },\n ...(gender ? { where: { gender } } : {}),\n },\n app: 'groups',\n })\n\n const { data: memberships = [] } = response\n const personIds = useMemo(() => memberships.map(m => +m.person.id), [memberships])\n const enrichmentMap = useEnrichPeople({ personIds, groupId: id })\n\n const members: MemberResource[] = memberships.map(membership => {\n const { person } = membership\n const enrichment = enrichmentMap.get(+person.id)\n return {\n type: 'Member',\n avatar: person.avatarUrl,\n badges: enrichment?.badges ?? [],\n child: person.child,\n gender: person.gender,\n id: +person.id,\n name: `${person.firstName} ${person.lastName}`,\n source: [],\n role: membership.role,\n }\n })\n\n const adultMembers = members.filter(member => !member.child)\n const childMembers = members.filter(member => member.child)\n\n return {\n ...response,\n data: members,\n adultMembers,\n childMembers,\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"use_team_members_for_new_conversation.d.ts","sourceRoot":"","sources":["../../../src/hooks/services/use_team_members_for_new_conversation.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAA0B,MAAM,aAAa,CAAA;AAGxF,UAAU,KAAK;IACb,OAAO,EAAE,MAAM,EAAE,CAAA;IACjB,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAED,wBAAgB,gCAAgC,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,KAAK;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA4B1E"}
1
+ {"version":3,"file":"use_team_members_for_new_conversation.d.ts","sourceRoot":"","sources":["../../../src/hooks/services/use_team_members_for_new_conversation.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAA0B,MAAM,aAAa,CAAA;AAIxF,UAAU,KAAK;IACb,OAAO,EAAE,MAAM,EAAE,CAAA;IACjB,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAED,wBAAgB,gCAAgC,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,KAAK;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAsC1E"}
@@ -1,6 +1,7 @@
1
1
  import { isNil, omitBy } from 'lodash';
2
2
  import { useMemo } from 'react';
3
3
  import { useApiGet } from '../use_api';
4
+ import { useEnrichPeople } from '../use_enrich_people';
4
5
  export function useTeamMembersForNewConversation({ teamIds, planId }) {
5
6
  const params = omitBy({ team_id: teamIds.join(','), plan_id: planId }, isNil);
6
7
  const { data, ...rest } = useApiGet({
@@ -14,13 +15,19 @@ export function useTeamMembersForNewConversation({ teamIds, planId }) {
14
15
  app: 'services',
15
16
  });
16
17
  const people = data?.people || stableEmptyPersonArray;
17
- const members = useMemo(() => {
18
- return people.map(person => ({
18
+ const personIds = useMemo(() => people.map(p => p.id), [people]);
19
+ const enrichmentMap = useEnrichPeople({ personIds });
20
+ const members = useMemo(() => people.map(person => {
21
+ const enrichedBadges = enrichmentMap.get(person.id)?.badges ?? [];
22
+ const existingTitles = new Set(person.badges.map(b => b.title));
23
+ const newBadges = enrichedBadges.filter(b => !existingTitles.has(b.title));
24
+ return {
19
25
  ...person,
20
26
  type: 'Member',
21
27
  gender: null,
22
- }));
23
- }, [people]);
28
+ badges: [...person.badges, ...newBadges],
29
+ };
30
+ }), [people, enrichmentMap]);
24
31
  return {
25
32
  members,
26
33
  ...rest,
@@ -1 +1 @@
1
- {"version":3,"file":"use_team_members_for_new_conversation.js","sourceRoot":"","sources":["../../../src/hooks/services/use_team_members_for_new_conversation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AACtC,OAAO,EAAE,OAAO,EAAE,MAAM,OAAO,CAAA;AAE/B,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AAOtC,MAAM,UAAU,gCAAgC,CAAC,EAAE,OAAO,EAAE,MAAM,EAAS;IACzE,MAAM,MAAM,GAAG,MAAM,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,KAAK,CAAC,CAAA;IAE7E,MAAM,EAAE,IAAI,EAAE,GAAG,IAAI,EAAE,GAAG,SAAS,CAAqB;QACtD,GAAG,EAAE,OAAO;QACZ,IAAI,EAAE;YACJ,GAAG,MAAM;YACT,MAAM,EAAE;gBACN,IAAI,EAAE,CAAC,QAAQ,CAAC;aACjB;SACF;QACD,GAAG,EAAE,UAAU;KAChB,CAAC,CAAA;IAEF,MAAM,MAAM,GAAG,IAAI,EAAE,MAAM,IAAI,sBAAsB,CAAA;IAErD,MAAM,OAAO,GAAqB,OAAO,CAAC,GAAG,EAAE;QAC7C,OAAO,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YAC3B,GAAG,MAAM;YACT,IAAI,EAAE,QAAQ;YACd,MAAM,EAAE,IAAI;SACb,CAAC,CAAC,CAAA;IACL,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAA;IAEZ,OAAO;QACL,OAAO;QACP,GAAG,IAAI;KACR,CAAA;AACH,CAAC;AAED,MAAM,sBAAsB,GAA6B,EAAE,CAAA","sourcesContent":["import { isNil, omitBy } from 'lodash'\nimport { useMemo } from 'react'\nimport { MemberResource, TeamPeopleResource, TeamPersonResponseItem } from '../../types'\nimport { useApiGet } from '../use_api'\n\ninterface Props {\n teamIds: number[]\n planId?: number\n}\n\nexport function useTeamMembersForNewConversation({ teamIds, planId }: Props) {\n const params = omitBy({ team_id: teamIds.join(','), plan_id: planId }, isNil)\n\n const { data, ...rest } = useApiGet<TeamPeopleResource>({\n url: '/chat',\n data: {\n ...params,\n fields: {\n Chat: ['people'],\n },\n },\n app: 'services',\n })\n\n const people = data?.people || stableEmptyPersonArray\n\n const members: MemberResource[] = useMemo(() => {\n return people.map(person => ({\n ...person,\n type: 'Member',\n gender: null,\n }))\n }, [people])\n\n return {\n members,\n ...rest,\n }\n}\n\nconst stableEmptyPersonArray: TeamPersonResponseItem[] = []\n"]}
1
+ {"version":3,"file":"use_team_members_for_new_conversation.js","sourceRoot":"","sources":["../../../src/hooks/services/use_team_members_for_new_conversation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AACtC,OAAO,EAAE,OAAO,EAAE,MAAM,OAAO,CAAA;AAE/B,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AACtC,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AAOtD,MAAM,UAAU,gCAAgC,CAAC,EAAE,OAAO,EAAE,MAAM,EAAS;IACzE,MAAM,MAAM,GAAG,MAAM,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,KAAK,CAAC,CAAA;IAE7E,MAAM,EAAE,IAAI,EAAE,GAAG,IAAI,EAAE,GAAG,SAAS,CAAqB;QACtD,GAAG,EAAE,OAAO;QACZ,IAAI,EAAE;YACJ,GAAG,MAAM;YACT,MAAM,EAAE;gBACN,IAAI,EAAE,CAAC,QAAQ,CAAC;aACjB;SACF;QACD,GAAG,EAAE,UAAU;KAChB,CAAC,CAAA;IAEF,MAAM,MAAM,GAAG,IAAI,EAAE,MAAM,IAAI,sBAAsB,CAAA;IACrD,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAA;IAChE,MAAM,aAAa,GAAG,eAAe,CAAC,EAAE,SAAS,EAAE,CAAC,CAAA;IAEpD,MAAM,OAAO,GAAqB,OAAO,CACvC,GAAG,EAAE,CACH,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE;QAClB,MAAM,cAAc,GAAG,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,MAAM,IAAI,EAAE,CAAA;QACjE,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAA;QAC/D,MAAM,SAAS,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAA;QAC1E,OAAO;YACL,GAAG,MAAM;YACT,IAAI,EAAE,QAAQ;YACd,MAAM,EAAE,IAAI;YACZ,MAAM,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,SAAS,CAAC;SACzC,CAAA;IACH,CAAC,CAAC,EACJ,CAAC,MAAM,EAAE,aAAa,CAAC,CACxB,CAAA;IAED,OAAO;QACL,OAAO;QACP,GAAG,IAAI;KACR,CAAA;AACH,CAAC;AAED,MAAM,sBAAsB,GAA6B,EAAE,CAAA","sourcesContent":["import { isNil, omitBy } from 'lodash'\nimport { useMemo } from 'react'\nimport { MemberResource, TeamPeopleResource, TeamPersonResponseItem } from '../../types'\nimport { useApiGet } from '../use_api'\nimport { useEnrichPeople } from '../use_enrich_people'\n\ninterface Props {\n teamIds: number[]\n planId?: number\n}\n\nexport function useTeamMembersForNewConversation({ teamIds, planId }: Props) {\n const params = omitBy({ team_id: teamIds.join(','), plan_id: planId }, isNil)\n\n const { data, ...rest } = useApiGet<TeamPeopleResource>({\n url: '/chat',\n data: {\n ...params,\n fields: {\n Chat: ['people'],\n },\n },\n app: 'services',\n })\n\n const people = data?.people || stableEmptyPersonArray\n const personIds = useMemo(() => people.map(p => p.id), [people])\n const enrichmentMap = useEnrichPeople({ personIds })\n\n const members: MemberResource[] = useMemo(\n () =>\n people.map(person => {\n const enrichedBadges = enrichmentMap.get(person.id)?.badges ?? []\n const existingTitles = new Set(person.badges.map(b => b.title))\n const newBadges = enrichedBadges.filter(b => !existingTitles.has(b.title))\n return {\n ...person,\n type: 'Member',\n gender: null,\n badges: [...person.badges, ...newBadges],\n }\n }),\n [people, enrichmentMap]\n )\n\n return {\n members,\n ...rest,\n }\n}\n\nconst stableEmptyPersonArray: TeamPersonResponseItem[] = []\n"]}
@@ -0,0 +1,13 @@
1
+ import { ResourceObject } from '../types';
2
+ export interface PersonEnrichmentResource extends ResourceObject {
3
+ type: 'PersonEnrichment';
4
+ id: string;
5
+ badges: {
6
+ title: string;
7
+ }[];
8
+ }
9
+ export declare function useEnrichPeople({ personIds, groupId }: {
10
+ personIds: number[];
11
+ groupId?: number;
12
+ }): Map<number, PersonEnrichmentResource>;
13
+ //# sourceMappingURL=use_enrich_people.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use_enrich_people.d.ts","sourceRoot":"","sources":["../../src/hooks/use_enrich_people.ts"],"names":[],"mappings":"AAEA,OAAO,EAAiB,cAAc,EAAE,MAAM,UAAU,CAAA;AAGxD,MAAM,WAAW,wBAAyB,SAAQ,cAAc;IAC9D,IAAI,EAAE,kBAAkB,CAAA;IACxB,EAAE,EAAE,MAAM,CAAA;IACV,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,CAAA;CAC5B;AAED,wBAAgB,eAAe,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,EAAE;IAAE,SAAS,EAAE,MAAM,EAAE,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,yCAuBhG"}
@@ -0,0 +1,25 @@
1
+ import { keepPreviousData, useQuery } from '@tanstack/react-query';
2
+ import { useMemo } from 'react';
3
+ import { useApiClient } from './use_api_client';
4
+ export function useEnrichPeople({ personIds, groupId }) {
5
+ const apiClient = useApiClient();
6
+ const { data } = useQuery({
7
+ queryKey: ['enrich_people', [...personIds].sort((a, b) => a - b), groupId],
8
+ queryFn: () => apiClient.chat.post({
9
+ url: '/enrich_people',
10
+ data: {
11
+ data: {
12
+ type: 'PersonEnrichment',
13
+ attributes: {
14
+ person_ids: personIds,
15
+ ...(groupId !== undefined ? { group_id: groupId } : {}),
16
+ },
17
+ },
18
+ },
19
+ }),
20
+ enabled: personIds.length > 0,
21
+ placeholderData: keepPreviousData,
22
+ });
23
+ return useMemo(() => new Map(data?.data.map(e => [+e.id, e]) ?? []), [data]);
24
+ }
25
+ //# sourceMappingURL=use_enrich_people.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use_enrich_people.js","sourceRoot":"","sources":["../../src/hooks/use_enrich_people.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAA;AAClE,OAAO,EAAE,OAAO,EAAE,MAAM,OAAO,CAAA;AAE/B,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;AAQ/C,MAAM,UAAU,eAAe,CAAC,EAAE,SAAS,EAAE,OAAO,EAA6C;IAC/F,MAAM,SAAS,GAAG,YAAY,EAAE,CAAA;IAEhC,MAAM,EAAE,IAAI,EAAE,GAAG,QAAQ,CAA0C;QACjE,QAAQ,EAAE,CAAC,eAAe,EAAE,CAAC,GAAG,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC;QAC1E,OAAO,EAAE,GAAG,EAAE,CACZ,SAAS,CAAC,IAAI,CAAC,IAAI,CAA0C;YAC3D,GAAG,EAAE,gBAAgB;YACrB,IAAI,EAAE;gBACJ,IAAI,EAAE;oBACJ,IAAI,EAAE,kBAAkB;oBACxB,UAAU,EAAE;wBACV,UAAU,EAAE,SAAS;wBACrB,GAAG,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;qBACxD;iBACF;aACF;SACF,CAAC;QACJ,OAAO,EAAE,SAAS,CAAC,MAAM,GAAG,CAAC;QAC7B,eAAe,EAAE,gBAAgB;KAClC,CAAC,CAAA;IAEF,OAAO,OAAO,CAAC,GAAG,EAAE,CAAC,IAAI,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAA;AAC9E,CAAC","sourcesContent":["import { keepPreviousData, useQuery } from '@tanstack/react-query'\nimport { useMemo } from 'react'\nimport { ApiCollection, ResourceObject } from '../types'\nimport { useApiClient } from './use_api_client'\n\nexport interface PersonEnrichmentResource extends ResourceObject {\n type: 'PersonEnrichment'\n id: string\n badges: { title: string }[]\n}\n\nexport function useEnrichPeople({ personIds, groupId }: { personIds: number[]; groupId?: number }) {\n const apiClient = useApiClient()\n\n const { data } = useQuery<ApiCollection<PersonEnrichmentResource>>({\n queryKey: ['enrich_people', [...personIds].sort((a, b) => a - b), groupId],\n queryFn: () =>\n apiClient.chat.post<ApiCollection<PersonEnrichmentResource>>({\n url: '/enrich_people',\n data: {\n data: {\n type: 'PersonEnrichment',\n attributes: {\n person_ids: personIds,\n ...(groupId !== undefined ? { group_id: groupId } : {}),\n },\n },\n },\n }),\n enabled: personIds.length > 0,\n placeholderData: keepPreviousData,\n })\n\n return useMemo(() => new Map(data?.data.map(e => [+e.id, e]) ?? []), [data])\n}\n"]}
@@ -66,7 +66,7 @@ export function ConversationDetailsScreen({ route }) {
66
66
  const memberPosition = isFirst ? 'first' : isLast ? 'last' : 'middle';
67
67
  const memberSectionStyle = memberSectionStyleMap[memberPosition];
68
68
  return {
69
- type: data.child ? SectionTypes.hidden : SectionTypes.members,
69
+ type: SectionTypes.members,
70
70
  data,
71
71
  sectionInnerStyle: memberSectionStyle,
72
72
  };
@@ -1 +1 @@
1
- {"version":3,"file":"conversation_details_screen.js","sourceRoot":"","sources":["../../src/screens/conversation_details_screen.tsx"],"names":[],"mappings":"AAAA,OAAO,EACL,WAAW,IAAI,mBAAmB,EAElC,iBAAiB,GAClB,MAAM,4BAA4B,CAAA;AACnC,OAAO,EAAE,YAAY,EAAqB,aAAa,EAAE,MAAM,0BAA0B,CAAA;AACzF,OAAO,KAAK,EAAE,EACZ,WAAW,EACX,SAAS,EACT,MAAM,EACN,QAAQ,GAIT,MAAM,OAAO,CAAA;AACd,OAAO,EACL,KAAK,EACL,QAAQ,EACR,QAAQ,EACR,SAAS,EACT,UAAU,EACV,SAAS,EACT,IAAI,GAGL,MAAM,cAAc,CAAA;AACrB,OAAO,EACL,sBAAsB,EACtB,KAAK,EACL,MAAM,EACN,WAAW,EACX,OAAO,EACP,IAAI,EACJ,MAAM,EACN,MAAM,EACN,IAAI,EACJ,UAAU,GAEX,MAAM,eAAe,CAAA;AACtB,OAAO,EAAE,kBAAkB,EAAE,MAAM,2CAA2C,CAAA;AAC9E,OAAO,EAAE,gBAAgB,EAAE,MAAM,qDAAqD,CAAA;AAEtF,OAAO,EAAE,oBAAoB,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAA;AACzD,OAAO,EACL,eAAe,EACf,qBAAqB,EACrB,6BAA6B,EAC7B,mBAAmB,EACnB,qBAAqB,GACtB,MAAM,2BAA2B,CAAA;AAClC,OAAO,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAA;AACtE,OAAO,EAA6C,SAAS,EAAE,MAAM,UAAU,CAAA;AAE/E,OAAO,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAA;AAClE,OAAO,EAAE,MAAM,EAAE,MAAM,2BAA2B,CAAA;AAClD,4CAA4C;AAC5C,4CAA4C;AAC5C,4CAA4C;AAE5C,IAAK,YAQJ;AARD,WAAK,YAAY;IACf,mDAAM,CAAA;IACN,mDAAM,CAAA;IACN,qDAAO,CAAA;IACP,mEAAc,CAAA;IACd,uEAAgB,CAAA;IAChB,qDAAO,CAAA;IACP,+CAAI,CAAA;AACN,CAAC,EARI,YAAY,KAAZ,YAAY,QAQhB;AA4BD,MAAM,UAAU,yBAAyB,CAAC,EAAE,KAAK,EAAkC;IACjF,MAAM,UAAU,GAAG,aAAa,EAAE,CAAA;IAClC,MAAM,MAAM,GAAG,SAAS,EAAE,CAAA;IAE1B,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE,GAAG,eAAe,CAAC,KAAK,CAAC,MAAM,CAAC,CAAA;IAC5D,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAC,YAAY,CAAC,KAAK,CAAC,CAAA;IACtD,MAAM,EAAE,eAAe,EAAE,GAAG,KAAK,CAAC,MAAM,CAAA;IACxC,MAAM,EAAE,eAAe,EAAE,kBAAkB,EAAE,GAAG,6BAA6B,CAAC,KAAK,CAAC,MAAM,CAAC,CAAA;IAC3F,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,qBAAqB,CAAC,KAAK,CAAC,MAAM,CAAC,CAAA;IACjE,MAAM,EAAE,MAAM,EAAE,kBAAkB,EAAE,GAAG,qBAAqB,CAAC,KAAK,CAAC,MAAM,CAAC,CAAA;IAC1E,MAAM,EAAE,cAAc,EAAE,GAAG,WAAW,EAAE,CAAA;IACxC,MAAM,4BAA4B,GAAG,cAAc,CAAC,iBAAiB,CAAC,yBAAyB,CAAC,CAAA;IAChG,MAAM,oBAAoB,GAAG,cAAc,CAAC,iBAAiB,CAAC,2BAA2B,CAAC,CAAA;IAC1F,MAAM,gBAAgB,GACpB,cAAc,CAAC,iBAAiB,CAAC,6BAA6B,CAAC,IAAI,CAAC,CAAC,YAAY,CAAC,YAAY,CAAA;IAChG,MAAM,WAAW,GAAG,YAAY,CAAC,YAAY,CAAC,CAAC,CAAC,kBAAkB,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;IAClG,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,mBAAmB,CAAC,EAAE,eAAe,EAAE,CAAC,CAAA;IAEpE,MAAM,YAAY,GAAG,KAAK,CAAC,IAAI,EAAE,CAAA;IACjC,MAAM,UAAU,GAAG,YAAY,KAAK,EAAE,IAAI,KAAK,KAAK,IAAI,CAAA;IAExD,MAAM,4BAA4B,GAChC,YAAY,EAAE,sBAAsB,EAAE,4BAA4B,CAAA;IACpE,MAAM,SAAS,GAAG,YAAY,CAAC,aAAa,EAAE,SAAS,IAAI,KAAK,CAAA;IAChE,MAAM,SAAS,GAAG,YAAY,CAAC,aAAa,EAAE,SAAS,IAAI,KAAK,CAAA;IAChE,MAAM,QAAQ,GAAG,YAAY,CAAC,aAAa,EAAE,MAAM,IAAI,KAAK,CAAA;IAC5D,MAAM,UAAU,GAAG,YAAY,CAAC,QAAQ,IAAI,KAAK,CAAA;IAEjD,MAAM,EACJ,IAAI,EAAE,OAAO,EACb,aAAa,EAAE,sBAAsB,EACrC,kBAAkB,EAAE,gBAAgB,GACrC,GAAG,oBAAoB,CAAiB;QACvC,GAAG,EAAE,qBAAqB,KAAK,CAAC,MAAM,CAAC,eAAe,UAAU;QAChE,IAAI,EAAE;YACJ,OAAO,EAAE,CAAC,QAAQ,CAAC;YACnB,MAAM,EAAE;gBACN,MAAM,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,WAAW,EAAE,OAAO,EAAE,QAAQ,CAAC;aACzE;SACF;KACF,CAAC,CAAA;IAEF,MAAM,qBAAqB,GAAG;QAC5B,KAAK,EAAE,MAAM,CAAC,uBAAuB;QACrC,MAAM,EAAE,MAAM,CAAC,wBAAwB;QACvC,IAAI,EAAE,MAAM,CAAC,sBAAsB;KACpC,CAAA;IAED,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;QAC9C,MAAM,OAAO,GAAG,KAAK,KAAK,CAAC,CAAA;QAC3B,MAAM,MAAM,GAAG,KAAK,KAAK,OAAO,CAAC,MAAM,GAAG,CAAC,CAAA;QAC3C,MAAM,cAAc,GAAG,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAA;QACrE,MAAM,kBAAkB,GAAG,qBAAqB,CAAC,cAAc,CAAC,CAAA;QAEhE,OAAO;YACL,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,OAAO;YAC7D,IAAI;YACJ,iBAAiB,EAAE,kBAAkB;SACtC,CAAA;IACH,CAAC,CAAC,CAAA;IAEF,MAAM,kBAAkB,GAAG,gBAAgB;QACzC,CAAC,CAAC;YACE;gBACE,IAAI,EAAE,YAAY,CAAC,cAAc;gBACjC,IAAI,EAAE,EAAE;gBACR,iBAAiB,EAAE,MAAM,CAAC,uBAAuB;aAClD;SACF;QACH,CAAC,CAAC,EAAE,CAAA;IAEN,MAAM,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;IAC3D,MAAM,WAAW,GAAG,YAAY,CAAC,MAAM,GAAG,CAAC,CAAA;IAE3C,MAAM,UAAU,GACd,YAAY,CAAC,MAAM;QACjB,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,aAAa,KAAK,UAAU,CAAC;QAC7C,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;QAC1D,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,EAAE,CAAA;IACxC,MAAM,QAAQ,GAAG,UAAU,CAAC,MAAM,GAAG,CAAC,CAAA;IAEtC,MAAM,KAAK,GAAG,YAAY,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAA;IACtC,MAAM,YAAY,GAAG,KAAK,EAAE,eAAe,IAAI,EAAE,CAAA;IACjD,MAAM,WAAW,GAAG,KAAK,EAAE,OAAO,CAAA;IAClC,MAAM,IAAI,GAAG,KAAK,EAAE,IAAI,IAAI,SAAS,CAAA;IAErC,MAAM,YAAY,GAAG,WAAW,CAAC,GAAG,EAAE;QACpC,KAAK,CAAC,KAAK,CACT,qBAAqB,EACrB,mBAAmB,KAAK,8DAA8D,EACtF;YACE;gBACE,IAAI,EAAE,QAAQ;gBACd,KAAK,EAAE,QAAQ;aAChB;YACD;gBACE,IAAI,EAAE,QAAQ;gBACd,KAAK,EAAE,aAAa;gBACpB,OAAO,EAAE,GAAG,EAAE;oBACZ,kBAAkB,EAAE,CAAA;oBACpB,UAAU,CAAC,QAAQ,CAAC,YAAY,CAAC,QAAQ,EAAE,CAAC,CAAA;gBAC9C,CAAC;aACF;SACF,CACF,CAAA;IACH,CAAC,EAAE,CAAC,kBAAkB,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC,CAAA;IAE3C,MAAM,WAAW,GAAG,WAAW,CAC7B,CAAC,KAAuB,EAAE,EAAE;QAC1B,OAAO,CACL,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,oBAAoB,CAAC,CACvC;UAAA,CAAC,mBAAmB,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,EACzD;UAAA,CAAC,KAAK,CACJ,OAAO,CAAC,YAAY,CACpB,KAAK,CAAC,CAAC,YAAY,CAAC,CACpB,SAAS,CAAC,CAAC,IAAI,CAAC,CAChB,KAAK,CAAC,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAC/B,eAAe,CAAC,CAAC,WAAW,CAAC,CAC7B,qBAAqB,CAAC,CAAC,CAAC,CAAC,EAE7B;QAAA,EAAE,IAAI,CAAC,CACR,CAAA;IACH,CAAC,EACD,CAAC,IAAI,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,CAAC,gBAAgB,EAAE,MAAM,CAAC,oBAAoB,CAAC,CACxF,CAAA;IAED,MAAM,WAAW,GAAG,WAAW,CAAC,GAAG,EAAE;QACnC,OAAO,CACL,CAAC,gBAAgB,CACf,OAAO,CAAC,CAAC,GAAG,EAAE;gBACZ,SAAS,CAAC,EAAE,KAAK,EAAE,YAAY,IAAI,YAAY,CAAC,KAAK,EAAE,CAAC,CAAA;gBACxD,UAAU,CAAC,MAAM,EAAE,CAAA;YACrB,CAAC,CAAC,CACF,KAAK,CAAC,MAAM,EACZ,CACH,CAAA;IACH,CAAC,EAAE,CAAC,YAAY,CAAC,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,CAAC,CAAC,CAAA;IAE7D,SAAS,CAAC,GAAG,EAAE;QACb,UAAU,CAAC,UAAU,CAAC;YACpB,WAAW,EAAE,WAAW;YACxB,WAAW,EAAE,WAAW;SACzB,CAAC,CAAA;IACJ,CAAC,EAAE,CAAC,WAAW,EAAE,WAAW,EAAE,UAAU,CAAC,CAAC,CAAA;IAE1C,MAAM,QAAQ,GAAG;QACf;YACE,IAAI,EAAE,SAAS,IAAI,oBAAoB,CAAC,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,MAAM;YACjF,IAAI,EAAE;gBACJ,QAAQ,EAAE,CACR,CAAC,UAAU,CACT,YAAY,CAAC,CAAC,YAAY,CAAC,CAC3B,OAAO,CAAC,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,cAAc,EAAE,EAAE,eAAe,EAAE,CAAC,CAAC,EACxE,CACH;aACF;YACD,iBAAiB,EAAE,MAAM,CAAC,sBAAsB;YAChD,iBAAiB,EAAE,MAAM,CAAC,sBAAsB;SACjD;QACD;YACE,IAAI,EAAE,YAAY,CAAC,MAAM;YACzB,IAAI,EAAE,EAAE,KAAK,EAAE,YAAY,EAAE;YAC7B,gBAAgB,EAAE,IAAI;YACtB,iBAAiB,EAAE,MAAM,CAAC,kCAAkC;SAC7D;QACD;YACE,IAAI,EAAE,YAAY,CAAC,IAAI;YACvB,IAAI,EAAE;gBACJ,QAAQ,EAAE,CACR,CAAC,UAAU,CACT,SAAS,CAAC,CAAC,SAAS,CAAC,CACrB,KAAK,CAAC,CAAC,KAAK,CAAC,CACb,QAAQ,CAAC,CAAC,QAAQ,CAAC,CACnB,OAAO,CAAC,CAAC,UAAU,CAAC,EACpB,CACH;aACF;YACD,iBAAiB,EAAE,MAAM,CAAC,sBAAsB;SACjD;QACD;YACE,IAAI,EAAE,YAAY,CAAC,MAAM;YACzB,IAAI,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE;YAC3B,gBAAgB,EAAE,IAAI;YACtB,iBAAiB,EAAE,MAAM,CAAC,kCAAkC;SAC7D;QACD,4BAA4B;YAC1B,CAAC,CAAC;gBACE,IAAI,EAAE,YAAY,CAAC,gBAAgB;gBACnC,IAAI,EAAE;oBACJ,KAAK,EAAE,eAAe;oBACtB,QAAQ,EAAE,4BAA4B;oBACtC,OAAO,EAAE,GAAG,EAAE,CACZ,UAAU,CAAC,QAAQ,CAAC,qCAAqC,EAAE,EAAE,eAAe,EAAE,CAAC;iBAClF;gBACD,gBAAgB,EAAE,IAAI;aACvB;YACH,CAAC,CAAC;gBACE,IAAI,EAAE,YAAY,CAAC,OAAO;gBAC1B,IAAI,EAAE;oBACJ,KAAK,EAAE,MAAM;oBACb,SAAS,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,aAAa,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAG;iBAC7E;gBACD,gBAAgB,EAAE,IAAI;aACvB;QACL;YACE,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC,MAAM;YAC5D,IAAI,EAAE;gBACJ,KAAK,EAAE,0BAA0B;gBACjC,SAAS,EAAE,CACT,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,eAAe,CAAC,CAAC,QAAQ,CAAC,CAAC,GAAG,EAAE,CAAC,kBAAkB,CAAC,CAAC,eAAe,CAAC,CAAC,EAAG,CACzF;aACF;YACD,gBAAgB,EAAE,IAAI;SACvB;QACD;YACE,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC,MAAM;YAC5D,IAAI,EAAE;gBACJ,KAAK,EAAE,sBAAsB;gBAC7B,eAAe,EAAE,MAAM,CAAC,gBAAgB;gBACxC,UAAU,EAAE,QAAQ;gBACpB,OAAO,EAAE,YAAY;aACtB;SACF;QACD;YACE,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,MAAM;YAC1D,IAAI,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE;YACxB,iBAAiB,EAAE,MAAM,CAAC,kBAAkB;SAC7C;QACD;YACE,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,MAAM;YACxD,IAAI,EAAE;gBACJ,QAAQ,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,UAAU,CAAC,EAAG;aAC5C;SACF;QACD;YACE,IAAI,EAAE,YAAY,CAAC,MAAM;YACzB,IAAI,EAAE;gBACJ,KAAK,EAAE,QAAQ;gBACf,KAAK,EAAE,gBAAgB,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,GAAG,WAAW,OAAO,CAAC,EAAG,CAAC,CAAC,CAAC,SAAS;aAC9E;YACD,iBAAiB,EAAE,MAAM,CAAC,kBAAkB;SAC7C;QACD;YACE,IAAI,EAAE,gBAAgB,CAAC,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,MAAM;YAChE,IAAI,EAAE;gBACJ,QAAQ,EAAE,CACR,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CACtB;mEAAuD,CAAC,WAAW,CAAC,WAAW,EAAE,CAAE;;UAErF,EAAE,IAAI,CAAC,CACR;aACF;YACD,iBAAiB,EAAE,MAAM,CAAC,wBAAwB;SACnD;QACD;YACE,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,MAAM;YAC1D,IAAI,EAAE;gBACJ,QAAQ,EAAE,CAAC,sBAAsB,CAAC,AAAD,EAAG;aACrC;YACD,iBAAiB,EAAE,MAAM,CAAC,kBAAkB;SAC7C;QACD;YACE,IAAI,EAAE,WAAW,IAAI,QAAQ,CAAC,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,MAAM;YACvE,IAAI,EAAE;gBACJ,QAAQ,EAAE,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC,YAAY,CAAC,EAAG;aACtD;YACD,iBAAiB,EAAE,MAAM,CAAC,kBAAkB;SAC7C;QACD,GAAG,WAAW;QACd,GAAG,kBAAkB;KACtB,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,YAAY,CAAC,MAAM,CAAC,CAAA;IAEnD,MAAM,aAAa,GAAG,QAAQ;SAC3B,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,IAAI,KAAK,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;SAC5E,MAAM,CAAC,SAAS,CAAC,CAAA;IAEpB,OAAO,CACL,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,CAChC;MAAA,CAAC,QAAQ,CACP,IAAI,CAAC,CAAC,QAA2B,CAAC,CAClC,qBAAqB,CAAC,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAC/C,UAAU,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE;YAC9B,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,GAAG;gBACvB,KAAK,KAAK,CAAC,IAAI,aAAa,CAAC,QAAQ,CAAC,KAAK,CAAC;gBAC5C,KAAK,KAAK,QAAQ,CAAC,MAAM,GAAG,CAAC,IAAI,aAAa,CAAC,QAAQ,CAAC,KAAK,GAAG,CAAC,CAAC;aACnE,CAAA;YAED,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC;gBAClB,KAAK,YAAY,CAAC,MAAM;oBACtB,OAAO,CACL,CAAC,WAAW,CACV,OAAO,CAAC,CAAC,OAAO,CAAC,CACjB,KAAK,CAAC,CAAC,KAAK,CAAC,CACb,gBAAgB,CAAC,CAAC,IAAI,EAAE,gBAAgB,CAAC,CACzC,UAAU,CAAC,CAAC,IAAI,EAAE,iBAAiB,CAAC,CACpC,UAAU,CAAC,CAAC,IAAI,EAAE,iBAAiB,CAAC,CAEpC;kBAAA,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CACjB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,gBAAgB,CAAC,CACnC;sBAAA,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,OAAO,CAChD;sBAAA,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAClB;oBAAA,EAAE,IAAI,CAAC,CACR,CAAC,CAAC,CAAC,CACF,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC,CAClD,CACH;gBAAA,EAAE,WAAW,CAAC,CACf,CAAA;gBACH,KAAK,YAAY,CAAC,OAAO;oBACvB,OAAO,CACL,CAAC,WAAW,CACV,OAAO,CAAC,CAAC,OAAO,CAAC,CACjB,KAAK,CAAC,CAAC,KAAK,CAAC,CACb,gBAAgB,CAAC,CAAC,IAAI,EAAE,gBAAgB,CAAC,CACzC,UAAU,CAAC,CAAC,IAAI,EAAE,iBAAiB,CAAC,CACpC,UAAU,CAAC,CAAC,IAAI,EAAE,iBAAiB,CAAC,CAEpC;kBAAA,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,EACnC;gBAAA,EAAE,WAAW,CAAC,CACf,CAAA;gBACH,KAAK,YAAY,CAAC,cAAc;oBAC9B,OAAO,CACL,CAAC,WAAW,CACV,OAAO,CAAC,CAAC,OAAO,CAAC,CACjB,KAAK,CAAC,CAAC,KAAK,CAAC,CACb,gBAAgB,CAAC,CAAC,IAAI,EAAE,gBAAgB,CAAC,CACzC,UAAU,CAAC,CAAC,IAAI,EAAE,iBAAiB,CAAC,CACpC,UAAU,CAAC,CAAC,IAAI,EAAE,iBAAiB,CAAC,CAEpC;kBAAA,CAAC,IAAI,CAAC,eAAe,EAAE,IAAI,CAC7B;gBAAA,EAAE,WAAW,CAAC,CACf,CAAA;gBACH,KAAK,YAAY,CAAC,gBAAgB;oBAChC,OAAO,CACL,CAAC,WAAW,CACV,OAAO,CAAC,CAAC,OAAO,CAAC,CACjB,KAAK,CAAC,CAAC,KAAK,CAAC,CACb,gBAAgB,CAAC,CAAC,IAAI,EAAE,gBAAgB,CAAC,CACzC,UAAU,CAAC,CAAC,IAAI,EAAE,iBAAiB,CAAC,CACpC,UAAU,CAAC,CAAC,IAAI,EAAE,iBAAiB,CAAC,CAEpC;kBAAA,CAAC,mBAAmB,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,EACrC;gBAAA,EAAE,WAAW,CAAC,CACf,CAAA;gBACH,KAAK,YAAY,CAAC,OAAO;oBACvB,OAAO,CACL,CAAC,WAAW,CACV,OAAO,CAAC,CAAC,OAAO,CAAC,CACjB,KAAK,CAAC,CAAC,KAAK,CAAC,CACb,gBAAgB,CAAC,CAAC,IAAI,EAAE,gBAAgB,CAAC,CACzC,UAAU,CAAC,CAAC,IAAI,EAAE,iBAAiB,CAAC,CACpC,UAAU,CAAC,CAAC,IAAI,EAAE,iBAAiB,CAAC,CAEpC;kBAAA,CAAC,UAAU,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,EAC5B;gBAAA,EAAE,WAAW,CAAC,CACf,CAAA;gBACH,KAAK,YAAY,CAAC,IAAI;oBACpB,OAAO,CACL,CAAC,WAAW,CACV,OAAO,CAAC,CAAC,OAAO,CAAC,CACjB,KAAK,CAAC,CAAC,KAAK,CAAC,CACb,gBAAgB,CAAC,CAAC,IAAI,EAAE,gBAAgB,CAAC,CACzC,UAAU,CAAC,CAAC,IAAI,EAAE,iBAAiB,CAAC,CACpC,UAAU,CAAC,CAAC,IAAI,EAAE,iBAAiB,CAAC,CAEpC;kBAAA,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,EAC9C;gBAAA,EAAE,WAAW,CAAC,CACf,CAAA;gBACH;oBACE,OAAO,IAAI,CAAA;YACf,CAAC;QACH,CAAC,CAAC,CACF,YAAY,CAAC,CAAC,GAAG,EAAE,CAAC,sBAAsB,EAAE,CAAC,EAEjD;IAAA,EAAE,IAAI,CAAC,CACR,CAAA;AACH,CAAC;AAWD,SAAS,WAAW,CAAC,EACnB,OAAO,EACP,KAAK,EACL,gBAAgB,EAChB,UAAU,EACV,UAAU,EACV,QAAQ,GACS;IACjB,MAAM,MAAM,GAAG,SAAS,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAA;IAC5C,MAAM,YAAY,GAAG,gBAAgB,CAAC,CAAC,CAAC,MAAM,CAAC,wBAAwB,CAAC,CAAC,CAAC,EAAE,CAAA;IAE5E,OAAO,CACL,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,gBAAgB,EAAE,UAAU,CAAC,CAAC,CACjD;MAAA,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,gBAAgB,EAAE,YAAY,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,IAAI,CACpF;IAAA,EAAE,IAAI,CAAC,CACR,CAAA;AACH,CAAC;AAUD,SAAS,UAAU,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAc;IAC5E,MAAM,MAAM,GAAG,SAAS,EAAE,CAAA;IAC1B,MAAM,OAAO,GAAG,MAAM,CAAY,IAAI,CAAC,CAAA;IAEvC,MAAM,WAAW,GAAG,GAAG,EAAE;QACvB,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;YACpB,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,CAAA;QACzB,CAAC;IACH,CAAC,CAAA;IAED,OAAO,CACL,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE,CAAC,CAC7E;MAAA,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,mBAAmB,CAAC,CACtC;QAAA,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,CAChD;;QACF,EAAE,IAAI,CACN;QAAA,CAAC,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,iBAAiB,CAAC,EAAG,CAC9E;MAAA,EAAE,IAAI,CACN;MAAA,CAAC,SAAS,CACR,GAAG,CAAC,CAAC,OAAO,CAAC,CACb,QAAQ,CAAC,CAAC,SAAS,CAAC,CACpB,YAAY,CAAC,CAAC,QAAQ,CAAC,CACvB,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC,SAAS,IAAI,MAAM,CAAC,kBAAkB,CAAC,CAAC,CACpE,KAAK,CAAC,CAAC,KAAK,CAAC,CACb,SAAS,CACT,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,mBAAmB;KACnC,YAAY,CAAC,MAAM,CACnB,cAAc,CAAC,eAAe,EAEhC;MAAA,CAAC,OAAO,IAAI,CACV,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,wBAAwB,CAAC,CAC3C;UAAA,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,mBAAmB,CAAC,CACzD;;UACF,EAAE,IAAI,CACR;QAAA,EAAE,IAAI,CAAC,CACR,CACH;IAAA,EAAE,SAAS,CAAC,CACb,CAAA;AACH,CAAC;AAoBD,SAAS,UAAU,CAAC,EAClB,KAAK,EACL,KAAK,EACL,UAAU,GAAG,EAAE,EACf,eAAe,GAAG,EAAE,EACpB,QAAQ,EACR,SAAS,EACT,cAAc,GAAG,EAAE,EACnB,UAAU,EACV,OAAO,GACS;IAChB,MAAM,MAAM,GAAG,SAAS,EAAE,CAAA;IAE1B,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO,CACL,CAAC,UAAU,CACT,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC,CAClC,SAAS,CAAC,CAAC,eAAe,CAAC,CAC3B,UAAU,CAAC,CAAC,UAAU,CAAC,CACvB,OAAO,CAAC,CAAC,OAAO,CAAC,CAEjB;QAAA,CAAC,KAAK,CACR;MAAA,EAAE,UAAU,CAAC,CACd,CAAA;IACH,CAAC;IAED,OAAO,CACL,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC,CACtC;MAAA,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,iBAAiB,CAAC,CACpC;QAAA,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,cAAc,EAAE,UAAU,CAAC,CAAC,CAC/D;UAAA,CAAC,KAAK,CACR;QAAA,EAAE,IAAI,CACN;QAAA,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,QAAQ,CAAC,EAAE,IAAI,CAAC,CAClE;MAAA,EAAE,IAAI,CACN;MAAA,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,SAAS,CAAC,EAAE,IAAI,CAAC,CACxE;IAAA,EAAE,IAAI,CAAC,CACR,CAAA;AACH,CAAC;AAED,SAAS,mBAAmB,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAA4B;IACjF,MAAM,MAAM,GAAG,SAAS,EAAE,CAAA;IAC1B,OAAO,CACL,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,iBAAiB,CAAC,QAAQ,CAC7D;MAAA,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,CAC7B;QAAA,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,iBAAiB,CAAC,CACpC;UAAA,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,cAAc,CAAC,CACjD;YAAA,CAAC,KAAK,CACR;UAAA,EAAE,IAAI,CACN;UAAA,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,QAAQ,CAAC,EAAE,IAAI,CAAC,CAClE;QAAA,EAAE,IAAI,CACN;QAAA,CAAC,QAAQ,CAAC,EAAE,KAAK,KAAK,IAAI,CACxB,CAAC,IAAI,CACH,IAAI,CAAC,sBAAsB,CAC3B,IAAI,CAAC,CAAC,EAAE,CAAC,CACT,KAAK,CAAC,CAAC,MAAM,CAAC,uBAAuB,CAAC,CACtC,2BAA2B,EAC3B,CACH,CACH;MAAA,EAAE,IAAI,CACR;IAAA,EAAE,iBAAiB,CAAC,CACrB,CAAA;AACH,CAAC;AAED,SAAS,UAAU,CAAC,EAClB,YAAY,EACZ,OAAO,GAIR;IACC,MAAM,MAAM,GAAG,SAAS,EAAE,CAAA;IAE1B,OAAO,CACL,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,CAC7B;MAAA,CAAC,kBAAkB,CAAC,YAAY,CAAC,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,KAAK,EAC1D;MAAA,CAAC,MAAM,CACL,KAAK,CAAC,eAAe,CACrB,YAAY,CAAC,gBAAgB,CAC7B,OAAO,CAAC,CAAC,OAAO,CAAC,CACjB,OAAO,CAAC,SAAS,CACjB,UAAU,CAAC,aAAa,CACxB,IAAI,CAAC,IAAI,EAEb;IAAA,EAAE,IAAI,CAAC,CACR,CAAA;AACH,CAAC;AAED,SAAS,UAAU,CAAC,EAAE,KAAK,EAA8B;IACvD,MAAM,MAAM,GAAG,SAAS,EAAE,CAAA;IAE1B,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAA;IAEnC,OAAO,CACL,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAC5B;MAAA,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,CAC1B,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAc,CAAC,EAAG,CAClD,CAAC,CACJ;IAAA,EAAE,IAAI,CAAC,CACR,CAAA;AACH,CAAC;AAED,oCAAoC;AACpC,oCAAoC;AACpC,oCAAoC;AAEpC,MAAM,SAAS,GAAG,CAAC,EAAE,OAAO,EAAE,KAAK,KAA6C,EAAE,EAAE,EAAE;IACpF,MAAM,EAAE,MAAM,EAAE,GAAG,QAAQ,EAAE,CAAA;IAC7B,MAAM,mBAAmB,GAAG,CAAC,CAAA;IAC7B,MAAM,mBAAmB,GAAG,CAAC,CAAA;IAE7B,OAAO,UAAU,CAAC,MAAM,CAAC;QACvB,aAAa,EAAE;YACb,IAAI,EAAE,CAAC;YACP,eAAe,EAAE,MAAM,CAAC,eAAe;SACxC;QACD,gBAAgB,EAAE;YAChB,OAAO,EAAE,EAAE;SACZ;QACD,gBAAgB,EAAE;YAChB,WAAW,EAAE,EAAE;YACf,eAAe,EAAE,MAAM,CAAC,eAAe;YACvC,mBAAmB,EAAE,OAAO,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC;YACtD,oBAAoB,EAAE,OAAO,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC;YACvD,sBAAsB,EAAE,KAAK,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC;YACvD,uBAAuB,EAAE,KAAK,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC;YACxD,YAAY,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;SAC7B;QACD,gBAAgB,EAAE;YAChB,YAAY,EAAE,EAAE;YAChB,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE;YAC7B,aAAa,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE;SAC/B;QACD,kBAAkB,EAAE;YAClB,aAAa,EAAE,mBAAmB;SACnC;QACD,wBAAwB,EAAE;YACxB,UAAU,EAAE,CAAC;YACb,aAAa,EAAE,mBAAmB;SACnC;QACD,gBAAgB,EAAE;YAChB,aAAa,EAAE,KAAc;YAC7B,UAAU,EAAE,QAAiB;YAC7B,GAAG,EAAE,CAAC;SACP;QACD,kCAAkC,EAAE;YAClC,aAAa,EAAE,EAAE;SAClB;QACD,wBAAwB,EAAE;YACxB,iBAAiB,EAAE,MAAM,CAAC,sBAAsB;YAChD,iBAAiB,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;SACjC;QACD,sBAAsB,EAAE;YACtB,UAAU,EAAE,EAAE,EAAE,4DAA4D;YAC5E,aAAa,EAAE,EAAE;SAClB;QACD,kBAAkB,EAAE;YAClB,aAAa,EAAE,mBAAmB;SACnC;QACD,wBAAwB,EAAE;YACxB,UAAU,EAAE,CAAC;YACb,aAAa,EAAE,EAAE;SAClB;QACD,uBAAuB,EAAE;YACvB,UAAU,EAAE,EAAE;YACd,aAAa,EAAE,EAAE;SAClB;QACD,sBAAsB,EAAE;YACtB,UAAU,EAAE,CAAC;YACb,aAAa,EAAE,EAAE;SAClB;QACD,cAAc,EAAE;YACd,GAAG,EAAE,CAAC;SACP;QACD,mBAAmB,EAAE;YACnB,aAAa,EAAE,KAAK;YACpB,UAAU,EAAE,QAAQ;YACpB,GAAG,EAAE,CAAC;SACP;QACD,UAAU,EAAE;YACV,KAAK,EAAE,MAAM,CAAC,yBAAyB;SACxC;QACD,iBAAiB,EAAE;YACjB,KAAK,EAAE,MAAM,CAAC,yBAAyB;SACxC;QACD,UAAU,EAAE;YACV,KAAK,EAAE,MAAM,CAAC,uBAAuB;YACrC,QAAQ,EAAE,MAAM,CAAC,UAAU;SAC5B;QACD,kBAAkB,EAAE;YAClB,KAAK,EAAE,MAAM,CAAC,yBAAyB;SACxC;QACD,wBAAwB,EAAE;YACxB,UAAU,EAAE,CAAC;YACb,cAAc,EAAE,CAAC;YACjB,WAAW,EAAE,MAAM,CAAC,iBAAiB;SACtC;QACD,mBAAmB,EAAE;YACnB,KAAK,EAAE,MAAM,CAAC,eAAe;SAC9B;QACD,UAAU,EAAE;YACV,aAAa,EAAE,KAAK;YACpB,cAAc,EAAE,eAAe;YAC/B,UAAU,EAAE,QAAQ;YACpB,GAAG,EAAE,CAAC;SACP;QACD,iBAAiB,EAAE;YACjB,IAAI,EAAE,CAAC;SACR;QACD,gBAAgB,EAAE;YAChB,UAAU,EAAE,QAAQ;SACrB;QACD,cAAc,EAAE;YACd,UAAU,EAAE,EAAE;SACf;QACD,uBAAuB,EAAE;YACvB,KAAK,EAAE,MAAM,CAAC,wBAAwB;SACvC;QACD,UAAU,EAAE;YACV,UAAU,EAAE,QAAQ;YACpB,GAAG,EAAE,EAAE;SACR;QACD,sBAAsB,EAAE;YACtB,WAAW,EAAE,CAAC;SACf;QACD,sBAAsB,EAAE;YACtB,UAAU,EAAE,EAAE;YACd,aAAa,EAAE,EAAE;YACjB,iBAAiB,EAAE,EAAE;YACrB,UAAU,EAAE,QAAQ;SACrB;QACD,SAAS,EAAE;YACT,aAAa,EAAE,KAAK;YACpB,GAAG,EAAE,CAAC;YACN,QAAQ,EAAE,MAAM;SACjB;QACD,gBAAgB,EAAE;YAChB,SAAS,EAAE,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC;YACxE,SAAS,EAAE,CAAC;SACb;QACD,oBAAoB,EAAE;YACpB,UAAU,EAAE,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC;SAC1E;KACF,CAAC,CAAA;AACJ,CAAC,CAAA","sourcesContent":["import {\n HeaderTitle as ElementsHeaderTitle,\n HeaderTitleProps,\n PlatformPressable,\n} from '@react-navigation/elements'\nimport { StackActions, StaticScreenProps, useNavigation } from '@react-navigation/native'\nimport React, {\n useCallback,\n useEffect,\n useRef,\n useState,\n type Dispatch,\n type ReactNode,\n type SetStateAction,\n} from 'react'\nimport {\n Alert,\n FlatList,\n Platform,\n Pressable,\n StyleSheet,\n TextInput,\n View,\n type ViewProps,\n type ViewStyle,\n} from 'react-native'\nimport {\n AdultRequirementNotice,\n Badge,\n Button,\n ChildNotice,\n Heading,\n Icon,\n Person,\n Switch,\n Text,\n TextButton,\n type TextStyle,\n} from '../components'\nimport { ConversationAvatar } from '../components/display/conversation_avatar'\nimport { HeaderTextButton } from '../components/display/platform_modal_header_buttons'\nimport { ButtonAppearanceUnion } from '../components/display/utils/button_colors'\nimport { useSuspensePaginator, useTheme } from '../hooks'\nimport {\n useConversation,\n useConversationDelete,\n useConversationDisableReplies,\n useConversationMute,\n useConversationUpdate,\n} from '../hooks/use_conversation'\nimport { availableFeatures, useFeatures } from '../hooks/use_features'\nimport { type ConversationResource, MemberResource, isDefined } from '../types'\nimport { GroupResource } from '../types/resources/group_resource'\nimport { genderDisplayLabel } from '../utils/gender_display_label'\nimport { tokens } from '../vendor/tapestry/tokens'\n// =========================================\n// ====== Factory Constants & Types ========\n// =========================================\n\nenum SectionTypes {\n header,\n hidden,\n members,\n loadingMembers,\n navigableSetting,\n setting,\n view,\n}\n\ntype SectionListData = Array<\n | DataItem<{ title: string; badge?: ReactNode }, SectionTypes.header>\n | DataItem<MemberResource, SectionTypes.members>\n | DataItem<any, SectionTypes.loadingMembers>\n | DataItem<NavigableSettingRowProps, SectionTypes.navigableSetting>\n | DataItem<ViewProps, SectionTypes.view>\n | DataItem<SettingRowProps, SectionTypes.setting>\n | DataItem<any, SectionTypes.hidden>\n>\n\ninterface DataItem<T, TName extends SectionTypes> {\n type: TName\n data: T\n sectionOuterStyle?: ViewStyle\n sectionInnerStyle?: ViewStyle\n showBottomBorder?: boolean\n}\n\n// =================================\n// ====== Components ===============\n// =================================\n\nexport type ConversationDetailsScreenProps = StaticScreenProps<{\n conversation_id: number\n}>\n\nexport function ConversationDetailsScreen({ route }: ConversationDetailsScreenProps) {\n const navigation = useNavigation()\n const styles = useStyles()\n\n const { data: conversation } = useConversation(route.params)\n const [title, setTitle] = useState(conversation.title)\n const { conversation_id } = route.params\n const { repliesDisabled, setRepliesDisabled } = useConversationDisableReplies(route.params)\n const { mutate: saveTitle } = useConversationUpdate(route.params)\n const { mutate: deleteConversation } = useConversationDelete(route.params)\n const { featureEnabled } = useFeatures()\n const granularNotificationsEnabled = featureEnabled(availableFeatures.granular_notifications_ui)\n const customAvatarsEnabled = featureEnabled(availableFeatures.custom_conversation_avatars)\n const showGenderFilter =\n featureEnabled(availableFeatures.gender_specific_conversations) && !!conversation.genderOption\n const genderLabel = conversation.genderOption ? genderDisplayLabel(conversation.genderOption) : ''\n const { muted, setMuted } = useConversationMute({ conversation_id })\n\n const trimmedTitle = title.trim()\n const emptyTitle = trimmedTitle === '' || title === null\n\n const notificationLevelDescription =\n conversation?.conversationMembership?.notificationLevelDescription\n const canUpdate = conversation.memberAbility?.canUpdate || false\n const canDelete = conversation.memberAbility?.canDelete || false\n const isLeader = conversation.memberAbility?.leader || false\n const isDisabled = conversation.disabled ?? false\n\n const {\n data: members,\n fetchNextPage: fetchNextPageOfMembers,\n isFetchingNextPage: isLoadingMembers,\n } = useSuspensePaginator<MemberResource>({\n url: `/me/conversations/${route.params.conversation_id}/members`,\n data: {\n include: ['person'],\n fields: {\n Member: ['avatar', 'name', 'first_name', 'last_name', 'child', 'badges'],\n },\n },\n })\n\n const memberSectionStyleMap = {\n first: styles.sectionInnerFirstMember,\n middle: styles.sectionInnerMiddleMiddle,\n last: styles.sectionInnerLastMember,\n }\n\n const memberItems = members.map((data, index) => {\n const isFirst = index === 0\n const isLast = index === members.length - 1\n const memberPosition = isFirst ? 'first' : isLast ? 'last' : 'middle'\n const memberSectionStyle = memberSectionStyleMap[memberPosition]\n\n return {\n type: data.child ? SectionTypes.hidden : SectionTypes.members,\n data,\n sectionInnerStyle: memberSectionStyle,\n }\n })\n\n const loadingMemberItems = isLoadingMembers\n ? [\n {\n type: SectionTypes.loadingMembers,\n data: {},\n sectionInnerStyle: styles.sectionInnerFirstMember,\n },\n ]\n : []\n\n const childMembers = members.filter(member => member.child)\n const hasChildren = childMembers.length > 0\n\n const teamsGroup =\n conversation.groups\n ?.filter(g => g.sourceAppName === 'Services')\n ?.filter(g => ['Team', 'PlanTeam'].includes(g.sourceType))\n ?.filter(g => g.name !== null) || []\n const hasTeams = teamsGroup.length > 0\n\n const badge = conversation.badges?.[0]\n const resourceType = badge?.pcoResourceType || ''\n const productName = badge?.appName\n const name = badge?.text || undefined\n\n const handleDelete = useCallback(() => {\n Alert.alert(\n 'Delete conversation',\n `All messages in ${title} will be deleted for everyone. This action cannot be undone.`,\n [\n {\n text: 'Cancel',\n style: 'cancel',\n },\n {\n text: 'Delete',\n style: 'destructive',\n onPress: () => {\n deleteConversation()\n navigation.dispatch(StackActions.popToTop())\n },\n },\n ]\n )\n }, [deleteConversation, navigation, title])\n\n const HeaderTitle = useCallback(\n (props: HeaderTitleProps) => {\n return (\n <View style={styles.headerTitleContainer}>\n <ElementsHeaderTitle maxFontSizeMultiplier={1} {...props} />\n <Badge\n variant=\"metaSubtle\"\n label={resourceType}\n metaLabel={name}\n style={styles.headerTitleBadge}\n productLogoName={productName}\n maxFontSizeMultiplier={1}\n />\n </View>\n )\n },\n [name, productName, resourceType, styles.headerTitleBadge, styles.headerTitleContainer]\n )\n\n const HeaderRight = useCallback(() => {\n return (\n <HeaderTextButton\n onPress={() => {\n saveTitle({ title: trimmedTitle || conversation.title })\n navigation.goBack()\n }}\n title=\"Done\"\n />\n )\n }, [conversation.title, navigation, saveTitle, trimmedTitle])\n\n useEffect(() => {\n navigation.setOptions({\n headerRight: HeaderRight,\n headerTitle: HeaderTitle,\n })\n }, [HeaderRight, HeaderTitle, navigation])\n\n const listData = [\n {\n type: canUpdate && customAvatarsEnabled ? SectionTypes.view : SectionTypes.hidden,\n data: {\n children: (\n <AvatarCard\n conversation={conversation}\n onPress={() => navigation.navigate('AvatarPicker', { conversation_id })}\n />\n ),\n },\n sectionOuterStyle: styles.sectionOuterAvatarCard,\n sectionInnerStyle: styles.sectionInnerAvatarCard,\n },\n {\n type: SectionTypes.header,\n data: { title: 'Basic info' },\n showBottomBorder: true,\n sectionInnerStyle: styles.sectionInnerHeaderWithBottomBorder,\n },\n {\n type: SectionTypes.view,\n data: {\n children: (\n <TitleInput\n canUpdate={canUpdate}\n title={title}\n setTitle={setTitle}\n isEmpty={emptyTitle}\n />\n ),\n },\n sectionInnerStyle: styles.sectionInnerTitleInput,\n },\n {\n type: SectionTypes.header,\n data: { title: 'Settings' },\n showBottomBorder: true,\n sectionInnerStyle: styles.sectionInnerHeaderWithBottomBorder,\n },\n granularNotificationsEnabled\n ? {\n type: SectionTypes.navigableSetting,\n data: {\n title: 'Notifications',\n subtitle: notificationLevelDescription,\n onPress: () =>\n navigation.navigate('ConversationNotificationLevelSelect', { conversation_id }),\n },\n showBottomBorder: true,\n }\n : {\n type: SectionTypes.setting,\n data: {\n title: 'Mute',\n rightItem: <Switch value={muted} onValueChange={value => setMuted(value)} />,\n },\n showBottomBorder: true,\n },\n {\n type: canUpdate ? SectionTypes.setting : SectionTypes.hidden,\n data: {\n title: 'Only leaders can message',\n rightItem: (\n <Switch value={repliesDisabled} onChange={() => setRepliesDisabled(!repliesDisabled)} />\n ),\n },\n showBottomBorder: true,\n },\n {\n type: canDelete ? SectionTypes.setting : SectionTypes.hidden,\n data: {\n title: 'Delete conversation…',\n buttonTextStyle: styles.deleteButtonText,\n appearance: 'danger',\n onPress: handleDelete,\n },\n },\n {\n type: hasTeams ? SectionTypes.header : SectionTypes.hidden,\n data: { title: 'Teams' },\n sectionInnerStyle: styles.sectionInnerHeader,\n },\n {\n type: hasTeams ? SectionTypes.view : SectionTypes.hidden,\n data: {\n children: <TeamsGroup teams={teamsGroup} />,\n },\n },\n {\n type: SectionTypes.header,\n data: {\n title: 'People',\n badge: showGenderFilter ? <Badge label={`${genderLabel}-only`} /> : undefined,\n },\n sectionInnerStyle: styles.sectionInnerHeader,\n },\n {\n type: showGenderFilter ? SectionTypes.view : SectionTypes.hidden,\n data: {\n children: (\n <Text variant=\"tertiary\">\n This conversation will be automatically updated if any {genderLabel.toLowerCase()} are\n added or removed from this group.\n </Text>\n ),\n },\n sectionInnerStyle: styles.sectionInnerGenderNotice,\n },\n {\n type: isDisabled ? SectionTypes.view : SectionTypes.hidden,\n data: {\n children: <AdultRequirementNotice />,\n },\n sectionInnerStyle: styles.sectionInnerNotice,\n },\n {\n type: hasChildren && isLeader ? SectionTypes.view : SectionTypes.hidden,\n data: {\n children: <ChildNotice childMembers={childMembers} />,\n },\n sectionInnerStyle: styles.sectionInnerNotice,\n },\n ...memberItems,\n ...loadingMemberItems,\n ].filter(item => item.type !== SectionTypes.hidden)\n\n const headerIndices = listData\n .map(({ type }, index) => (type === SectionTypes.header ? index : undefined))\n .filter(isDefined)\n\n return (\n <View style={styles.listContainer}>\n <FlatList\n data={listData as SectionListData}\n contentContainerStyle={styles.contentContainer}\n renderItem={({ item, index }) => {\n const [isStart, isEnd] = [\n index === 0 || headerIndices.includes(index),\n index === listData.length - 1 || headerIndices.includes(index + 1),\n ]\n\n switch (item.type) {\n case SectionTypes.header:\n return (\n <ListSection\n isStart={isStart}\n isEnd={isEnd}\n showBottomBorder={item?.showBottomBorder}\n outerStyle={item?.sectionOuterStyle}\n innerStyle={item?.sectionInnerStyle}\n >\n {item.data.badge ? (\n <View style={styles.sectionHeaderRow}>\n <Heading variant=\"h3\">{item.data.title}</Heading>\n {item.data.badge}\n </View>\n ) : (\n <Heading variant=\"h3\">{item.data.title}</Heading>\n )}\n </ListSection>\n )\n case SectionTypes.members:\n return (\n <ListSection\n isStart={isStart}\n isEnd={isEnd}\n showBottomBorder={item?.showBottomBorder}\n outerStyle={item?.sectionOuterStyle}\n innerStyle={item?.sectionInnerStyle}\n >\n <Person person={{ ...item.data }} />\n </ListSection>\n )\n case SectionTypes.loadingMembers:\n return (\n <ListSection\n isStart={isStart}\n isEnd={isEnd}\n showBottomBorder={item?.showBottomBorder}\n outerStyle={item?.sectionOuterStyle}\n innerStyle={item?.sectionInnerStyle}\n >\n <Text>Loading more...</Text>\n </ListSection>\n )\n case SectionTypes.navigableSetting:\n return (\n <ListSection\n isStart={isStart}\n isEnd={isEnd}\n showBottomBorder={item?.showBottomBorder}\n outerStyle={item?.sectionOuterStyle}\n innerStyle={item?.sectionInnerStyle}\n >\n <NavigableSettingRow {...item.data} />\n </ListSection>\n )\n case SectionTypes.setting:\n return (\n <ListSection\n isStart={isStart}\n isEnd={isEnd}\n showBottomBorder={item?.showBottomBorder}\n outerStyle={item?.sectionOuterStyle}\n innerStyle={item?.sectionInnerStyle}\n >\n <SettingRow {...item.data} />\n </ListSection>\n )\n case SectionTypes.view:\n return (\n <ListSection\n isStart={isStart}\n isEnd={isEnd}\n showBottomBorder={item?.showBottomBorder}\n outerStyle={item?.sectionOuterStyle}\n innerStyle={item?.sectionInnerStyle}\n >\n <View {...item.data} style={item.data.style} />\n </ListSection>\n )\n default:\n return null\n }\n }}\n onEndReached={() => fetchNextPageOfMembers()}\n />\n </View>\n )\n}\n\ninterface ListSectionProps {\n isStart?: boolean\n isEnd?: boolean\n showBottomBorder?: boolean\n outerStyle?: ViewStyle\n innerStyle?: ViewStyle\n children: ReactNode\n}\n\nfunction ListSection({\n isStart,\n isEnd,\n showBottomBorder,\n outerStyle,\n innerStyle,\n children,\n}: ListSectionProps) {\n const styles = useStyles({ isStart, isEnd })\n const bottomBorder = showBottomBorder ? styles.sectionInnerBottomBorder : {}\n\n return (\n <View style={[styles.sectionOuterBase, outerStyle]}>\n <View style={[styles.sectionInnerBase, bottomBorder, innerStyle]}>{children}</View>\n </View>\n )\n}\n\ninterface InputProps {\n canUpdate: boolean\n title: string\n setTitle: Dispatch<SetStateAction<string>>\n style?: ViewStyle\n isEmpty: boolean\n}\n\nfunction TitleInput({ canUpdate, title, setTitle, style, isEmpty }: InputProps) {\n const styles = useStyles()\n const textRef = useRef<TextInput>(null)\n\n const handleFocus = () => {\n if (textRef.current) {\n textRef.current.focus()\n }\n }\n\n return (\n <Pressable style={[styles.titleContainer, style]} onPress={() => handleFocus()}>\n <View style={styles.titleLabelContainer}>\n <Text variant=\"tertiary\" style={styles.titleLabel}>\n Title\n </Text>\n {!canUpdate && <Icon name=\"general.lock\" style={styles.titleDisabledIcon} />}\n </View>\n <TextInput\n ref={textRef}\n editable={canUpdate}\n onChangeText={setTitle}\n style={[styles.titleInput, !canUpdate && styles.titleInputDisabled]}\n value={title}\n multiline\n maxLength={255} // Matches Chat Web\n enterKeyHint=\"done\"\n submitBehavior=\"blurAndSubmit\"\n />\n {isEmpty && (\n <View style={styles.inputValidationContainer}>\n <Text variant=\"footnote\" style={styles.inputValidationText}>\n A title is required for your conversation.\n </Text>\n </View>\n )}\n </Pressable>\n )\n}\n\ninterface NavigableSettingRowProps {\n title: string\n subtitle?: string\n onPress: () => void\n}\n\ninterface SettingRowProps {\n title: string\n style?: ViewStyle\n rightItem?: ReactNode\n titleStyle?: TextStyle\n buttonTextStyle?: TextStyle\n subtitle?: string\n rightItemStyle?: ViewStyle\n appearance?: ButtonAppearanceUnion\n onPress?: () => void\n}\n\nfunction SettingRow({\n title,\n style,\n titleStyle = {},\n buttonTextStyle = {},\n subtitle,\n rightItem,\n rightItemStyle = {},\n appearance,\n onPress,\n}: SettingRowProps) {\n const styles = useStyles()\n\n if (onPress) {\n return (\n <TextButton\n style={[styles.settingRow, style]}\n textStyle={buttonTextStyle}\n appearance={appearance}\n onPress={onPress}\n >\n {title}\n </TextButton>\n )\n }\n\n return (\n <View style={[styles.settingRow, style]}>\n <View style={styles.settingRowContent}>\n <Text variant=\"plain\" style={[styles.settingRowText, titleStyle]}>\n {title}\n </Text>\n {Boolean(subtitle) && <Text variant=\"footnote\">{subtitle}</Text>}\n </View>\n {Boolean(rightItem) && <View style={rightItemStyle}>{rightItem}</View>}\n </View>\n )\n}\n\nfunction NavigableSettingRow({ title, subtitle, onPress }: NavigableSettingRowProps) {\n const styles = useStyles()\n return (\n <PlatformPressable onPress={onPress} accessibilityRole=\"button\">\n <View style={styles.settingRow}>\n <View style={styles.settingRowContent}>\n <Text variant=\"plain\" style={styles.settingRowText}>\n {title}\n </Text>\n {Boolean(subtitle) && <Text variant=\"footnote\">{subtitle}</Text>}\n </View>\n {Platform.OS === 'ios' && (\n <Icon\n name=\"general.rightChevron\"\n size={16}\n style={styles.navigableSettingChevron}\n accessibilityElementsHidden\n />\n )}\n </View>\n </PlatformPressable>\n )\n}\n\nfunction AvatarCard({\n conversation,\n onPress,\n}: {\n conversation: ConversationResource\n onPress: () => void\n}) {\n const styles = useStyles()\n\n return (\n <View style={styles.avatarCard}>\n <ConversationAvatar conversation={conversation} size=\"2xl\" />\n <Button\n title=\"Update avatar\"\n iconNameLeft=\"general.pencil\"\n onPress={onPress}\n variant=\"outline\"\n appearance=\"interaction\"\n size=\"sm\"\n />\n </View>\n )\n}\n\nfunction TeamsGroup({ teams }: { teams: GroupResource[] }) {\n const styles = useStyles()\n\n if (teams.length === 0) return null\n\n return (\n <View style={styles.teamGroup}>\n {teams.map((team, index) => (\n <Badge key={index} label={team.name as string} />\n ))}\n </View>\n )\n}\n\n// =================================\n// ====== Styles ===================\n// =================================\n\nconst useStyles = ({ isStart, isEnd }: { isStart?: boolean; isEnd?: boolean } = {}) => {\n const { colors } = useTheme()\n const headerBottomPadding = 4\n const sectionBorderRadius = 8\n\n return StyleSheet.create({\n listContainer: {\n flex: 1,\n backgroundColor: colors.surfaceColor080,\n },\n contentContainer: {\n padding: 16,\n },\n sectionOuterBase: {\n paddingLeft: 16,\n backgroundColor: colors.surfaceColor100,\n borderTopLeftRadius: isStart ? sectionBorderRadius : 0,\n borderTopRightRadius: isStart ? sectionBorderRadius : 0,\n borderBottomLeftRadius: isEnd ? sectionBorderRadius : 0,\n borderBottomRightRadius: isEnd ? sectionBorderRadius : 0,\n marginBottom: isEnd ? 16 : 0,\n },\n sectionInnerBase: {\n paddingRight: 16,\n paddingTop: isStart ? 16 : 12,\n paddingBottom: isEnd ? 16 : 12,\n },\n sectionInnerHeader: {\n paddingBottom: headerBottomPadding,\n },\n sectionInnerGenderNotice: {\n paddingTop: 0,\n paddingBottom: headerBottomPadding,\n },\n sectionHeaderRow: {\n flexDirection: 'row' as const,\n alignItems: 'center' as const,\n gap: 8,\n },\n sectionInnerHeaderWithBottomBorder: {\n paddingBottom: 16,\n },\n sectionInnerBottomBorder: {\n borderBottomColor: colors.borderColorDefaultBase,\n borderBottomWidth: isEnd ? 0 : 1,\n },\n sectionInnerTitleInput: {\n paddingTop: 12, // paddingVertical doesn't override the sectionInner padding\n paddingBottom: 12,\n },\n sectionInnerNotice: {\n paddingBottom: headerBottomPadding,\n },\n sectionInnerMiddleMiddle: {\n paddingTop: 0,\n paddingBottom: 12,\n },\n sectionInnerFirstMember: {\n paddingTop: 12,\n paddingBottom: 12,\n },\n sectionInnerLastMember: {\n paddingTop: 0,\n paddingBottom: 16,\n },\n titleContainer: {\n gap: 4,\n },\n titleLabelContainer: {\n flexDirection: 'row',\n alignItems: 'center',\n gap: 4,\n },\n titleLabel: {\n color: colors.textColorDefaultSecondary,\n },\n titleDisabledIcon: {\n color: colors.iconColorDefaultSecondary,\n },\n titleInput: {\n color: colors.textColorDefaultPrimary,\n fontSize: tokens.fontSizeMd,\n },\n titleInputDisabled: {\n color: colors.textColorDefaultSecondary,\n },\n inputValidationContainer: {\n paddingTop: 8,\n borderTopWidth: 1,\n borderColor: colors.statusErrorBorder,\n },\n inputValidationText: {\n color: colors.statusErrorText,\n },\n settingRow: {\n flexDirection: 'row',\n justifyContent: 'space-between',\n alignItems: 'center',\n gap: 8,\n },\n settingRowContent: {\n flex: 1,\n },\n deleteButtonText: {\n fontWeight: 'normal',\n },\n settingRowText: {\n lineHeight: 20,\n },\n navigableSettingChevron: {\n color: colors.iconColorDefaultDisabled,\n },\n avatarCard: {\n alignItems: 'center',\n gap: 16,\n },\n sectionOuterAvatarCard: {\n paddingLeft: 0,\n },\n sectionInnerAvatarCard: {\n paddingTop: 24,\n paddingBottom: 24,\n paddingHorizontal: 16,\n alignItems: 'center',\n },\n teamGroup: {\n flexDirection: 'row',\n gap: 4,\n flexWrap: 'wrap',\n },\n headerTitleBadge: {\n alignSelf: Platform.select({ android: 'flex-start', default: 'center' }),\n marginTop: 2,\n },\n headerTitleContainer: {\n alignItems: Platform.select({ android: 'flex-start', default: 'center' }),\n },\n })\n}\n"]}
1
+ {"version":3,"file":"conversation_details_screen.js","sourceRoot":"","sources":["../../src/screens/conversation_details_screen.tsx"],"names":[],"mappings":"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","sourcesContent":["import {\n HeaderTitle as ElementsHeaderTitle,\n HeaderTitleProps,\n PlatformPressable,\n} from '@react-navigation/elements'\nimport { StackActions, StaticScreenProps, useNavigation } from '@react-navigation/native'\nimport React, {\n useCallback,\n useEffect,\n useRef,\n useState,\n type Dispatch,\n type ReactNode,\n type SetStateAction,\n} from 'react'\nimport {\n Alert,\n FlatList,\n Platform,\n Pressable,\n StyleSheet,\n TextInput,\n View,\n type ViewProps,\n type ViewStyle,\n} from 'react-native'\nimport {\n AdultRequirementNotice,\n Badge,\n Button,\n ChildNotice,\n Heading,\n Icon,\n Person,\n Switch,\n Text,\n TextButton,\n type TextStyle,\n} from '../components'\nimport { ConversationAvatar } from '../components/display/conversation_avatar'\nimport { HeaderTextButton } from '../components/display/platform_modal_header_buttons'\nimport { ButtonAppearanceUnion } from '../components/display/utils/button_colors'\nimport { useSuspensePaginator, useTheme } from '../hooks'\nimport {\n useConversation,\n useConversationDelete,\n useConversationDisableReplies,\n useConversationMute,\n useConversationUpdate,\n} from '../hooks/use_conversation'\nimport { availableFeatures, useFeatures } from '../hooks/use_features'\nimport { type ConversationResource, MemberResource, isDefined } from '../types'\nimport { GroupResource } from '../types/resources/group_resource'\nimport { genderDisplayLabel } from '../utils/gender_display_label'\nimport { tokens } from '../vendor/tapestry/tokens'\n// =========================================\n// ====== Factory Constants & Types ========\n// =========================================\n\nenum SectionTypes {\n header,\n hidden,\n members,\n loadingMembers,\n navigableSetting,\n setting,\n view,\n}\n\ntype SectionListData = Array<\n | DataItem<{ title: string; badge?: ReactNode }, SectionTypes.header>\n | DataItem<MemberResource, SectionTypes.members>\n | DataItem<any, SectionTypes.loadingMembers>\n | DataItem<NavigableSettingRowProps, SectionTypes.navigableSetting>\n | DataItem<ViewProps, SectionTypes.view>\n | DataItem<SettingRowProps, SectionTypes.setting>\n | DataItem<any, SectionTypes.hidden>\n>\n\ninterface DataItem<T, TName extends SectionTypes> {\n type: TName\n data: T\n sectionOuterStyle?: ViewStyle\n sectionInnerStyle?: ViewStyle\n showBottomBorder?: boolean\n}\n\n// =================================\n// ====== Components ===============\n// =================================\n\nexport type ConversationDetailsScreenProps = StaticScreenProps<{\n conversation_id: number\n}>\n\nexport function ConversationDetailsScreen({ route }: ConversationDetailsScreenProps) {\n const navigation = useNavigation()\n const styles = useStyles()\n\n const { data: conversation } = useConversation(route.params)\n const [title, setTitle] = useState(conversation.title)\n const { conversation_id } = route.params\n const { repliesDisabled, setRepliesDisabled } = useConversationDisableReplies(route.params)\n const { mutate: saveTitle } = useConversationUpdate(route.params)\n const { mutate: deleteConversation } = useConversationDelete(route.params)\n const { featureEnabled } = useFeatures()\n const granularNotificationsEnabled = featureEnabled(availableFeatures.granular_notifications_ui)\n const customAvatarsEnabled = featureEnabled(availableFeatures.custom_conversation_avatars)\n const showGenderFilter =\n featureEnabled(availableFeatures.gender_specific_conversations) && !!conversation.genderOption\n const genderLabel = conversation.genderOption ? genderDisplayLabel(conversation.genderOption) : ''\n const { muted, setMuted } = useConversationMute({ conversation_id })\n\n const trimmedTitle = title.trim()\n const emptyTitle = trimmedTitle === '' || title === null\n\n const notificationLevelDescription =\n conversation?.conversationMembership?.notificationLevelDescription\n const canUpdate = conversation.memberAbility?.canUpdate || false\n const canDelete = conversation.memberAbility?.canDelete || false\n const isLeader = conversation.memberAbility?.leader || false\n const isDisabled = conversation.disabled ?? false\n\n const {\n data: members,\n fetchNextPage: fetchNextPageOfMembers,\n isFetchingNextPage: isLoadingMembers,\n } = useSuspensePaginator<MemberResource>({\n url: `/me/conversations/${route.params.conversation_id}/members`,\n data: {\n include: ['person'],\n fields: {\n Member: ['avatar', 'name', 'first_name', 'last_name', 'child', 'badges'],\n },\n },\n })\n\n const memberSectionStyleMap = {\n first: styles.sectionInnerFirstMember,\n middle: styles.sectionInnerMiddleMiddle,\n last: styles.sectionInnerLastMember,\n }\n\n const memberItems = members.map((data, index) => {\n const isFirst = index === 0\n const isLast = index === members.length - 1\n const memberPosition = isFirst ? 'first' : isLast ? 'last' : 'middle'\n const memberSectionStyle = memberSectionStyleMap[memberPosition]\n\n return {\n type: SectionTypes.members,\n data,\n sectionInnerStyle: memberSectionStyle,\n }\n })\n\n const loadingMemberItems = isLoadingMembers\n ? [\n {\n type: SectionTypes.loadingMembers,\n data: {},\n sectionInnerStyle: styles.sectionInnerFirstMember,\n },\n ]\n : []\n\n const childMembers = members.filter(member => member.child)\n const hasChildren = childMembers.length > 0\n\n const teamsGroup =\n conversation.groups\n ?.filter(g => g.sourceAppName === 'Services')\n ?.filter(g => ['Team', 'PlanTeam'].includes(g.sourceType))\n ?.filter(g => g.name !== null) || []\n const hasTeams = teamsGroup.length > 0\n\n const badge = conversation.badges?.[0]\n const resourceType = badge?.pcoResourceType || ''\n const productName = badge?.appName\n const name = badge?.text || undefined\n\n const handleDelete = useCallback(() => {\n Alert.alert(\n 'Delete conversation',\n `All messages in ${title} will be deleted for everyone. This action cannot be undone.`,\n [\n {\n text: 'Cancel',\n style: 'cancel',\n },\n {\n text: 'Delete',\n style: 'destructive',\n onPress: () => {\n deleteConversation()\n navigation.dispatch(StackActions.popToTop())\n },\n },\n ]\n )\n }, [deleteConversation, navigation, title])\n\n const HeaderTitle = useCallback(\n (props: HeaderTitleProps) => {\n return (\n <View style={styles.headerTitleContainer}>\n <ElementsHeaderTitle maxFontSizeMultiplier={1} {...props} />\n <Badge\n variant=\"metaSubtle\"\n label={resourceType}\n metaLabel={name}\n style={styles.headerTitleBadge}\n productLogoName={productName}\n maxFontSizeMultiplier={1}\n />\n </View>\n )\n },\n [name, productName, resourceType, styles.headerTitleBadge, styles.headerTitleContainer]\n )\n\n const HeaderRight = useCallback(() => {\n return (\n <HeaderTextButton\n onPress={() => {\n saveTitle({ title: trimmedTitle || conversation.title })\n navigation.goBack()\n }}\n title=\"Done\"\n />\n )\n }, [conversation.title, navigation, saveTitle, trimmedTitle])\n\n useEffect(() => {\n navigation.setOptions({\n headerRight: HeaderRight,\n headerTitle: HeaderTitle,\n })\n }, [HeaderRight, HeaderTitle, navigation])\n\n const listData = [\n {\n type: canUpdate && customAvatarsEnabled ? SectionTypes.view : SectionTypes.hidden,\n data: {\n children: (\n <AvatarCard\n conversation={conversation}\n onPress={() => navigation.navigate('AvatarPicker', { conversation_id })}\n />\n ),\n },\n sectionOuterStyle: styles.sectionOuterAvatarCard,\n sectionInnerStyle: styles.sectionInnerAvatarCard,\n },\n {\n type: SectionTypes.header,\n data: { title: 'Basic info' },\n showBottomBorder: true,\n sectionInnerStyle: styles.sectionInnerHeaderWithBottomBorder,\n },\n {\n type: SectionTypes.view,\n data: {\n children: (\n <TitleInput\n canUpdate={canUpdate}\n title={title}\n setTitle={setTitle}\n isEmpty={emptyTitle}\n />\n ),\n },\n sectionInnerStyle: styles.sectionInnerTitleInput,\n },\n {\n type: SectionTypes.header,\n data: { title: 'Settings' },\n showBottomBorder: true,\n sectionInnerStyle: styles.sectionInnerHeaderWithBottomBorder,\n },\n granularNotificationsEnabled\n ? {\n type: SectionTypes.navigableSetting,\n data: {\n title: 'Notifications',\n subtitle: notificationLevelDescription,\n onPress: () =>\n navigation.navigate('ConversationNotificationLevelSelect', { conversation_id }),\n },\n showBottomBorder: true,\n }\n : {\n type: SectionTypes.setting,\n data: {\n title: 'Mute',\n rightItem: <Switch value={muted} onValueChange={value => setMuted(value)} />,\n },\n showBottomBorder: true,\n },\n {\n type: canUpdate ? SectionTypes.setting : SectionTypes.hidden,\n data: {\n title: 'Only leaders can message',\n rightItem: (\n <Switch value={repliesDisabled} onChange={() => setRepliesDisabled(!repliesDisabled)} />\n ),\n },\n showBottomBorder: true,\n },\n {\n type: canDelete ? SectionTypes.setting : SectionTypes.hidden,\n data: {\n title: 'Delete conversation…',\n buttonTextStyle: styles.deleteButtonText,\n appearance: 'danger',\n onPress: handleDelete,\n },\n },\n {\n type: hasTeams ? SectionTypes.header : SectionTypes.hidden,\n data: { title: 'Teams' },\n sectionInnerStyle: styles.sectionInnerHeader,\n },\n {\n type: hasTeams ? SectionTypes.view : SectionTypes.hidden,\n data: {\n children: <TeamsGroup teams={teamsGroup} />,\n },\n },\n {\n type: SectionTypes.header,\n data: {\n title: 'People',\n badge: showGenderFilter ? <Badge label={`${genderLabel}-only`} /> : undefined,\n },\n sectionInnerStyle: styles.sectionInnerHeader,\n },\n {\n type: showGenderFilter ? SectionTypes.view : SectionTypes.hidden,\n data: {\n children: (\n <Text variant=\"tertiary\">\n This conversation will be automatically updated if any {genderLabel.toLowerCase()} are\n added or removed from this group.\n </Text>\n ),\n },\n sectionInnerStyle: styles.sectionInnerGenderNotice,\n },\n {\n type: isDisabled ? SectionTypes.view : SectionTypes.hidden,\n data: {\n children: <AdultRequirementNotice />,\n },\n sectionInnerStyle: styles.sectionInnerNotice,\n },\n {\n type: hasChildren && isLeader ? SectionTypes.view : SectionTypes.hidden,\n data: {\n children: <ChildNotice childMembers={childMembers} />,\n },\n sectionInnerStyle: styles.sectionInnerNotice,\n },\n ...memberItems,\n ...loadingMemberItems,\n ].filter(item => item.type !== SectionTypes.hidden)\n\n const headerIndices = listData\n .map(({ type }, index) => (type === SectionTypes.header ? index : undefined))\n .filter(isDefined)\n\n return (\n <View style={styles.listContainer}>\n <FlatList\n data={listData as SectionListData}\n contentContainerStyle={styles.contentContainer}\n renderItem={({ item, index }) => {\n const [isStart, isEnd] = [\n index === 0 || headerIndices.includes(index),\n index === listData.length - 1 || headerIndices.includes(index + 1),\n ]\n\n switch (item.type) {\n case SectionTypes.header:\n return (\n <ListSection\n isStart={isStart}\n isEnd={isEnd}\n showBottomBorder={item?.showBottomBorder}\n outerStyle={item?.sectionOuterStyle}\n innerStyle={item?.sectionInnerStyle}\n >\n {item.data.badge ? (\n <View style={styles.sectionHeaderRow}>\n <Heading variant=\"h3\">{item.data.title}</Heading>\n {item.data.badge}\n </View>\n ) : (\n <Heading variant=\"h3\">{item.data.title}</Heading>\n )}\n </ListSection>\n )\n case SectionTypes.members:\n return (\n <ListSection\n isStart={isStart}\n isEnd={isEnd}\n showBottomBorder={item?.showBottomBorder}\n outerStyle={item?.sectionOuterStyle}\n innerStyle={item?.sectionInnerStyle}\n >\n <Person person={{ ...item.data }} />\n </ListSection>\n )\n case SectionTypes.loadingMembers:\n return (\n <ListSection\n isStart={isStart}\n isEnd={isEnd}\n showBottomBorder={item?.showBottomBorder}\n outerStyle={item?.sectionOuterStyle}\n innerStyle={item?.sectionInnerStyle}\n >\n <Text>Loading more...</Text>\n </ListSection>\n )\n case SectionTypes.navigableSetting:\n return (\n <ListSection\n isStart={isStart}\n isEnd={isEnd}\n showBottomBorder={item?.showBottomBorder}\n outerStyle={item?.sectionOuterStyle}\n innerStyle={item?.sectionInnerStyle}\n >\n <NavigableSettingRow {...item.data} />\n </ListSection>\n )\n case SectionTypes.setting:\n return (\n <ListSection\n isStart={isStart}\n isEnd={isEnd}\n showBottomBorder={item?.showBottomBorder}\n outerStyle={item?.sectionOuterStyle}\n innerStyle={item?.sectionInnerStyle}\n >\n <SettingRow {...item.data} />\n </ListSection>\n )\n case SectionTypes.view:\n return (\n <ListSection\n isStart={isStart}\n isEnd={isEnd}\n showBottomBorder={item?.showBottomBorder}\n outerStyle={item?.sectionOuterStyle}\n innerStyle={item?.sectionInnerStyle}\n >\n <View {...item.data} style={item.data.style} />\n </ListSection>\n )\n default:\n return null\n }\n }}\n onEndReached={() => fetchNextPageOfMembers()}\n />\n </View>\n )\n}\n\ninterface ListSectionProps {\n isStart?: boolean\n isEnd?: boolean\n showBottomBorder?: boolean\n outerStyle?: ViewStyle\n innerStyle?: ViewStyle\n children: ReactNode\n}\n\nfunction ListSection({\n isStart,\n isEnd,\n showBottomBorder,\n outerStyle,\n innerStyle,\n children,\n}: ListSectionProps) {\n const styles = useStyles({ isStart, isEnd })\n const bottomBorder = showBottomBorder ? styles.sectionInnerBottomBorder : {}\n\n return (\n <View style={[styles.sectionOuterBase, outerStyle]}>\n <View style={[styles.sectionInnerBase, bottomBorder, innerStyle]}>{children}</View>\n </View>\n )\n}\n\ninterface InputProps {\n canUpdate: boolean\n title: string\n setTitle: Dispatch<SetStateAction<string>>\n style?: ViewStyle\n isEmpty: boolean\n}\n\nfunction TitleInput({ canUpdate, title, setTitle, style, isEmpty }: InputProps) {\n const styles = useStyles()\n const textRef = useRef<TextInput>(null)\n\n const handleFocus = () => {\n if (textRef.current) {\n textRef.current.focus()\n }\n }\n\n return (\n <Pressable style={[styles.titleContainer, style]} onPress={() => handleFocus()}>\n <View style={styles.titleLabelContainer}>\n <Text variant=\"tertiary\" style={styles.titleLabel}>\n Title\n </Text>\n {!canUpdate && <Icon name=\"general.lock\" style={styles.titleDisabledIcon} />}\n </View>\n <TextInput\n ref={textRef}\n editable={canUpdate}\n onChangeText={setTitle}\n style={[styles.titleInput, !canUpdate && styles.titleInputDisabled]}\n value={title}\n multiline\n maxLength={255} // Matches Chat Web\n enterKeyHint=\"done\"\n submitBehavior=\"blurAndSubmit\"\n />\n {isEmpty && (\n <View style={styles.inputValidationContainer}>\n <Text variant=\"footnote\" style={styles.inputValidationText}>\n A title is required for your conversation.\n </Text>\n </View>\n )}\n </Pressable>\n )\n}\n\ninterface NavigableSettingRowProps {\n title: string\n subtitle?: string\n onPress: () => void\n}\n\ninterface SettingRowProps {\n title: string\n style?: ViewStyle\n rightItem?: ReactNode\n titleStyle?: TextStyle\n buttonTextStyle?: TextStyle\n subtitle?: string\n rightItemStyle?: ViewStyle\n appearance?: ButtonAppearanceUnion\n onPress?: () => void\n}\n\nfunction SettingRow({\n title,\n style,\n titleStyle = {},\n buttonTextStyle = {},\n subtitle,\n rightItem,\n rightItemStyle = {},\n appearance,\n onPress,\n}: SettingRowProps) {\n const styles = useStyles()\n\n if (onPress) {\n return (\n <TextButton\n style={[styles.settingRow, style]}\n textStyle={buttonTextStyle}\n appearance={appearance}\n onPress={onPress}\n >\n {title}\n </TextButton>\n )\n }\n\n return (\n <View style={[styles.settingRow, style]}>\n <View style={styles.settingRowContent}>\n <Text variant=\"plain\" style={[styles.settingRowText, titleStyle]}>\n {title}\n </Text>\n {Boolean(subtitle) && <Text variant=\"footnote\">{subtitle}</Text>}\n </View>\n {Boolean(rightItem) && <View style={rightItemStyle}>{rightItem}</View>}\n </View>\n )\n}\n\nfunction NavigableSettingRow({ title, subtitle, onPress }: NavigableSettingRowProps) {\n const styles = useStyles()\n return (\n <PlatformPressable onPress={onPress} accessibilityRole=\"button\">\n <View style={styles.settingRow}>\n <View style={styles.settingRowContent}>\n <Text variant=\"plain\" style={styles.settingRowText}>\n {title}\n </Text>\n {Boolean(subtitle) && <Text variant=\"footnote\">{subtitle}</Text>}\n </View>\n {Platform.OS === 'ios' && (\n <Icon\n name=\"general.rightChevron\"\n size={16}\n style={styles.navigableSettingChevron}\n accessibilityElementsHidden\n />\n )}\n </View>\n </PlatformPressable>\n )\n}\n\nfunction AvatarCard({\n conversation,\n onPress,\n}: {\n conversation: ConversationResource\n onPress: () => void\n}) {\n const styles = useStyles()\n\n return (\n <View style={styles.avatarCard}>\n <ConversationAvatar conversation={conversation} size=\"2xl\" />\n <Button\n title=\"Update avatar\"\n iconNameLeft=\"general.pencil\"\n onPress={onPress}\n variant=\"outline\"\n appearance=\"interaction\"\n size=\"sm\"\n />\n </View>\n )\n}\n\nfunction TeamsGroup({ teams }: { teams: GroupResource[] }) {\n const styles = useStyles()\n\n if (teams.length === 0) return null\n\n return (\n <View style={styles.teamGroup}>\n {teams.map((team, index) => (\n <Badge key={index} label={team.name as string} />\n ))}\n </View>\n )\n}\n\n// =================================\n// ====== Styles ===================\n// =================================\n\nconst useStyles = ({ isStart, isEnd }: { isStart?: boolean; isEnd?: boolean } = {}) => {\n const { colors } = useTheme()\n const headerBottomPadding = 4\n const sectionBorderRadius = 8\n\n return StyleSheet.create({\n listContainer: {\n flex: 1,\n backgroundColor: colors.surfaceColor080,\n },\n contentContainer: {\n padding: 16,\n },\n sectionOuterBase: {\n paddingLeft: 16,\n backgroundColor: colors.surfaceColor100,\n borderTopLeftRadius: isStart ? sectionBorderRadius : 0,\n borderTopRightRadius: isStart ? sectionBorderRadius : 0,\n borderBottomLeftRadius: isEnd ? sectionBorderRadius : 0,\n borderBottomRightRadius: isEnd ? sectionBorderRadius : 0,\n marginBottom: isEnd ? 16 : 0,\n },\n sectionInnerBase: {\n paddingRight: 16,\n paddingTop: isStart ? 16 : 12,\n paddingBottom: isEnd ? 16 : 12,\n },\n sectionInnerHeader: {\n paddingBottom: headerBottomPadding,\n },\n sectionInnerGenderNotice: {\n paddingTop: 0,\n paddingBottom: headerBottomPadding,\n },\n sectionHeaderRow: {\n flexDirection: 'row' as const,\n alignItems: 'center' as const,\n gap: 8,\n },\n sectionInnerHeaderWithBottomBorder: {\n paddingBottom: 16,\n },\n sectionInnerBottomBorder: {\n borderBottomColor: colors.borderColorDefaultBase,\n borderBottomWidth: isEnd ? 0 : 1,\n },\n sectionInnerTitleInput: {\n paddingTop: 12, // paddingVertical doesn't override the sectionInner padding\n paddingBottom: 12,\n },\n sectionInnerNotice: {\n paddingBottom: headerBottomPadding,\n },\n sectionInnerMiddleMiddle: {\n paddingTop: 0,\n paddingBottom: 12,\n },\n sectionInnerFirstMember: {\n paddingTop: 12,\n paddingBottom: 12,\n },\n sectionInnerLastMember: {\n paddingTop: 0,\n paddingBottom: 16,\n },\n titleContainer: {\n gap: 4,\n },\n titleLabelContainer: {\n flexDirection: 'row',\n alignItems: 'center',\n gap: 4,\n },\n titleLabel: {\n color: colors.textColorDefaultSecondary,\n },\n titleDisabledIcon: {\n color: colors.iconColorDefaultSecondary,\n },\n titleInput: {\n color: colors.textColorDefaultPrimary,\n fontSize: tokens.fontSizeMd,\n },\n titleInputDisabled: {\n color: colors.textColorDefaultSecondary,\n },\n inputValidationContainer: {\n paddingTop: 8,\n borderTopWidth: 1,\n borderColor: colors.statusErrorBorder,\n },\n inputValidationText: {\n color: colors.statusErrorText,\n },\n settingRow: {\n flexDirection: 'row',\n justifyContent: 'space-between',\n alignItems: 'center',\n gap: 8,\n },\n settingRowContent: {\n flex: 1,\n },\n deleteButtonText: {\n fontWeight: 'normal',\n },\n settingRowText: {\n lineHeight: 20,\n },\n navigableSettingChevron: {\n color: colors.iconColorDefaultDisabled,\n },\n avatarCard: {\n alignItems: 'center',\n gap: 16,\n },\n sectionOuterAvatarCard: {\n paddingLeft: 0,\n },\n sectionInnerAvatarCard: {\n paddingTop: 24,\n paddingBottom: 24,\n paddingHorizontal: 16,\n alignItems: 'center',\n },\n teamGroup: {\n flexDirection: 'row',\n gap: 4,\n flexWrap: 'wrap',\n },\n headerTitleBadge: {\n alignSelf: Platform.select({ android: 'flex-start', default: 'center' }),\n marginTop: 2,\n },\n headerTitleContainer: {\n alignItems: Platform.select({ android: 'flex-start', default: 'center' }),\n },\n })\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@planningcenter/chat-react-native",
3
- "version": "3.36.2-rc.3",
3
+ "version": "3.37.0-rc.0",
4
4
  "description": "",
5
5
  "main": "build/index.js",
6
6
  "react-native": "./src/index.tsx",
@@ -72,5 +72,5 @@
72
72
  "react-native-url-polyfill": "^2.0.0",
73
73
  "typescript": "~5.9.2"
74
74
  },
75
- "gitHead": "a38801b6b2c617d0de3a2da7935696f153dd55b9"
75
+ "gitHead": "aaa319341cab65a69c69df5eada620d1523fb4d7"
76
76
  }
@@ -0,0 +1,95 @@
1
+ import { QueryClientProvider } from '@tanstack/react-query'
2
+ import { renderHook, waitFor } from '@testing-library/react-native'
3
+ import React from 'react'
4
+ import { buildTestQueryClient } from '../../__utils__/query_client'
5
+ import { useApiClient } from '../../hooks/use_api_client'
6
+ import { useEnrichPeople } from '../../hooks/use_enrich_people'
7
+
8
+ jest.mock('../../hooks/use_api_client')
9
+
10
+ const mockedUseApiClient = useApiClient as jest.MockedFunction<typeof useApiClient>
11
+ const mockPost = jest.fn()
12
+
13
+ beforeEach(() => {
14
+ mockPost.mockReset()
15
+ mockedUseApiClient.mockReturnValue({ chat: { post: mockPost } } as any)
16
+ })
17
+
18
+ const createWrapper = () => {
19
+ const queryClient = buildTestQueryClient()
20
+ return ({ children }: { children: React.ReactNode }) => (
21
+ <QueryClientProvider client={queryClient}>{children}</QueryClientProvider>
22
+ )
23
+ }
24
+
25
+ test('returns empty map and skips the request when personIds is empty', () => {
26
+ const { result } = renderHook(() => useEnrichPeople({ personIds: [] }), {
27
+ wrapper: createWrapper(),
28
+ })
29
+
30
+ expect(result.current.size).toBe(0)
31
+ expect(mockPost).not.toHaveBeenCalled()
32
+ })
33
+
34
+ test('returns enrichment data keyed by person id', async () => {
35
+ mockPost.mockResolvedValue({
36
+ data: [
37
+ { id: '1', type: 'PersonEnrichment', badges: [{ title: 'Leader' }] },
38
+ { id: '2', type: 'PersonEnrichment', badges: [] },
39
+ ],
40
+ })
41
+
42
+ const { result } = renderHook(() => useEnrichPeople({ personIds: [1, 2] }), {
43
+ wrapper: createWrapper(),
44
+ })
45
+
46
+ await waitFor(() => expect(result.current.size).toBe(2))
47
+
48
+ expect(result.current.get(1)?.badges).toEqual([{ title: 'Leader' }])
49
+ expect(result.current.get(2)?.badges).toEqual([])
50
+ })
51
+
52
+ test('includes group_id in the request when provided', async () => {
53
+ mockPost.mockResolvedValue({ data: [] })
54
+
55
+ renderHook(() => useEnrichPeople({ personIds: [1], groupId: 42 }), {
56
+ wrapper: createWrapper(),
57
+ })
58
+
59
+ await waitFor(() => expect(mockPost).toHaveBeenCalled())
60
+
61
+ expect(mockPost).toHaveBeenCalledWith(
62
+ expect.objectContaining({
63
+ data: expect.objectContaining({
64
+ data: expect.objectContaining({
65
+ attributes: expect.objectContaining({ group_id: 42 }),
66
+ }),
67
+ }),
68
+ })
69
+ )
70
+ })
71
+
72
+ test('omits group_id from the request when not provided', async () => {
73
+ mockPost.mockResolvedValue({ data: [] })
74
+
75
+ renderHook(() => useEnrichPeople({ personIds: [1] }), {
76
+ wrapper: createWrapper(),
77
+ })
78
+
79
+ await waitFor(() => expect(mockPost).toHaveBeenCalled())
80
+
81
+ const attributes = mockPost.mock.calls[0][0].data.data.attributes
82
+ expect(attributes).not.toHaveProperty('group_id')
83
+ })
84
+
85
+ test('returns empty map when the request fails', async () => {
86
+ mockPost.mockRejectedValue(new Error('network error'))
87
+
88
+ const { result } = renderHook(() => useEnrichPeople({ personIds: [1] }), {
89
+ wrapper: createWrapper(),
90
+ })
91
+
92
+ await waitFor(() => expect(mockPost).toHaveBeenCalled())
93
+
94
+ expect(result.current.size).toBe(0)
95
+ })
@@ -1,6 +1,7 @@
1
- import { MemberBadge, MemberResource, ResourceObject } from '../../types'
1
+ import { useMemo } from 'react'
2
+ import { MemberResource, ResourceObject } from '../../types'
2
3
  import { GroupsGroupMemberResource } from '../../types/resources/groups/groups_member_resource_with_person'
3
- import { useCurrentPerson } from '../use_current_person'
4
+ import { useEnrichPeople } from '../use_enrich_people'
4
5
  import { useSuspensePaginator } from '../use_suspense_api'
5
6
 
6
7
  type UseSuspensePaginatorResult<T extends ResourceObject> = ReturnType<
@@ -16,10 +17,6 @@ export type GroupMembersForNewConversationResult = Omit<
16
17
  childMembers: MemberResource[]
17
18
  }
18
19
 
19
- /**
20
- * This is specifically for the new conversation screen because we assign
21
- * the "Conversation owner" badge to the current person.
22
- */
23
20
  export function useGroupMembersForNewConversation({
24
21
  id,
25
22
  gender,
@@ -27,7 +24,6 @@ export function useGroupMembersForNewConversation({
27
24
  id: number
28
25
  gender: string | null
29
26
  }) {
30
- const currentPerson = useCurrentPerson()
31
27
  const response = useSuspensePaginator<GroupsGroupMemberResource>({
32
28
  url: `/me/groups/${id}/memberships`,
33
29
  data: {
@@ -43,12 +39,16 @@ export function useGroupMembersForNewConversation({
43
39
  })
44
40
 
45
41
  const { data: memberships = [] } = response
42
+ const personIds = useMemo(() => memberships.map(m => +m.person.id), [memberships])
43
+ const enrichmentMap = useEnrichPeople({ personIds, groupId: id })
44
+
46
45
  const members: MemberResource[] = memberships.map(membership => {
47
46
  const { person } = membership
47
+ const enrichment = enrichmentMap.get(+person.id)
48
48
  return {
49
49
  type: 'Member',
50
50
  avatar: person.avatarUrl,
51
- badges: buildBadges(membership, currentPerson.id),
51
+ badges: enrichment?.badges ?? [],
52
52
  child: person.child,
53
53
  gender: person.gender,
54
54
  id: +person.id,
@@ -57,6 +57,7 @@ export function useGroupMembersForNewConversation({
57
57
  role: membership.role,
58
58
  }
59
59
  })
60
+
60
61
  const adultMembers = members.filter(member => !member.child)
61
62
  const childMembers = members.filter(member => member.child)
62
63
 
@@ -67,18 +68,3 @@ export function useGroupMembersForNewConversation({
67
68
  childMembers,
68
69
  }
69
70
  }
70
-
71
- function buildBadges(
72
- membership: GroupsGroupMemberResource,
73
- currentPersonId: number
74
- ): MemberBadge[] {
75
- const { person } = membership
76
- const badges = []
77
- if (membership.role === 'leader') {
78
- badges.push({ title: 'Leader' })
79
- }
80
- if (person.id === currentPersonId) {
81
- badges.push({ title: 'Conversation owner' })
82
- }
83
- return badges
84
- }
@@ -2,6 +2,7 @@ import { isNil, omitBy } from 'lodash'
2
2
  import { useMemo } from 'react'
3
3
  import { MemberResource, TeamPeopleResource, TeamPersonResponseItem } from '../../types'
4
4
  import { useApiGet } from '../use_api'
5
+ import { useEnrichPeople } from '../use_enrich_people'
5
6
 
6
7
  interface Props {
7
8
  teamIds: number[]
@@ -23,14 +24,24 @@ export function useTeamMembersForNewConversation({ teamIds, planId }: Props) {
23
24
  })
24
25
 
25
26
  const people = data?.people || stableEmptyPersonArray
27
+ const personIds = useMemo(() => people.map(p => p.id), [people])
28
+ const enrichmentMap = useEnrichPeople({ personIds })
26
29
 
27
- const members: MemberResource[] = useMemo(() => {
28
- return people.map(person => ({
29
- ...person,
30
- type: 'Member',
31
- gender: null,
32
- }))
33
- }, [people])
30
+ const members: MemberResource[] = useMemo(
31
+ () =>
32
+ people.map(person => {
33
+ const enrichedBadges = enrichmentMap.get(person.id)?.badges ?? []
34
+ const existingTitles = new Set(person.badges.map(b => b.title))
35
+ const newBadges = enrichedBadges.filter(b => !existingTitles.has(b.title))
36
+ return {
37
+ ...person,
38
+ type: 'Member',
39
+ gender: null,
40
+ badges: [...person.badges, ...newBadges],
41
+ }
42
+ }),
43
+ [people, enrichmentMap]
44
+ )
34
45
 
35
46
  return {
36
47
  members,
@@ -0,0 +1,35 @@
1
+ import { keepPreviousData, useQuery } from '@tanstack/react-query'
2
+ import { useMemo } from 'react'
3
+ import { ApiCollection, ResourceObject } from '../types'
4
+ import { useApiClient } from './use_api_client'
5
+
6
+ export interface PersonEnrichmentResource extends ResourceObject {
7
+ type: 'PersonEnrichment'
8
+ id: string
9
+ badges: { title: string }[]
10
+ }
11
+
12
+ export function useEnrichPeople({ personIds, groupId }: { personIds: number[]; groupId?: number }) {
13
+ const apiClient = useApiClient()
14
+
15
+ const { data } = useQuery<ApiCollection<PersonEnrichmentResource>>({
16
+ queryKey: ['enrich_people', [...personIds].sort((a, b) => a - b), groupId],
17
+ queryFn: () =>
18
+ apiClient.chat.post<ApiCollection<PersonEnrichmentResource>>({
19
+ url: '/enrich_people',
20
+ data: {
21
+ data: {
22
+ type: 'PersonEnrichment',
23
+ attributes: {
24
+ person_ids: personIds,
25
+ ...(groupId !== undefined ? { group_id: groupId } : {}),
26
+ },
27
+ },
28
+ },
29
+ }),
30
+ enabled: personIds.length > 0,
31
+ placeholderData: keepPreviousData,
32
+ })
33
+
34
+ return useMemo(() => new Map(data?.data.map(e => [+e.id, e]) ?? []), [data])
35
+ }
@@ -148,7 +148,7 @@ export function ConversationDetailsScreen({ route }: ConversationDetailsScreenPr
148
148
  const memberSectionStyle = memberSectionStyleMap[memberPosition]
149
149
 
150
150
  return {
151
- type: data.child ? SectionTypes.hidden : SectionTypes.members,
151
+ type: SectionTypes.members,
152
152
  data,
153
153
  sectionInnerStyle: memberSectionStyle,
154
154
  }