1
1
import React from "react" ;
2
2
import "./styles.scss" ;
3
- import {
4
- UseFormRegister ,
5
- UseFormRegisterReturn ,
6
- UseFormSetValue ,
7
- } from "react-hook-form" ;
3
+ import { UseFormSetValue } from "react-hook-form" ;
8
4
import useToggle from "../../hooks/useToggle" ;
9
- import { IBlog , IUser } from "../../interfaces" ;
10
5
import Icon from "../Icon" ;
11
6
import { X } from "@styled-icons/heroicons-outline" ;
7
+ import { DEFAULT_PROFFILE_IMG_URL } from "../../utils/constants" ;
8
+ import { IUser } from "../../interfaces" ;
12
9
13
10
interface ISelectProps {
14
- defaultValues ?: any [ ] ;
15
- datalist : any [ ] ;
11
+ // defaultValues?: any[];
12
+ // datalist: any[];
13
+ defaultValues ?: string [ ] ;
14
+ datalist : Array < string | IUser > ;
16
15
type ?: "multiple" | "single" ;
17
16
maxTags ?: number ;
18
17
hideTag ?: boolean ;
@@ -29,18 +28,29 @@ const Select = ({
29
28
name,
30
29
setValue,
31
30
} : ISelectProps ) => {
31
+ // const defaultVl = defaultValues.map((item) => {
32
+ // if (typeof item === "string") {
33
+ // return item;
34
+ // } else {
35
+ // return item.username;
36
+ // }
37
+ // });
38
+
32
39
const [ isShow , setShow ] = useToggle ( false ) ;
33
40
const [ inputValue , setInputValue ] = React . useState ( "" ) ;
34
- const [ tags , setTags ] = React . useState < any [ ] > ( defaultValues ) ;
41
+ const [ tags , setTags ] = React . useState < string [ ] > ( defaultValues ) ;
35
42
const [ isKeyReleased , setIsKeyReleased ] = React . useState ( false ) ;
36
43
const inputRef = React . useRef < HTMLInputElement > ( null ) ;
37
44
38
- const dataLst : any [ ] =
39
- typeof datalist [ 0 ] === "string"
40
- ? datalist
41
- : datalist . map ( ( d ) => d . username ) ;
45
+ const dataLs : any [ ] = datalist . map ( ( item ) => {
46
+ if ( typeof item === "string" ) {
47
+ return item ;
48
+ } else {
49
+ return item . username ;
50
+ }
51
+ } ) ;
42
52
43
- const filter = dataLst
53
+ const filter = dataLs
44
54
. sort ( )
45
55
. filter (
46
56
( item ) =>
@@ -57,7 +67,9 @@ const Select = ({
57
67
const handleCheckoxChange = (
58
68
e : React . ChangeEvent < HTMLInputElement >
59
69
) : void => {
70
+ console . log ( "running" ) ;
60
71
const { checked, value } = e . target ;
72
+ console . log ( value , checked ) ;
61
73
let newCheckedList = [ ...tags ] ;
62
74
63
75
if ( checked ) {
@@ -79,7 +91,7 @@ const Select = ({
79
91
) {
80
92
e . preventDefault ( ) ;
81
93
82
- if ( dataLst . includes ( trimmedInput ) ) {
94
+ if ( dataLs . includes ( trimmedInput ) ) {
83
95
setTags ( ( prev ) => [ ...prev , trimmedInput ] ) ;
84
96
} else if ( filter . length ) {
85
97
for ( let i = 0 ; i < filter . length ; i ++ ) {
@@ -118,7 +130,7 @@ const Select = ({
118
130
setIsKeyReleased ( true ) ;
119
131
} ;
120
132
121
- const search = ( data : any [ ] ) : any [ ] => {
133
+ const search = ( data : Array < string | IUser > ) : any [ ] => {
122
134
return data . filter (
123
135
( item ) =>
124
136
( typeof item === "string" ? item : item . username )
@@ -128,45 +140,90 @@ const Select = ({
128
140
) ;
129
141
} ;
130
142
131
- // React.useEffect(() => {
132
- // console.log(tags);
133
- // setValue(name, tags);
134
- // }, []);
143
+ React . useEffect ( ( ) => {
144
+ console . log ( tags ) ;
145
+ setValue ( name , tags ) ;
146
+ } , [ tags ] ) ;
135
147
136
148
const deleteTag = ( index : number ) => {
137
149
setTags ( ( prevState ) => prevState . filter ( ( tag , i ) => i !== index ) ) ;
138
150
} ;
139
151
152
+ const handleFocus = ( ) => {
153
+ setShow ( true ) ;
154
+ if ( inputRef . current ) {
155
+ inputRef . current . focus ( ) ;
156
+ }
157
+ } ;
158
+
159
+ const handleBlur = ( e : React . FocusEvent ) => {
160
+ if ( ! e . currentTarget . contains ( e . relatedTarget ) ) {
161
+ setShow ( false ) ;
162
+ }
163
+ } ;
164
+
165
+ const renderOptions = ( ) => {
166
+ const isString = typeof datalist [ 0 ] === "string" ;
167
+
168
+ let options = search ( datalist )
169
+ . sort (
170
+ isString
171
+ ? undefined
172
+ : ( a , b ) =>
173
+ a . username > b . username ? 1 : b . username > a . username ? - 1 : 0
174
+ )
175
+ . map (
176
+ isString
177
+ ? ( item ) => (
178
+ < React . Fragment key = { item } >
179
+ < input
180
+ id = { item }
181
+ type = "checkbox"
182
+ value = { item }
183
+ checked = { tags . includes ( item ) }
184
+ onChange = { handleCheckoxChange }
185
+ />
186
+ < label htmlFor = { item } > { item } </ label >
187
+ </ React . Fragment >
188
+ )
189
+ : ( item ) => (
190
+ < React . Fragment key = { item . username } >
191
+ < input
192
+ id = { item . username }
193
+ type = "checkbox"
194
+ value = { item . username }
195
+ checked = { tags . includes ( item . username ) }
196
+ onChange = { ( e ) => handleCheckoxChange ( e ) }
197
+ />
198
+ < label htmlFor = { item } className = "user-row" >
199
+ < img src = { DEFAULT_PROFFILE_IMG_URL } alt = "profile" />
200
+ < div > { item . username } </ div >
201
+ </ label >
202
+ </ React . Fragment >
203
+ )
204
+ ) ;
205
+
206
+ return options ;
207
+ } ;
208
+
140
209
return (
141
- < div
142
- className = "select"
143
- onFocus = { ( ) => {
144
- setShow ( true ) ;
145
- if ( inputRef . current ) {
146
- inputRef . current . focus ( ) ;
147
- }
148
- } }
149
- onBlur = { ( e ) => {
150
- if ( ! e . currentTarget . contains ( e . relatedTarget ) ) {
151
- setShow ( false ) ;
152
- }
153
- } }
154
- >
155
- { tags . map ( ( tag , index ) => (
156
- < div className = "select__tag" tabIndex = { 1 } >
157
- { tag }
158
- < button onClick = { ( ) => deleteTag ( index ) } >
159
- < Icon icon = { X } size = { 12 } />
160
- </ button >
161
- </ div >
162
- ) ) }
210
+ < div className = "select" onFocus = { handleFocus } onBlur = { handleBlur } >
211
+ { ! hideTag &&
212
+ tags . map ( ( tag , index ) => (
213
+ < div className = "select__tag" tabIndex = { 1 } key = { tag + "-tag" } >
214
+ { tag }
215
+ < button onClick = { ( ) => deleteTag ( index ) } >
216
+ < Icon icon = { X } size = { 12 } />
217
+ </ button >
218
+ </ div >
219
+ ) ) }
163
220
< input
164
221
className = "select__input"
165
- onChange = { handleInputChange }
166
222
value = { inputValue }
223
+ ref = { inputRef }
224
+ onChange = { handleInputChange }
167
225
onKeyDown = { handleKeydown }
168
226
onKeyUp = { handleKeyUp }
169
- ref = { inputRef }
170
227
/>
171
228
< div
172
229
className = "select__dropdown"
@@ -176,7 +233,7 @@ const Select = ({
176
233
} }
177
234
style = { { display : isShow ? "block" : "none" } }
178
235
>
179
- { typeof datalist [ 0 ] === "string" &&
236
+ { /* { typeof datalist[0] === "string" &&
180
237
datalist &&
181
238
search(datalist)
182
239
.sort()
@@ -199,21 +256,24 @@ const Select = ({
199
256
.sort((a, b) =>
200
257
a.username > b.username ? 1 : b.username > a.username ? -1 : 0
201
258
)
202
- . map ( ( item , index ) => (
259
+ .map((item) => (
203
260
<div key={item.guid}>
204
261
<input
205
262
type="checkbox"
206
- value = { item }
263
+ value={item.guid }
207
264
checked={tags.includes(item)}
208
265
onChange={handleCheckoxChange}
209
- id = { item }
266
+ id={item.guid}
267
+ name="select-option"
210
268
/>
211
- < label htmlFor = { item } >
269
+ <label htmlFor={item} className="user-row">
270
+ <img src={DEFAULT_PROFFILE_IMG_URL} alt="profile" />
212
271
<div>{item.guid}</div>
213
272
<div>{item.username}</div>
214
273
</label>
215
274
</div>
216
- ) ) }
275
+ ))} */ }
276
+ { renderOptions ( ) }
217
277
</ div >
218
278
</ div >
219
279
) ;
0 commit comments