1
- import Select , { type StylesConfig } from 'react-select' ;
1
+ import Select , {
2
+ type GroupBase ,
3
+ type SingleValue ,
4
+ type StylesConfig ,
5
+ } from 'react-select' ;
2
6
3
7
import { useCallback , useMemo , useState } from '~/libs/hooks/hooks.js' ;
4
8
import { type SelectOption } from '~/libs/types/select-option.type.js' ;
5
9
6
10
type Properties = {
7
11
options : SelectOption [ ] ;
12
+ defaultValue ?: SelectOption ;
13
+ onChange ?: ( value : string | undefined ) => void ;
8
14
} ;
9
15
10
- const getStyles = ( isMenuOpen : boolean ) : StylesConfig => {
16
+ const getStyles = (
17
+ isMenuOpen : boolean ,
18
+ ) : StylesConfig < SelectOption , false , GroupBase < SelectOption > > => {
11
19
return {
12
20
control : ( styles ) => ( {
13
21
...styles ,
@@ -47,6 +55,8 @@ const getStyles = (isMenuOpen: boolean): StylesConfig => {
47
55
48
56
const Dropdown : React . FC < Properties > = ( {
49
57
options,
58
+ defaultValue,
59
+ onChange,
50
60
} : Properties ) : JSX . Element => {
51
61
const [ isMenuOpen , setIsMenuOpen ] = useState ( false ) ;
52
62
@@ -60,15 +70,26 @@ const Dropdown: React.FC<Properties> = ({
60
70
61
71
const stylesConfig = useMemo ( ( ) => getStyles ( isMenuOpen ) , [ isMenuOpen ] ) ;
62
72
73
+ const handleChange = useCallback (
74
+ ( option : SingleValue < SelectOption > ) => {
75
+ if ( onChange ) {
76
+ onChange ( option ?. value ) ;
77
+ }
78
+ } ,
79
+ [ onChange ] ,
80
+ ) ;
81
+
63
82
return (
64
- < Select
83
+ < Select < SelectOption >
65
84
options = { options }
66
85
classNamePrefix = "react-select"
67
86
styles = { stylesConfig }
68
87
isSearchable = { false }
69
88
menuIsOpen = { isMenuOpen }
70
89
onMenuOpen = { handleOpenMenu }
71
90
onMenuClose = { handleCloseMenu }
91
+ onChange = { handleChange }
92
+ defaultValue = { defaultValue }
72
93
/>
73
94
) ;
74
95
} ;
0 commit comments