• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

alkem-io / client-web / #9048

11 Oct 2024 01:42PM UTC coverage: 5.943%. First build
#9048

Pull #7022

travis-ci

Pull Request #7022: [v0.74.0] Roles API + Unauthenticated Explore page

202 of 10241 branches covered (1.97%)

Branch coverage included in aggregate %.

63 of 431 new or added lines in 60 files covered. (14.62%)

1468 of 17861 relevant lines covered (8.22%)

0.19 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

0.0
/src/main/search/searchResults/useHydratedCard.tsx
1
import {
2
  SearchResultOrganizationFragment,
3
  SearchResultPostFragment,
4
  SearchResultSpaceFragment,
5
  SearchResultType,
6
  SearchResultUserFragment,
7
  UserRolesSearchCardsQuery,
8
  VisualType,
9
} from '@/core/apollo/generated/graphql-schema';
10
import { RoleType } from '@/domain/community/user/constants/RoleType';
11
import { getVisualByType } from '@/domain/common/visual/utils/visuals.utils';
12
import { useUserRolesSearchCardsQuery } from '@/core/apollo/generated/apollo-hooks';
13
import { useCurrentUserContext } from '@/domain/community/userCurrent/useCurrentUserContext';
14
import { TypedSearchResult } from '../SearchView';
15
import { SearchContributionCardCard } from '@/domain/shared/components/search-cards/SearchContributionPostCard';
16
import { SpaceL0Icon } from '@/domain/space/icons/SpaceL0Icon';
17
import ContributingUserCard from '@/domain/community/user/ContributingUserCard/ContributingUserCard';
18
import CardContent from '@/core/ui/card/CardContent';
19
import ContributingOrganizationCard from '@/domain/community/organization/ContributingOrganizationCard/ContributingOrganizationCard';
20
import CardParentSpaceSegment from '@/domain/space/components/cards/components/CardParentSpaceSegment';
21
import SpaceCard from '@/domain/space/components/cards/SpaceCard';
22
import { spaceLevelIcon } from '@/domain/space/icons/SpaceIconByLevel';
23
import { ComponentType } from 'react';
24
import { SvgIconProps } from '@mui/material';
25

26
const hydrateUserCard = (data: TypedSearchResult<SearchResultType.User, SearchResultUserFragment>) => {
27
  const user = data.user;
28
  const profile = user.profile;
29
  const avatarUri = profile.visual?.uri;
30
  const { country, city } = profile.location ?? {};
31
  const tags = profile.tagsets?.[0]?.tags ?? [];
32

×
33
  return (
×
34
    <ContributingUserCard
×
35
      id={user.id}
×
36
      displayName={user.profile.displayName}
×
37
      description={profile.description}
×
38
      avatarUri={avatarUri}
×
39
      city={city}
40
      country={country}
×
41
      tags={tags}
42
      userUri={user.profile.url}
43
      matchedTerms={data.terms}
44
      isContactable={user.isContactable}
45
    />
46
  );
47
};
48

49
const _hydrateOrganizationCard = (
50
  data: TypedSearchResult<SearchResultType.Organization, SearchResultOrganizationFragment>,
51
  userRoles: UserRolesSearchCardsQuery['rolesUser'] | undefined
52
) => {
53
  const organization = data.organization;
54
  const profile = data.organization.profile;
55
  const avatarUri = profile.visual?.uri;
56
  const { country, city } = profile.location ?? {};
×
57
  const url = organization.profile.url;
58
  const tags = profile.tagsets?.[0]?.tags ?? [];
59

60
  const organizationRoles = userRoles?.organizations.find(x => x.id === organization.id);
×
61
  const isMember = organizationRoles?.roles.some(x => x === RoleType.Associate);
×
62

×
63
  return (
×
64
    <ContributingOrganizationCard
×
65
      displayName={organization.profile.displayName}
×
66
      description={profile.description}
67
      avatarUri={avatarUri}
×
68
      city={city}
×
69
      country={country}
70
      tags={tags}
×
71
      userUri={url}
72
      member={isMember}
73
      matchedTerms={data.terms}
74
    />
75
  );
76
};
77

