11import { PlanetEarth } from '@gravity-ui/icons' ;
2- import { Button , Flex , Icon , Select , SelectRenderControlProps , SelectRenderOption } from '@gravity-ui/uikit' ;
3- import React , { ReactNode , Ref , useEffect , useState } from 'react' ;
2+ import { Button , Flex , Icon , Select , SelectRenderControlProps , SelectRenderOption , useSelectOptions } from '@gravity-ui/uikit' ;
3+ import React , { ReactNode , Ref , useEffect , useMemo , useState } from 'react' ;
44import { useDispatch , useSelector } from 'react-redux' ;
55
66import { selectBrowsers } from '@/static/modules/actions' ;
@@ -75,48 +75,40 @@ export function BrowsersSelect(): ReactNode {
7575 setSelectedBrowsers ( selectedItems ) ;
7676 } ;
7777
78- const renderOptions = ( ) : React . JSX . Element | React . JSX . Element [ ] => {
78+ const getOptionData = ( browser : BrowserItem , version : string , content : string ) : { value : string ; content : string ; data : { id : string ; version : string } } => ( {
79+ value : serializeBrowserData ( browser . id , version ) ,
80+ content,
81+ data : { id : browser . id , version}
82+ } ) ;
83+
84+ const rawOptions = useMemo ( ( ) => {
7985 const browsersWithMultipleVersions = browsers . filter ( browser => browser . versions . length > 1 ) ;
8086 const browsersWithSingleVersion = browsers . filter ( browser => browser . versions . length === 1 ) ;
8187
82- const getOptionProps = ( browser : BrowserItem , version : string ) : { value : string ; content : string ; data : Record < string , unknown > } => ( {
83- value : serializeBrowserData ( browser . id , version ) ,
84- content : browser . id ,
85- data : { id : browser . id , version}
86- } ) ;
87-
8888 if ( browsersWithMultipleVersions . length === 0 ) {
89- // If there are no browsers with multiple versions, we want to render a simple plain list
90- return browsers . map ( browser => < Select . Option
91- key = { browser . id }
92- { ...getOptionProps ( browser , browser . versions [ 0 ] ) }
93- /> ) ;
89+ // If there are no browsers with multiple versions, we want to render a simple flat list
90+ return browsers . map ( browser => getOptionData ( browser , browser . versions [ 0 ] , browser . id ) ) ;
9491 } else {
95- // Otherwise render browser version groups and place all browsers with single version into "Other" group
96- return (
97- < >
98- { browsersWithMultipleVersions . map ( browser => (
99- < Select . OptionGroup key = { browser . id } label = { browser . id } >
100- { browser . versions . map ( version => (
101- < Select . Option
102- key = { version }
103- { ...getOptionProps ( browser , version ) }
104- />
105- ) ) }
106- </ Select . OptionGroup >
107- ) ) }
108- < Select . OptionGroup label = "Other" >
109- { browsersWithSingleVersion . map ( browser => (
110- < Select . Option
111- key = { browser . id }
112- { ...getOptionProps ( browser , browser . versions [ 0 ] ) }
113- />
114- ) ) }
115- </ Select . OptionGroup >
116- </ >
117- ) ;
92+ // Otherwise render browser version groups and place all browsers with a single version in the "Other" group
93+ const groups : { label : string ; options : ReturnType < typeof getOptionData > [ ] } [ ] = [ ] ;
94+
95+ browsersWithMultipleVersions . forEach ( browser => {
96+ groups . push ( {
97+ label : browser . id ,
98+ options : browser . versions . map ( version => getOptionData ( browser , version , version ) )
99+ } ) ;
100+ } ) ;
101+
102+ groups . push ( {
103+ label : 'Other' ,
104+ options : browsersWithSingleVersion . map ( browser => getOptionData ( browser , browser . versions [ 0 ] , browser . id ) )
105+ } ) ;
106+
107+ return groups ;
118108 }
119- } ;
109+ } , [ browsers ] ) ;
110+
111+ const options = useSelectOptions ( { options : rawOptions } ) ;
120112
121113 const isInitialized = useSelector ( getIsInitialized ) ;
122114
@@ -171,6 +163,7 @@ export function BrowsersSelect(): ReactNode {
171163 < Select
172164 disablePortal
173165 value = { selected }
166+ options = { options }
174167 multiple = { true }
175168 hasCounter
176169 filterable
@@ -182,9 +175,7 @@ export function BrowsersSelect(): ReactNode {
182175 onUpdate = { onUpdate }
183176 onFocus = { onFocus }
184177 onClose = { onClose }
185- >
186- { renderOptions ( ) }
187- </ Select >
178+ />
188179 </ >
189180 ) ;
190181}
0 commit comments