Skip to content

Commit 694c1c3

Browse files
authored
Cra rxjs issue pagination fix (#1938)
* chore: pagination for issues, fix render issue with React pagination component * chore: removed comments
1 parent 401ea86 commit 694c1c3

6 files changed

Lines changed: 75 additions & 35 deletions

File tree

cra-rxjs-styled-components/src/components/pr-issue-tab/IssuePRTabHeader.tsx

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
import { useState } from 'react';
2-
31
import { Container, StatusLabel, StatusTab } from './IssuePRTabHeader.styles';
42
import { useRepo } from '../../context/RepoContext';
53
import FilterDropdown from '../filter-dropdown/FilterDropdown';
@@ -8,15 +6,16 @@ import OpenIssueIcon from '../icons/OpenIssueIcon';
86
import { SORT_OPTIONS } from '../../constants/data';
97
import PullRequestIcon from '../icons/PullRequestIcon';
108

9+
export type IssuePRTabValues = 'open' | 'close';
10+
1111
interface Props {
1212
toggleTab: any;
1313
closedCount: number;
1414
openCount: number;
1515
type: 'issue' | 'pr';
16+
activeTab: IssuePRTabValues;
1617
}
1718

18-
export type IssuePRTabValues = 'open' | 'close';
19-
2019
export default function IssuePRTabHeader(props: Props) {
2120
const {
2221
labels,
@@ -28,12 +27,10 @@ export default function IssuePRTabHeader(props: Props) {
2827
setMilestone,
2928
setSortBy,
3029
} = useRepo();
31-
const [activeTab, setActiveTab] = useState<IssuePRTabValues>('open');
32-
const { toggleTab, closedCount, openCount, type } = props;
30+
const { toggleTab, closedCount, openCount, type, activeTab } = props;
3331

3432
const changeTab = (value: IssuePRTabValues) => {
3533
toggleTab(value);
36-
setActiveTab(value);
3734
};
3835

3936
const sortOptions = Object.values(SORT_OPTIONS);

cra-rxjs-styled-components/src/components/pull-request/pull-request/PullRequest.data.tsx

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -15,13 +15,15 @@ export default function PullRequestCtrl() {
1515
const PRS = activeTab === 'open' ? open.items : closed.items;
1616

1717
return (
18-
<PullRequestView
19-
pullRequests={PRS}
20-
openPRCount={open.total_count}
21-
closedPRCount={closed.total_count}
22-
activeTab={activeTab}
23-
changeActiveTab={setActiveTab}
24-
setPRPage={setPRPage}
25-
/>
18+
<div key={activeTab}>
19+
<PullRequestView
20+
pullRequests={PRS}
21+
openPRCount={open.total_count}
22+
closedPRCount={closed.total_count}
23+
activeTab={activeTab}
24+
changeActiveTab={setActiveTab}
25+
setPRPage={setPRPage}
26+
/>
27+
</div>
2628
);
2729
}

cra-rxjs-styled-components/src/components/pull-request/pull-request/PullRequest.view.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ export default function PullRequestView({
5252
openCount={openPRCount}
5353
toggleTab={changeActiveTab}
5454
type="pr"
55+
activeTab={activeTab}
5556
/>
5657
{(pullRequests || []).map((pr, index) => (
5758
<PullRequestCard
Lines changed: 20 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,27 @@
11
import { useState } from 'react';
22
import IssueView from './Issues.view';
3-
import type { IssueTabValues, IssueTypes } from '../../../types/types';
3+
import useIssuesPRs from '../../../hooks/useIssuesPRs';
4+
import { IssuePRTabValues } from '../../../components/pr-issue-tab/IssuePRTabHeader';
45

5-
type IssuesProps = {
6-
issues: IssueTypes;
7-
};
6+
export default function IssueCtrl() {
7+
const { open, closed, setClosedPRPage, setOpenPRPage } = useIssuesPRs({
8+
searchType: 'issue',
9+
type: 'issues',
10+
});
11+
const [activeTab, setActiveTab] = useState<IssuePRTabValues>('open');
12+
const setPRPage = activeTab === 'open' ? setOpenPRPage : setClosedPRPage;
813

9-
export default function IssueCtrl({ issues }: IssuesProps) {
10-
const [activeTab, setActiveTab] = useState<IssueTabValues>('open');
14+
const issues = activeTab === 'open' ? open.items : closed.items;
1115
return (
12-
<IssueView
13-
issues={issues[activeTab].items}
14-
closedCount={issues?.closed.total_count!}
15-
openCount={issues?.open.total_count!}
16-
changeActiveTab={setActiveTab}
17-
/>
16+
<div key={activeTab}>
17+
<IssueView
18+
issues={issues}
19+
closedCount={closed.total_count}
20+
openCount={open.total_count}
21+
activeTab={activeTab}
22+
changeActiveTab={setActiveTab}
23+
setPRPage={setPRPage}
24+
/>
25+
</div>
1826
);
1927
}

cra-rxjs-styled-components/src/components/repo-issues/Issues/Issues.view.tsx

Lines changed: 39 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,41 @@
11
import IssueCard from '../issue-card/IssueCard';
22
import { Content, Wrapper } from './Issues.view.styles';
33
import type { Issue } from './Issue.type';
4-
import { IssueTabValues } from '../../../types/types';
5-
import Pagination from '../../pagination/Pagination';
6-
import IssuePRTabHeader from '../../../components/pr-issue-tab/IssuePRTabHeader';
4+
import IssuePRTabHeader, {
5+
IssuePRTabValues,
6+
} from '../../../components/pr-issue-tab/IssuePRTabHeader';
7+
import { PaginationContainer } from '../../../components/pull-request/pull-request/PullRequest.style';
8+
import ReactPaginate from 'react-paginate';
9+
import { PULLS_PER_PAGE } from '../../../constants/url.constants';
710
import { useRepo } from '../../../context/RepoContext';
811
import ClearFilterAndSortButtonText from '../../../components/clear-filter-and-sort-button/ClearFilterAndSortButtonText';
912

1013
type IssueProps = {
1114
issues: Issue[];
12-
changeActiveTab: (value: IssueTabValues) => void;
15+
changeActiveTab: (value: IssuePRTabValues) => void;
1316
closedCount: number;
1417
openCount: number;
18+
activeTab: IssuePRTabValues;
19+
setPRPage: (value: number) => void;
1520
};
1621

1722
export default function IssueView({
1823
issues,
1924
closedCount,
2025
openCount,
26+
activeTab,
2127
changeActiveTab,
28+
setPRPage,
2229
}: IssueProps) {
30+
const totalPRsCount = activeTab === 'open' ? openCount : closedCount;
31+
const pageCount = Math.ceil(totalPRsCount / PULLS_PER_PAGE);
32+
33+
// Invoke when user click to request another page.
34+
const handlePageClick = (event: { selected: number }) => {
35+
const page = event.selected + 1;
36+
setPRPage(page);
37+
window.scrollTo({ top: 0, behavior: 'smooth' });
38+
};
2339
const { resetFilterValues, isFilteredOrSorted } = useRepo();
2440

2541
return (
@@ -36,13 +52,31 @@ export default function IssueView({
3652
toggleTab={changeActiveTab}
3753
closedCount={closedCount}
3854
openCount={openCount}
55+
activeTab={activeTab}
3956
type="issue"
4057
/>
4158
{(issues || []).map((issue, index) => (
4259
<IssueCard issue={issue} key={index} />
4360
))}
4461
</Content>
45-
<Pagination />
62+
<PaginationContainer>
63+
<ReactPaginate
64+
breakLabel="..."
65+
nextLabel="Next >"
66+
marginPagesDisplayed={1}
67+
onPageChange={handlePageClick}
68+
pageRangeDisplayed={7}
69+
pageCount={pageCount}
70+
previousLabel="< Previous"
71+
renderOnZeroPageCount={() => null}
72+
containerClassName={'pagination'}
73+
pageClassName={'pagination__item'}
74+
previousClassName={'pagination__link_end'}
75+
nextClassName={'pagination__link_end'}
76+
disabledClassName={'pagination__link--disabled'}
77+
activeClassName={'pagination__link--active'}
78+
/>
79+
</PaginationContainer>
4680
</Wrapper>
4781
);
4882
}
Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
1-
import useIssuesPRs from '../../hooks/useIssuesPRs';
21
import IssueCtrl from '../../components/repo-issues/Issues/Issues';
32

43
export default function RepoIssues() {
5-
const { open, closed } = useIssuesPRs({ searchType: 'issue', type: 'issues' });
6-
return <IssueCtrl issues={{ open, closed }} />;
4+
return <IssueCtrl />;
75
}

0 commit comments

Comments
 (0)