@@ -783,13 +783,15 @@ export const WithOnCancel = () => {
783783
784784export const MultiSelectModal = ( ) => {
785785 const [ initialSelection , setInitialSelection ] = React . useState < ItemInput [ ] > ( items . slice ( 1 , 3 ) )
786-
787786 const [ selected , setSelected ] = React . useState < ItemInput [ ] > ( initialSelection )
787+ const [ savedSelection , setSavedSelection ] = React . useState < ItemInput [ ] > ( initialSelection )
788788 const [ filter , setFilter ] = React . useState ( '' )
789789 const [ open , setOpen ] = useState ( false )
790790
791791 React . useEffect ( ( ) => {
792- if ( ! open ) setInitialSelection ( selected ) // Save selection as initialSelection for next time
792+ // Sync initialSelection with the last committed selection after the modal closes.
793+ // onCancel uses initialSelection to discard unsaved changes made while the modal is open.
794+ if ( ! open ) setInitialSelection ( selected )
793795 } , [ open , selected ] )
794796
795797 const filteredItems = items . filter ( item => item . text . toLowerCase ( ) . startsWith ( filter . toLowerCase ( ) ) )
@@ -800,13 +802,18 @@ export const MultiSelectModal = () => {
800802 title = "Select labels"
801803 placeholder = "Select labels"
802804 subtitle = "Use labels to organize issues and pull requests"
803- renderAnchor = { ( { children , ...anchorProps } ) => (
805+ renderAnchor = { ( { ...anchorProps } ) => (
804806 < Button trailingAction = { TriangleDownIcon } { ...anchorProps } aria-haspopup = "dialog" >
805- { children }
807+ { savedSelection . map ( item => item . text ) . join ( ', ' ) || 'Select labels' }
806808 </ Button >
807809 ) }
808810 open = { open }
809- onOpenChange = { setOpen }
811+ onOpenChange = { ( nextOpen , gesture ) => {
812+ setOpen ( nextOpen )
813+ if ( ! nextOpen && gesture === 'selection' ) {
814+ setSavedSelection ( selected )
815+ }
816+ } }
810817 items = { filteredItems }
811818 selected = { selected }
812819 onSelectedChange = { setSelected }
0 commit comments