import { keepPreviousData } from '@tanstack/react-query' import { useMemo } from 'react' import { MemberResource, ResourceObject } from '../../types' import { GroupsGroupMemberResource } from '../../types/resources/groups/groups_member_resource_with_person' import { useApiPaginator } from '../use_api' import { useEnrichPeople } from '../use_enrich_people' type UseApiPaginatorResult = ReturnType> export type GroupMembersForNewConversationResult = Omit< UseApiPaginatorResult, // We are passing our own "members" data shape 'data' > & { data: MemberResource[] adultMembers: MemberResource[] childMembers: MemberResource[] } export function useGroupMembersForNewConversation({ id, gender, }: { id: number gender: string | null }) { const response = useApiPaginator( { url: `/me/groups/${id}/memberships`, data: { perPage: 100, include: ['person'], fields: { Membership: ['person, role'], Person: ['avatar_url', 'name', 'first_name', 'last_name', 'child', 'gender'], }, ...(gender ? { where: { gender } } : {}), }, app: 'groups', }, { throwOnError: (_error, query) => query.state.data === undefined, placeholderData: keepPreviousData, } ) const { data: memberships = [] } = response const personIds = useMemo(() => memberships.map(m => +m.person.id), [memberships]) const enrichmentMap = useEnrichPeople({ personIds, groupId: id }) const members: MemberResource[] = memberships.map(membership => { const { person } = membership const enrichment = enrichmentMap.get(+person.id) return { type: 'Member', avatar: person.avatarUrl, badges: enrichment?.badges ?? [], child: person.child, gender: person.gender, id: +person.id, name: `${person.firstName} ${person.lastName}`, source: [], role: membership.role, } }) const adultMembers = members.filter(member => !member.child) const childMembers = members.filter(member => member.child) return { ...response, data: members, adultMembers, childMembers, } }