Show only populated place filters
All checks were successful
Build and deploy Flutter Web / build (push) Successful in 3m30s
All checks were successful
Build and deploy Flutter Web / build (push) Successful in 3m30s
This commit is contained in:
@@ -53,7 +53,11 @@ class _MapContent extends ConsumerWidget {
|
||||
final selected = state.selectedPlace;
|
||||
final userCoordinate = state.userCoordinate;
|
||||
final mapCenter = userCoordinate ?? selected?.coordinate ?? _fallbackCenter;
|
||||
final availableTraits = PlaceTrait.values;
|
||||
final traitCounts = _countPlaceTraits(state.places);
|
||||
final availableTraits = [
|
||||
for (final trait in PlaceTrait.values)
|
||||
if ((traitCounts[trait] ?? 0) > 0) trait,
|
||||
];
|
||||
|
||||
return Scaffold(
|
||||
body: Stack(
|
||||
@@ -126,10 +130,12 @@ class _MapContent extends ConsumerWidget {
|
||||
child: Column(
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
children: [
|
||||
_TraitBar(
|
||||
selectedTrait: state.selectedTrait,
|
||||
traits: availableTraits,
|
||||
),
|
||||
if (availableTraits.isNotEmpty)
|
||||
_TraitBar(
|
||||
selectedTrait: state.selectedTrait,
|
||||
traits: availableTraits,
|
||||
traitCounts: traitCounts,
|
||||
),
|
||||
_PlaceCarousel(
|
||||
places: state.recommendations,
|
||||
onSelect: (place) => ref
|
||||
@@ -173,6 +179,16 @@ class _MapContent extends ConsumerWidget {
|
||||
}
|
||||
}
|
||||
|
||||
Map<PlaceTrait, int> _countPlaceTraits(List<PlaceRecommendation> places) {
|
||||
final counts = <PlaceTrait, int>{};
|
||||
for (final place in places) {
|
||||
for (final trait in place.traits) {
|
||||
counts[trait] = (counts[trait] ?? 0) + 1;
|
||||
}
|
||||
}
|
||||
return counts;
|
||||
}
|
||||
|
||||
class _UserLocationMarker extends StatelessWidget {
|
||||
const _UserLocationMarker();
|
||||
|
||||
@@ -520,10 +536,15 @@ class _MapAttribution extends StatelessWidget {
|
||||
}
|
||||
|
||||
class _TraitBar extends ConsumerWidget {
|
||||
const _TraitBar({required this.selectedTrait, required this.traits});
|
||||
const _TraitBar({
|
||||
required this.selectedTrait,
|
||||
required this.traits,
|
||||
required this.traitCounts,
|
||||
});
|
||||
|
||||
final PlaceTrait? selectedTrait;
|
||||
final List<PlaceTrait> traits;
|
||||
final Map<PlaceTrait, int> traitCounts;
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context, WidgetRef ref) {
|
||||
@@ -541,7 +562,7 @@ class _TraitBar extends ConsumerWidget {
|
||||
final selected = item == selectedTrait;
|
||||
return ChoiceChip(
|
||||
avatar: Icon(item.icon, size: 17),
|
||||
label: Text(item.label),
|
||||
label: Text('${item.label} ${traitCounts[item] ?? 0}'),
|
||||
selected: selected,
|
||||
onSelected: (_) => selected
|
||||
? controller.clearTrait()
|
||||
|
||||
Reference in New Issue
Block a user