@@ -208,6 +208,9 @@ export type PickerContextState<T extends object> = {
208
208
$filteredOptions : WritableAtom < OptionOrGroup < T > [ ] > ;
209
209
$flattenedFilteredOptions : ReadableAtom < T [ ] > ;
210
210
$totalOptionCount : ReadableAtom < number > ;
211
+ $hasOptions : ReadableAtom < boolean > ;
212
+ $filteredOptionsCount : ReadableAtom < number > ;
213
+ $hasFilteredOptions : ReadableAtom < boolean > ;
211
214
$areAllGroupsDisabled : ReadableAtom < boolean > ;
212
215
$selectedItem : WritableAtom < T | undefined > ;
213
216
$selectedItemId : ReadableAtom < string | undefined > ;
@@ -525,9 +528,6 @@ export const Picker = typedMemo(<T extends object>(props: PickerProps<T>) => {
525
528
const $searchTerm = useAtom ( '' ) ;
526
529
const $selectedItemId = useComputed ( [ $selectedItem ] , ( item ) => ( item ? getOptionId ( item ) : undefined ) ) ;
527
530
528
- const hasOptions = useStore ( $hasOptions ) ;
529
- const hasFilteredOptions = useStore ( $hasFilteredOptions ) ;
530
-
531
531
const onSelectById = useCallback (
532
532
( id : string ) => {
533
533
const options = $filteredOptions . get ( ) ;
@@ -578,6 +578,9 @@ export const Picker = typedMemo(<T extends object>(props: PickerProps<T>) => {
578
578
searchable,
579
579
$areAllGroupsDisabled,
580
580
$selectedItemId,
581
+ $hasOptions,
582
+ $hasFilteredOptions,
583
+ $filteredOptionsCount,
581
584
} ) satisfies PickerContextState < T > ,
582
585
[
583
586
$optionsOrGroups ,
@@ -603,6 +606,9 @@ export const Picker = typedMemo(<T extends object>(props: PickerProps<T>) => {
603
606
searchable ,
604
607
$areAllGroupsDisabled ,
605
608
$selectedItemId ,
609
+ $hasOptions ,
610
+ $hasFilteredOptions ,
611
+ $filteredOptionsCount ,
606
612
]
607
613
) ;
608
614
@@ -611,11 +617,11 @@ export const Picker = typedMemo(<T extends object>(props: PickerProps<T>) => {
611
617
return (
612
618
< PickerContext . Provider value = { ctx } >
613
619
< PickerContainer >
614
- { searchable && < PickerSearchBar /> }
620
+ < PickerSearchBar />
615
621
< Flex tabIndex = { - 1 } w = "full" flexGrow = { 1 } >
616
- { ! hasOptions && < NoOptionsFallback /> }
617
- { hasOptions && ! hasFilteredOptions && < NoMatchesFallback /> }
618
- { hasOptions && hasFilteredOptions && < PickerList /> }
622
+ < NoOptionsFallback />
623
+ < NoMatchesFallback />
624
+ < PickerList />
619
625
</ Flex >
620
626
</ PickerContainer >
621
627
< PickerSyncer />
@@ -713,19 +719,41 @@ const PickerContainer = typedMemo(({ children }: PropsWithChildren) => {
713
719
PickerContainer . displayName = 'PickerContainer' ;
714
720
715
721
const 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
+
717
729
return < NoOptionsFallbackWrapper > { noOptionsFallback } </ NoOptionsFallbackWrapper > ;
718
730
} ) ;
719
731
NoOptionsFallback . displayName = 'NoOptionsFallback' ;
720
732
721
733
const 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
+
723
747
return < NoMatchesFallbackWrapper > { noMatchesFallback } </ NoMatchesFallbackWrapper > ;
724
748
} ) ;
725
749
NoMatchesFallback . displayName = 'NoMatchesFallback' ;
726
750
727
751
const PickerSearchBar = typedMemo ( < T extends object > ( ) => {
728
- const { NextToSearchBar } = usePickerContext < T > ( ) ;
752
+ const { NextToSearchBar, searchable } = usePickerContext < T > ( ) ;
753
+
754
+ if ( ! searchable ) {
755
+ return null ;
756
+ }
729
757
730
758
return (
731
759
< Flex flexDir = "column" w = "full" gap = { 2 } >
@@ -890,6 +918,10 @@ const PickerList = typedMemo(<T extends object>() => {
890
918
const compactView = useStore ( $compactView ) ;
891
919
const filteredOptions = useStore ( $filteredOptions ) ;
892
920
921
+ if ( filteredOptions . length === 0 ) {
922
+ return null ;
923
+ }
924
+
893
925
return (
894
926
< ScrollableContent >
895
927
< Flex sx = { listSx } data-is-compact = { compactView } >
0 commit comments