@@ -22,6 +22,10 @@ type SelectType = 'default' | 'radio' | 'checkbox'
2222type SelectValue < T extends SelectType > = T extends 'radio' ? string : string [ ]
2323
2424interface SelectProps extends ComponentProps < 'div' > {
25+ defaultValue ?: SelectValue < SelectType >
26+ value ?: SelectValue < SelectType >
27+ onValueChange ?: ( value : SelectValue < SelectType > ) => void
28+ defaultOpen ?: boolean
2529 open ?: boolean
2630 onOpenChange ?: ( open : boolean ) => void
2731 children : React . ReactNode
@@ -47,14 +51,18 @@ export const useSelect = () => {
4751export function Select ( {
4852 type = 'default' ,
4953 children,
54+ defaultValue,
55+ value : valueProp ,
56+ onValueChange,
57+ defaultOpen,
5058 open : openProp ,
5159 onOpenChange,
5260 ...props
5361} : SelectProps ) {
5462 const ref = useRef < HTMLDivElement > ( null )
55- const [ open , setOpen ] = useState ( openProp ?? false )
63+ const [ open , setOpen ] = useState ( defaultOpen ?? false )
5664 const [ value , setValue ] = useState < SelectValue < typeof type > > (
57- type === 'checkbox' ? [ ] : '' ,
65+ defaultValue ?? ( type === 'checkbox' ? [ ] : '' ) ,
5866 )
5967
6068 useEffect ( ( ) => {
@@ -68,11 +76,19 @@ export function Select({
6876 } , [ open , setOpen ] )
6977
7078 const handleOpenChange = ( open : boolean ) => {
79+ if ( onOpenChange ) {
80+ onOpenChange ( open )
81+ return
82+ }
7183 setOpen ( open )
72- onOpenChange ?.( open )
7384 }
7485
7586 const handleValueChange = ( nextValue : string ) => {
87+ if ( onValueChange ) {
88+ onValueChange ( nextValue )
89+ return
90+ }
91+
7692 if ( type === 'default' ) return
7793 if ( type === 'radio' ) {
7894 setValue ( nextValue )
@@ -88,9 +104,9 @@ export function Select({
88104 return (
89105 < SelectContext . Provider
90106 value = { {
91- open,
107+ open : openProp ?? open ,
92108 setOpen : handleOpenChange ,
93- value,
109+ value : valueProp ?? value ,
94110 setValue : handleValueChange ,
95111 type,
96112 } }
0 commit comments