-
Notifications
You must be signed in to change notification settings - Fork 102
Expand file tree
/
Copy pathRepositoryItem.tsx
More file actions
70 lines (61 loc) · 2.38 KB
/
RepositoryItem.tsx
File metadata and controls
70 lines (61 loc) · 2.38 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
64
65
66
67
68
69
70
import dayjs from "dayjs";
import relativeTime from "dayjs/plugin/relativeTime";
import React, { useEffect, useState } from "react";
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);
dayjs.extend(relativeTime);
const useLastModified = (date: string) => {
const [lastModified, setLastModified] = useState("");
useEffect(() => setLastModified(dayjs(date).fromNow()), [date]);
return lastModified;
};
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>
);
};