1
- import * as React from "react" ;
1
+ import React , { useState , useEffect } from "react" ;
2
2
import Box from "@mui/material/Box" ;
3
3
import Button from "@mui/material/Button" ;
4
4
import Modal from "@mui/material/Modal" ;
@@ -20,14 +20,15 @@ const style = {
20
20
} ;
21
21
22
22
export default function BasicModal ( {
23
+ isDarkMode,
23
24
selectedLabels,
24
25
setSelectedLabels,
25
- isDarkMode ,
26
+ handleParametersURL ,
26
27
} ) {
27
28
const handleClose = ( ) => setOpen ( false ) ;
28
- const [ open , setOpen ] = React . useState ( false ) ;
29
29
const handleOpen = ( ) => setOpen ( true ) ;
30
- const [ labelsList , setLabelsList ] = React . useState ( [
30
+ const [ open , setOpen ] = useState ( false ) ;
31
+ const [ labelsList , setLabelsList ] = useState ( [
31
32
"bug" ,
32
33
"documentation" ,
33
34
"Eddiehub:good-first-issue" ,
@@ -36,26 +37,50 @@ export default function BasicModal({
36
37
"good first issue" ,
37
38
"help wanted" ,
38
39
] ) ;
40
+ const [ filterInput , setFilterInput ] = useState ( "" ) ;
39
41
40
- const handleChange = ( label , event ) => {
41
- const newSelectedLabels = [ ...selectedLabels ] ;
42
- const index = newSelectedLabels . indexOf ( label ) ;
43
- if ( index === - 1 ) {
44
- newSelectedLabels . push ( label ) ;
42
+ useEffect ( ( ) => {
43
+ setLabelsList ( [ ...new Set ( [ ...labelsList , ...selectedLabels ] ) ] ) ;
44
+ } , [ open ] ) ;
45
+
46
+ const handleChange = ( inputLabel , event ) => {
47
+ if ( ! selectedLabels . includes ( inputLabel ) ) {
48
+ setSelectedLabels ( ( prevSelectedLabels ) => {
49
+ const newSelectedLabels = [ ...prevSelectedLabels , inputLabel ] ;
50
+ handleParametersURL ( newSelectedLabels , true ) ;
51
+ return newSelectedLabels ;
52
+ } ) ;
45
53
} else {
46
- newSelectedLabels . splice ( index , 1 ) ;
54
+ setSelectedLabels ( ( prevSelectedLabels ) => {
55
+ const newSelectedLabels = prevSelectedLabels . filter (
56
+ ( label ) => label !== inputLabel ,
57
+ ) ;
58
+ handleParametersURL ( newSelectedLabels , false ) ;
59
+ return newSelectedLabels ;
60
+ } ) ;
47
61
}
48
- setSelectedLabels ( newSelectedLabels ) ;
49
62
} ;
50
63
51
64
const handleClear = ( ) => {
52
65
setSelectedLabels ( [ ] ) ;
53
66
setOpen ( false ) ;
67
+ handleParametersURL ( [ ] , false ) ;
68
+ } ;
69
+
70
+ const handleFilterInput = ( ) => {
71
+ if ( filterInput . length <= 1 || labelsList . includes ( filterInput ) ) {
72
+ setFilterInput ( "" ) ;
73
+ } else {
74
+ const newLabelsList = [ ...labelsList , filterInput ] ;
75
+ setLabelsList ( newLabelsList ) ;
76
+
77
+ setFilterInput ( "" ) ;
78
+ }
54
79
} ;
55
80
56
81
return (
57
82
< div >
58
- < Button className = "p-2rounded-full" >
83
+ < Button className = "p-2rounded-full space-x-1" onClick = { handleOpen } >
59
84
< svg
60
85
xmlns = "http://www.w3.org/2000/svg"
61
86
fill = "none"
@@ -70,23 +95,45 @@ export default function BasicModal({
70
95
d = "M3 4a1 1 0 011-1h16a1 1 0 011 1v2a1 1 0 01-.293.707L14 12.414V18a1 1 0 01-.553.894l-4 2A1 1 0 018 20v-7.586L3.293 6.707A1 1 0 013 6V4z"
71
96
/>
72
97
</ svg >
73
- < Button onClick = { handleOpen } className = "sm:!text-sm !text-[12px]" >
74
- Filter
75
- </ Button >
98
+ < span className = "sm:!text-sm !text-[12px]" > Filter</ span >
76
99
</ Button >
77
100
< Modal
78
101
open = { open }
79
102
onClose = { handleClose }
80
103
aria-labelledby = "modal-modal-title"
81
104
aria-describedby = "modal-modal-description"
105
+ role = "dialog"
82
106
>
83
107
< Box
84
108
sx = { style }
85
- className = { `sm:!h-[300px] ${
109
+ className = { `sm:!h-[300px] !overflow-y-auto ${
86
110
isDarkMode ? "bg-slate-800 text-white" : "bg-slate-200 text-black"
87
111
} `}
88
112
>
89
113
< FormGroup className = "!grid sm:grid-cols-2" >
114
+ < input
115
+ type = "text"
116
+ className = { `
117
+ w-full md:col-span-2
118
+ p-1
119
+ rounded-lg
120
+ border border-gray-300
121
+ focus:ring-2 focus:ring-blue-500
122
+ focus:outline-none
123
+ transition duration-200 ease-in-out
124
+ text-gray-700
125
+ placeholder-gray-400
126
+ shadow-sm
127
+ hover:shadow-md
128
+ ${
129
+ isDarkMode
130
+ ? "bg-gray-800 text-gray-400"
131
+ : "bg-gray-200 text-gray-500"
132
+ } `}
133
+ placeholder = "Search issues"
134
+ value = { filterInput }
135
+ onChange = { ( e ) => setFilterInput ( e . target . value ) }
136
+ />
90
137
{ labelsList . map ( ( label , idx ) => (
91
138
< FormControlLabel
92
139
key = { idx }
@@ -100,6 +147,14 @@ export default function BasicModal({
100
147
label = { label }
101
148
/>
102
149
) ) }
150
+ < button
151
+ className = "inline-block px-2 py-2 h-10 w-32 text-l font-medium text-white bg-green-500 rounded-full
152
+ truncate hover:scale-105 hover:shadow-lg"
153
+ style = { { backgroundColor : "#164a6e" } }
154
+ onClick = { ( ) => handleFilterInput ( ) }
155
+ >
156
+ Submit
157
+ </ button >
103
158
</ FormGroup >
104
159
< Button
105
160
onClick = { handleClear }
0 commit comments