11
22
3-
43import React , { useState , useEffect } from 'react' ;
54import { Octokit } from '@octokit/rest' ;
65import Select from 'react-select' ;
@@ -14,17 +13,36 @@ interface PullRequest {
1413 user : {
1514 login : string ;
1615 } ;
16+ created_at : string ;
17+ updated_at : string ;
18+ number : number ;
1719}
1820
1921interface Repo {
2022 value : string ;
2123 label : string ;
2224}
2325
26+ interface SortOption {
27+ value : keyof PullRequest | 'number' | 'created_at' | 'updated_at' ;
28+ label : string ;
29+ direction : 'asc' | 'desc' ;
30+ }
31+
32+ const sortOptions : SortOption [ ] = [
33+ { value : 'created_at' , label : 'Creation Date (Newest)' , direction : 'desc' } ,
34+ { value : 'created_at' , label : 'Creation Date (Oldest)' , direction : 'asc' } ,
35+ { value : 'updated_at' , label : 'Last Updated (Newest)' , direction : 'desc' } ,
36+ { value : 'updated_at' , label : 'Last Updated (Oldest)' , direction : 'asc' } ,
37+ { value : 'number' , label : 'PR Number (Highest)' , direction : 'desc' } ,
38+ { value : 'number' , label : 'PR Number (Lowest)' , direction : 'asc' } ,
39+ ] ;
40+
2441const PullRequestViewer : React . FC = ( ) => {
2542 const [ repos , setRepos ] = useState < Repo [ ] > ( [ ] ) ;
2643 const [ selectedRepo , setSelectedRepo ] = useState < Repo | null > ( null ) ;
2744 const [ pullRequests , setPullRequests ] = useState < PullRequest [ ] > ( [ ] ) ;
45+ const [ selectedSort , setSelectedSort ] = useState < SortOption > ( sortOptions [ 0 ] ) ;
2846
2947 useEffect ( ( ) => {
3048 const fetchRepos = async ( ) => {
@@ -33,7 +51,7 @@ const PullRequestViewer: React.FC = () => {
3351 org : GITHUB_ORG ,
3452 type : 'all' ,
3553 } ) ;
36- const repoOptions = response . data . map ( repo => ( {
54+ const repoOptions = response . data . map ( ( repo ) => ( {
3755 value : repo . name ,
3856 label : repo . name ,
3957 } ) ) ;
@@ -49,7 +67,7 @@ const PullRequestViewer: React.FC = () => {
4967 const fetchPullRequests = async ( ) => {
5068 if ( selectedRepo ) {
5169 try {
52- let allPullRequests : PullRequest [ ] = [ ] ;
70+ const allPullRequests : PullRequest [ ] = [ ] ;
5371 let page = 1 ;
5472 let hasNextPage = true ;
5573
@@ -59,10 +77,10 @@ const PullRequestViewer: React.FC = () => {
5977 repo : selectedRepo . value ,
6078 state : 'open' ,
6179 per_page : 100 ,
62- page : page ,
80+ page,
6381 } ) ;
6482
65- allPullRequests = [ ... allPullRequests , ... response . data ] ;
83+ allPullRequests . push ( ... response . data ) ;
6684
6785 if ( response . data . length < 100 ) {
6886 hasNextPage = false ;
@@ -80,25 +98,55 @@ const PullRequestViewer: React.FC = () => {
8098 fetchPullRequests ( ) ;
8199 } , [ selectedRepo ] ) ;
82100
101+ const sortPullRequests = ( prs : PullRequest [ ] ) => {
102+ return [ ...prs ] . sort ( ( a , b ) => {
103+ const aValue = a [ selectedSort . value ] ;
104+ const bValue = b [ selectedSort . value ] ;
105+
106+ if ( selectedSort . direction === 'asc' ) {
107+ return aValue < bValue ? - 1 : aValue > bValue ? 1 : 0 ;
108+ } else {
109+ return bValue < aValue ? - 1 : bValue > aValue ? 1 : 0 ;
110+ }
111+ } ) ;
112+ } ;
113+
114+ const sortedPullRequests = sortPullRequests ( pullRequests ) ;
115+
83116 return (
84117 < div >
85118 < h1 > Pull Request Viewer</ h1 >
86- < Select
87- options = { repos }
88- value = { selectedRepo }
89- onChange = { ( option ) => setSelectedRepo ( option as Repo ) }
90- placeholder = "Select a repository"
91- aria-label = "Select a repository"
92- />
93- { pullRequests . length > 0 ? (
119+ < div style = { { marginBottom : '1rem' } } >
120+ < Select
121+ options = { repos }
122+ value = { selectedRepo }
123+ onChange = { ( option ) => setSelectedRepo ( option as Repo ) }
124+ placeholder = "Select a repository"
125+ aria-label = "Select a repository"
126+ />
127+ </ div >
128+ < div style = { { marginBottom : '1rem' } } >
129+ < Select
130+ options = { sortOptions }
131+ value = { selectedSort }
132+ onChange = { ( option ) => setSelectedSort ( option as SortOption ) }
133+ placeholder = "Sort by"
134+ aria-label = "Sort pull requests"
135+ />
136+ </ div >
137+ { sortedPullRequests . length > 0 ? (
94138 < ul >
95- { pullRequests . map ( ( pr ) => (
139+ { sortedPullRequests . map ( ( pr ) => (
96140 < li key = { pr . html_url } >
97141 < a href = { pr . html_url } target = "_blank" rel = "noopener noreferrer" >
98142 { pr . title }
99143 </ a >
100144 { ' by ' }
101145 { pr . user . login }
146+ { ' - ' }
147+ Created: { new Date ( pr . created_at ) . toLocaleDateString ( ) }
148+ { ', ' }
149+ Last updated: { new Date ( pr . updated_at ) . toLocaleDateString ( ) }
102150 </ li >
103151 ) ) }
104152 </ ul >
0 commit comments