@@ -208,6 +208,9 @@ export type PickerContextState<T extends object> = {
208208 $filteredOptions : WritableAtom < OptionOrGroup < T > [ ] > ;
209209 $flattenedFilteredOptions : ReadableAtom < T [ ] > ;
210210 $totalOptionCount : ReadableAtom < number > ;
211+ $hasOptions : ReadableAtom < boolean > ;
212+ $filteredOptionsCount : ReadableAtom < number > ;
213+ $hasFilteredOptions : ReadableAtom < boolean > ;
211214 $areAllGroupsDisabled : ReadableAtom < boolean > ;
212215 $selectedItem : WritableAtom < T | undefined > ;
213216 $selectedItemId : ReadableAtom < string | undefined > ;
@@ -525,9 +528,6 @@ export const Picker = typedMemo(<T extends object>(props: PickerProps<T>) => {
525528 const $searchTerm = useAtom ( '' ) ;
526529 const $selectedItemId = useComputed ( [ $selectedItem ] , ( item ) => ( item ? getOptionId ( item ) : undefined ) ) ;
527530
528- const hasOptions = useStore ( $hasOptions ) ;
529- const hasFilteredOptions = useStore ( $hasFilteredOptions ) ;
530-
531531 const onSelectById = useCallback (
532532 ( id : string ) => {
533533 const options = $filteredOptions . get ( ) ;
@@ -578,6 +578,9 @@ export const Picker = typedMemo(<T extends object>(props: PickerProps<T>) => {
578578 searchable,
579579 $areAllGroupsDisabled,
580580 $selectedItemId,
581+ $hasOptions,
582+ $hasFilteredOptions,
583+ $filteredOptionsCount,
581584 } ) satisfies PickerContextState < T > ,
582585 [
583586 $optionsOrGroups ,
@@ -603,6 +606,9 @@ export const Picker = typedMemo(<T extends object>(props: PickerProps<T>) => {
603606 searchable ,
604607 $areAllGroupsDisabled ,
605608 $selectedItemId ,
609+ $hasOptions ,
610+ $hasFilteredOptions ,
611+ $filteredOptionsCount ,
606612 ]
607613 ) ;
608614
@@ -611,11 +617,11 @@ export const Picker = typedMemo(<T extends object>(props: PickerProps<T>) => {
611617 return (
612618 < PickerContext . Provider value = { ctx } >
613619 < PickerContainer >
614- { searchable && < PickerSearchBar /> }
620+ < PickerSearchBar />
615621 < Flex tabIndex = { - 1 } w = "full" flexGrow = { 1 } >
616- { ! hasOptions && < NoOptionsFallback /> }
617- { hasOptions && ! hasFilteredOptions && < NoMatchesFallback /> }
618- { hasOptions && hasFilteredOptions && < PickerList /> }
622+ < NoOptionsFallback />
623+ < NoMatchesFallback />
624+ < PickerList />
619625 </ Flex >
620626 </ PickerContainer >
621627 < PickerSyncer />
@@ -713,19 +719,41 @@ const PickerContainer = typedMemo(({ children }: PropsWithChildren) => {
713719PickerContainer . displayName = 'PickerContainer' ;
714720
715721const NoOptionsFallback = typedMemo ( < T extends object > ( ) => {
716- const { noOptionsFallback } = usePickerContext < T > ( ) ;
722+ const { noOptionsFallback, $hasOptions } = usePickerContext < T > ( ) ;
723+ const hasOptions = useStore ( $hasOptions ) ;
724+
725+ if ( hasOptions ) {
726+ return null ;
727+ }
728+
717729 return < NoOptionsFallbackWrapper > { noOptionsFallback } </ NoOptionsFallbackWrapper > ;
718730} ) ;
719731NoOptionsFallback . displayName = 'NoOptionsFallback' ;
720732
721733const NoMatchesFallback = typedMemo ( < T extends object > ( ) => {
722- const { noMatchesFallback } = usePickerContext < T > ( ) ;
734+ const { noMatchesFallback, $hasOptions, $hasFilteredOptions } = usePickerContext < T > ( ) ;
735+
736+ const hasOptions = useStore ( $hasOptions ) ;
737+ const hasFilteredOptions = useStore ( $hasFilteredOptions ) ;
738+
739+ if ( ! hasOptions ) {
740+ return null ;
741+ }
742+
743+ if ( hasFilteredOptions ) {
744+ return null ;
745+ }
746+
723747 return < NoMatchesFallbackWrapper > { noMatchesFallback } </ NoMatchesFallbackWrapper > ;
724748} ) ;
725749NoMatchesFallback . displayName = 'NoMatchesFallback' ;
726750
727751const PickerSearchBar = typedMemo ( < T extends object > ( ) => {
728- const { NextToSearchBar } = usePickerContext < T > ( ) ;
752+ const { NextToSearchBar, searchable } = usePickerContext < T > ( ) ;
753+
754+ if ( ! searchable ) {
755+ return null ;
756+ }
729757
730758 return (
731759 < Flex flexDir = "column" w = "full" gap = { 2 } >
@@ -890,6 +918,10 @@ const PickerList = typedMemo(<T extends object>() => {
890918 const compactView = useStore ( $compactView ) ;
891919 const filteredOptions = useStore ( $filteredOptions ) ;
892920
921+ if ( filteredOptions . length === 0 ) {
922+ return null ;
923+ }
924+
893925 return (
894926 < ScrollableContent >
895927 < Flex sx = { listSx } data-is-compact = { compactView } >
0 commit comments