@@ -3,34 +3,57 @@ import { useForkRef } from '@salutejs/plasma-core';
3
3
4
4
import { createEvent } from '../../../../../utils' ;
5
5
import { ComboboxProps } from '../../Combobox.types' ;
6
+ import { ValueToCheckedMapType } from '../../hooks/getPathMaps' ;
6
7
7
8
import { SelectHidden } from './SelectNative.styles' ;
8
9
9
10
type Props = Pick < ComboboxProps , 'name' | 'value' | 'multiple' > & {
10
11
onChange : ( value : ChangeEvent < HTMLSelectElement > | null ) => void ;
12
+ onSetValue : ( value : string ) => void ;
13
+ items : ValueToCheckedMapType ;
11
14
} ;
12
15
13
- export const SelectNative = forwardRef < HTMLInputElement , Props > ( ( { name, multiple, value, onChange } , ref ) => {
14
- const values = ( multiple ? value : [ value ] ) as string [ ] ;
15
- const selectRef = useRef < HTMLSelectElement > ( null ) ;
16
- const forkRef = useForkRef ( selectRef , ref as any ) ;
17
-
18
- useEffect ( ( ) => {
19
- const event = createEvent ( selectRef ) ;
20
- if ( onChange ) {
21
- onChange ( event ) ;
22
- }
23
- } , [ values ] ) ;
24
-
25
- return (
26
- < >
27
- < SelectHidden ref = { forkRef } multiple = { multiple } name = { name } hidden value = { multiple ? values : values [ 0 ] } >
28
- { values . map ( ( v ) => (
29
- < option key = { v } value = { v } >
30
- { v }
31
- </ option >
32
- ) ) }
33
- </ SelectHidden >
34
- </ >
35
- ) ;
36
- } ) ;
16
+ export const SelectNative = forwardRef < HTMLInputElement , Props > (
17
+ ( { name, multiple, items, value, onChange, onSetValue } , ref ) => {
18
+ const values = ( multiple ? value : [ value ] ) as string [ ] ;
19
+ const selectRef = useRef < HTMLSelectElement > ( null ) ;
20
+ const forkRef = useForkRef ( selectRef , ref as any ) ;
21
+ const options = Array . from ( items . keys ( ) ) ;
22
+
23
+ useEffect ( ( ) => {
24
+ const event = createEvent ( selectRef ) ;
25
+ if ( onChange ) {
26
+ onChange ( event ) ;
27
+ }
28
+ } , [ values ] ) ;
29
+
30
+ useEffect ( ( ) => {
31
+ if ( selectRef . current ) {
32
+ const valueInit = selectRef . current . value ;
33
+ const item = options . find ( ( v ) => v === valueInit ) ;
34
+
35
+ if ( item ) {
36
+ onSetValue ( item ) ;
37
+ }
38
+ }
39
+ } , [ selectRef ] ) ;
40
+
41
+ return (
42
+ < >
43
+ < SelectHidden
44
+ ref = { forkRef }
45
+ multiple = { multiple }
46
+ name = { name }
47
+ hidden
48
+ value = { multiple ? values : values [ 0 ] }
49
+ >
50
+ { options . map ( ( v ) => (
51
+ < option key = { v } value = { v } >
52
+ { v }
53
+ </ option >
54
+ ) ) }
55
+ </ SelectHidden >
56
+ </ >
57
+ ) ;
58
+ } ,
59
+ ) ;
0 commit comments