78
const hydrateSpaceCard = (
79
  data: TypedSearchResult<SearchResultType.Space | SearchResultType.Subspace, SearchResultSpaceFragment>
80
) => {
81
  const space = data.space;
82
  const spaceProfile = space.about.profile;
83
  const tagline = spaceProfile?.tagline ?? '';
84
  const name = spaceProfile.displayName;
85
  const tags = space.about.profile.tagset?.tags;
×
86

87
  // Create parentInfo for SpaceCard
88
  const parentInfo = data.parentSpace
89
    ? {
90
        displayName: data.parentSpace.about.profile.displayName,
91
        url: data.parentSpace.about.profile.url ?? '',
×
92
        avatar: data.parentSpace.about.profile.avatar?.uri
×
93
          ? {
×
94
              id: data.parentSpace.about.profile.avatar.id ?? '',
×
95
              uri: data.parentSpace.about.profile.avatar.uri,
×
96
              alternativeText: data.parentSpace.about.profile.avatar.alternativeText ?? undefined,
NEW
97
            }
×
98
          : undefined,
99
      }
×
100
    : undefined;
101

102
  return (
103
    <SpaceCard
104
      displayName={name}
105
      tagline={tagline}
×
106
      spaceVisibility={space.visibility}
×
107
      level={space.level}
108
      isPrivate={!space.about.isContentPublic}
109
      showLeads={false}
×
110
      banner={getVisualByType(VisualType.Card, spaceProfile.visuals)}
111
      spaceUri={spaceProfile.url}
×
112
      tags={tags}
113
      parentInfo={parentInfo}
114
    />
×
115
  );
116
};
117

118
interface ContributionParentInformation {
119
  displayName: string;
120
  locked: boolean;
121
  url: string;
122
  icon: ComponentType<SvgIconProps>;
×
123
}
124

125
const getContributionParentInformation = (
126
  data: TypedSearchResult<SearchResultType.Post, SearchResultPostFragment>
127
): ContributionParentInformation => {
128
  return {
129
    displayName: data.space.about.profile.displayName,
130
    locked: !data.space?.about.isContentPublic,
131
    url: data.space.about.profile.url,
132
    icon: spaceLevelIcon[data.space.level] ?? SpaceL0Icon,
133
  };
134
};
135

136
const hydrateContributionPost = (data: TypedSearchResult<SearchResultType.Post, SearchResultPostFragment>) => {
137
  if (!data?.post) {
138
    return null;
139
  }
140

×
141
  const card = data.post;
×
142

143
  const parent = getContributionParentInformation(data);
144

145
  return (
146
    <SearchContributionCardCard
147
      name={card.profile.displayName}
148
      author={card.createdBy?.profile.displayName}
×
149
      description={card.profile.description}
×
150
      tags={card.profile.tagset?.tags}
×
151
      createdDate={card.createdDate}
×
152
      commentsCount={card.comments?.messagesCount}
×
153
      matchedTerms={data.terms}
×
154
      url={data.post.profile.url}
155
      parentSegment={
156
        <CardContent>
×
157
          <CardParentSpaceSegment parentSpaceUri={data.callout.framing.profile.url}>
158
            {data.callout.framing.profile.displayName}
159
          </CardParentSpaceSegment>
×
160
          <CardParentSpaceSegment iconComponent={parent.icon} parentSpaceUri={parent.url} locked={parent.locked}>
×
161
            {parent.displayName}
×
162
          </CardParentSpaceSegment>
163
        </CardContent>
164
      }
×
165
    />
166
  );
×
167
};
168

×
169
interface HydratedCardGetter<Data> {
170
  (data: Data): null | React.ReactElement;
171
}
172

173
interface UseHydrateCardProvided {
174
  hydrateUserCard: HydratedCardGetter<TypedSearchResult<SearchResultType.User, SearchResultUserFragment>>;
175
  hydrateOrganizationCard: HydratedCardGetter<
176
    TypedSearchResult<SearchResultType.Organization, SearchResultOrganizationFragment>
177
  >;
178
  hydrateContributionCard: HydratedCardGetter<TypedSearchResult<SearchResultType.Post, SearchResultPostFragment>>;
179
  hydrateSpaceCard: HydratedCardGetter<
180
    TypedSearchResult<SearchResultType.Space | SearchResultType.Subspace, SearchResultSpaceFragment>
181
  >;
182
}
183

184
export const useHydrateCard = (): UseHydrateCardProvided => {
185
  const { userModel } = useCurrentUserContext();
186
  const userId = userModel?.id;
187

188
  const { data: rolesData } = useUserRolesSearchCardsQuery({
189
    variables: {
190
      userId: userId!,
191
    },
192
    skip: !userId,
193
  });
194

195
  const userRoles = rolesData?.rolesUser;
196

197
  const hydrateOrganizationCard = (
198
    result: TypedSearchResult<SearchResultType.Organization, SearchResultOrganizationFragment>
199
  ) => _hydrateOrganizationCard(result, userRoles);
200

201
  return {
202
    hydrateSpaceCard,
203
    hydrateContributionCard: hydrateContributionPost,
204
    hydrateUserCard,
205
    hydrateOrganizationCard,
206
  };
207
};
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2025 Coveralls, Inc