-
-
Notifications
You must be signed in to change notification settings - Fork 38
/
Copy pathReposFilters.tsx
128 lines (119 loc) · 4.08 KB
/
ReposFilters.tsx
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
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
import { FC } from "react";
import { PullRequestState, RepositoryRenderFormat } from "@/types/github";
type ReposFiltersProps = {
searchQuery: string;
setSearchQuery: React.Dispatch<React.SetStateAction<string>>;
pullRequestState: PullRequestState;
setpullRequestState: React.Dispatch<React.SetStateAction<PullRequestState>>;
baseYear: number;
year: number;
setYear: React.Dispatch<React.SetStateAction<number>>;
format: RepositoryRenderFormat;
setFormat: React.Dispatch<React.SetStateAction<RepositoryRenderFormat>>;
hideOwnRepo: boolean;
setHideOwnRepo: React.Dispatch<React.SetStateAction<boolean>>;
};
export const ReposFilters: FC<ReposFiltersProps> = ({
searchQuery,
setSearchQuery,
pullRequestState,
setpullRequestState,
baseYear,
year,
setYear,
format,
setFormat,
hideOwnRepo,
setHideOwnRepo,
}) => {
const YEARS_RANGE = 4;
const FORMAT_OPTIONS = ["cards", "text", "json"] as const;
const handleYearChange = (selectedYear: number) => {
setYear(selectedYear);
};
const handleFormatChange = (selectedFormat: RepositoryRenderFormat) => {
setFormat(selectedFormat);
};
const handleHideOwnRepoChange = () => {
setHideOwnRepo((prevHideOwnRepo) => !prevHideOwnRepo);
};
const handlePullRequestStateChange = (selectedState: PullRequestState) => {
setpullRequestState(selectedState);
};
return (
<div className="flex justify-between sm:gap-0 sm:flex-row flex-col gap-3">
<div className="sm:text-left text-center">
<div>Select Year</div>
<div className="join">
{Array.from({ length: YEARS_RANGE }).map((_, i) => {
const radioYear = baseYear - YEARS_RANGE + i + 1;
return (
<input
key={i}
className="join-item btn"
type="radio"
name="year"
aria-label={radioYear.toString()}
onChange={() => handleYearChange(radioYear)}
checked={year === radioYear}
/>
);
})}
</div>
<div className="sm:flex-row flex-col flex">
<div className="my-5 mr-2 flex flex-col sm:items-start items-center">
<label className="mb-2">Search</label>
<input
type="text"
placeholder="Type here"
className="input input-bordered w-full max-w-md"
value={searchQuery}
onChange={(e) => setSearchQuery(e.target.value)}
/>
</div>
<div className="my-5 flex flex-col sm:items-start items-center">
<label className="mb-2">State of PR</label>
<select
className="select select-bordered w-full max-w-md"
value={pullRequestState}
onChange={(e) =>
handlePullRequestStateChange(e.target.value as PullRequestState)
}
>
<option value={null!} selected></option>
<option value="OPEN">Open</option>
<option value="MERGED">Merged</option>
<option value="CLOSED">Closed</option>
</select>
</div>
</div>
<div className="flex sm:items-start items-center justify-center md:justify-start">
<input
type="checkbox"
name="hide-own-repo"
checked={hideOwnRepo}
onChange={handleHideOwnRepoChange}
className="checkbox checkbox-sm checkbox-primary"
/>
<label className="ml-2">Hide own repositories</label>
</div>
</div>
<div className="sm:text-right text-center">
<div>Select Format</div>
<div className="join">
{FORMAT_OPTIONS.map((formatOption: RepositoryRenderFormat) => (
<input
key={formatOption}
className="join-item btn"
type="radio"
name="format"
aria-label={formatOption}
onChange={() => handleFormatChange(formatOption)}
checked={format === formatOption}
/>
))}
</div>
</div>
</div>
);
};