-
Notifications
You must be signed in to change notification settings - Fork 107
Expand file tree
/
Copy pathRepositoryItem.tsx
More file actions
63 lines (56 loc) · 2.15 KB
/
RepositoryItem.tsx
File metadata and controls
63 lines (56 loc) · 2.15 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
import React, { useEffect, useState } from "react";
import { useLastModified } from "../hooks/useLastModified";
import { Repository } from "../types";
import { IssuesList } from "./IssueList";
import { RepositoryDescription } from "./RepositoryDescription";
import { RepositoryItemTopBar } from "./RepositoryItemTopBar";
import { RepositoryMetadata } from "./RepositoryMetadata";
type RepositoryItemProps = {
repository: Repository;
};
export const RepositoryItem = ({ repository }: RepositoryItemProps) => {
const [isIssueOpen, setIsIssueOpen] = useState(false);
const [isIssuesListVisible, setIsIssuesListVisible] = useState(false);
const lastModified = useLastModified(repository.last_modified);
useEffect(() => {
if (isIssueOpen) {
setIsIssuesListVisible(true);
} else {
// Delay unmounting to allow close animation to complete
const timer = setTimeout(() => {
setIsIssuesListVisible(false);
}, 300);
return () => clearTimeout(timer);
}
}, [isIssueOpen]);
return (
<div className="repo-item">
<div id={`repo-${repository.id}`}>
<div onClick={() => setIsIssueOpen(!isIssueOpen)}>
<RepositoryItemTopBar
isIssueOpen={isIssueOpen}
repositoryHasNewIssues={repository.has_new_issues}
repositoryName={repository.name}
repositoryNumIssues={repository.issues.length}
repositoryOwner={repository.owner}
repositoryUrl={repository.url}
repositoryTopics={repository.topics}
/>
<div>
<RepositoryDescription repositoryDescription={repository.description} />
<RepositoryMetadata
isIssueOpen={isIssueOpen}
lastModified={lastModified}
repositoryLang={repository.language.display}
repositoryTopics={repository.topics}
repositoryNumIssues={repository.issues.length}
/>
</div>
</div>
<div className={`repo-item__issues-warper ${isIssueOpen ? 'open' : ''}`}>
{isIssuesListVisible && <IssuesList issues={repository.issues} />}
</div>
</div>
</div>
);
};