Skip to content

Commit b8c53c9

Browse files
committed
refactor(lint): decompose big components - repo-details
#163
1 parent 4272225 commit b8c53c9

File tree

3 files changed

+105
-66
lines changed

3 files changed

+105
-66
lines changed
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
import React from "react";
2+
import { Link } from "react-router-dom";
3+
import DetailsCard from "../details-card";
4+
import { RepoDetailsQuery } from "../queries.gen";
5+
6+
// FIXME: move to models
7+
type Collaborator = {
8+
/** id */
9+
id: string;
10+
/** Имя пользователя */
11+
name: string;
12+
/** Логин пользователя */
13+
login: string;
14+
/** Аватар */
15+
avatarUrl: string;
16+
};
17+
18+
type Props = {
19+
/** Данные по репозиторию */
20+
repository: RepoDetailsQuery["repository"];
21+
};
22+
23+
/**
24+
* Коллабораторы репозитория
25+
*/
26+
const CardCollaborators = ({ repository }: Props) => {
27+
const collaborators = repository?.collaborators?.nodes?.filter(
28+
(collaborator): collaborator is Collaborator => !!collaborator,
29+
);
30+
31+
if (!collaborators) return null;
32+
return (
33+
<DetailsCard className="mt-4" title="Collaborators" primary>
34+
{collaborators?.map(({ id, login, avatarUrl }) => (
35+
<div key={id} className="collaborator">
36+
<img src={avatarUrl} alt="avatar" />
37+
<Link className="name" to={`/${login}`}>
38+
{login}
39+
</Link>
40+
</div>
41+
))}
42+
</DetailsCard>
43+
);
44+
};
45+
46+
export default CardCollaborators;
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
import React from "react";
2+
import { Skeleton, Tag } from "antd";
3+
import { Language, RepoIdentity } from "models";
4+
import DetailsCard from "../details-card";
5+
import { RepoDetailsQuery } from "../queries.gen";
6+
7+
type Props = {
8+
/** Данные по репозиторию */
9+
repository: RepoDetailsQuery["repository"];
10+
/** repo identity */
11+
identity: RepoIdentity;
12+
/** Флаг загрузки */
13+
loading: boolean;
14+
};
15+
16+
/**
17+
* Общая информация по репозиторию
18+
*/
19+
const CardCommon = (props: Props) => {
20+
const { repository, identity, loading } = props;
21+
const languages = repository?.languages?.nodes?.filter((lang): lang is Language => !!lang);
22+
return (
23+
<DetailsCard className="common-details" title={identity.name}>
24+
{loading && (
25+
<Skeleton paragraph={{ rows: 1 }} className="common-details__placeholder" active />
26+
)}
27+
{repository?.description ? (
28+
<div>{repository?.description}</div>
29+
) : (
30+
<p>No description, website, or topics provided.</p>
31+
)}
32+
<br />
33+
{repository?.homepageUrl && (
34+
<a
35+
href={repository.homepageUrl}
36+
target="_blank"
37+
rel="noopener noreferrer"
38+
className="homepage-link"
39+
title={repository.homepageUrl}
40+
>
41+
{repository.homepageUrl}
42+
</a>
43+
)}
44+
{languages?.map(({ id, name, color }) => (
45+
<Tag className="language-tag" key={id} color={color || "#165694"}>
46+
{name}
47+
</Tag>
48+
))}
49+
</DetailsCard>
50+
);
51+
};
52+
53+
export default CardCommon;

src/features/repo-details/index.tsx

Lines changed: 6 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,16 @@
1-
import { Skeleton, Tag, Alert, Spin } from "antd";
1+
import { Alert, Spin } from "antd";
22
import React from "react";
3-
import { Link } from "react-router-dom";
4-
import { Language, RepoIdentity } from "models";
5-
import DetailsCard from "./details-card";
3+
import { RepoIdentity } from "models";
4+
import CardCommon from "./card-common";
5+
import CardCollaborators from "./card-collaborators";
66
import { useRepoDetailsQuery } from "./queries.gen";
77
import "./index.scss";
88

9-
// !!! FIXME: decompose
10-
119
type Props = {
1210
/** repo identity */
1311
repo: RepoIdentity;
1412
};
1513

16-
// FIXME: move to models
17-
type Collaborator = {
18-
/** id */
19-
id: string;
20-
/** Имя пользователя */
21-
name: string;
22-
/** Логин пользователя */
23-
login: string;
24-
/** Аватар */
25-
avatarUrl: string;
26-
};
27-
2814
/**
2915
* @feature Информация по репозиторию
3016
*/
@@ -38,56 +24,10 @@ const RepoDetails = ({ repo: identity }: Props) => {
3824
});
3925
const repository = data?.repository;
4026

41-
const languages = repository?.languages?.nodes?.filter((lang): lang is Language => !!lang);
42-
const collaborators = repository?.collaborators?.nodes?.filter(
43-
(collaborator): collaborator is Collaborator => !!collaborator,
44-
);
45-
4627
return (
4728
<div className="flex flex-col">
48-
<DetailsCard className="common-details" title={identity.name}>
49-
{loading && (
50-
<Skeleton
51-
paragraph={{ rows: 1 }}
52-
className="common-details__placeholder"
53-
active
54-
/>
55-
)}
56-
{repository?.description !== null ? (
57-
<div>{repository?.description}</div>
58-
) : (
59-
<p>No description, website, or topics provided.</p>
60-
)}
61-
<br />
62-
{repository?.homepageUrl && (
63-
<a
64-
href={repository.homepageUrl}
65-
target="_blank"
66-
rel="noopener noreferrer"
67-
className="homepage-link"
68-
title={repository.homepageUrl}
69-
>
70-
{repository.homepageUrl}
71-
</a>
72-
)}
73-
{languages?.map(({ id, name, color }) => (
74-
<Tag className="language-tag" key={id} color={color || "#165694"}>
75-
{name}
76-
</Tag>
77-
))}
78-
</DetailsCard>
79-
{collaborators && (
80-
<DetailsCard className="mt-4" title="Collaborators" primary>
81-
{collaborators?.map(({ id, login, avatarUrl }) => (
82-
<div key={id} className="collaborator">
83-
<img src={avatarUrl} alt="avatar" />
84-
<Link className="name" to={`/${login}`}>
85-
{login}
86-
</Link>
87-
</div>
88-
))}
89-
</DetailsCard>
90-
)}
29+
<CardCommon identity={identity} loading={loading} repository={repository} />
30+
<CardCollaborators repository={repository} />
9131
<Spin spinning={loading}>
9232
<Alert
9333
style={{ borderRadius: 6, marginTop: 10 }}

0 commit comments

Comments
 (0)