Show only populated place filters
All checks were successful
Build and deploy Flutter Web / build (push) Successful in 3m30s

This commit is contained in:
Ruslan Bakiev
2026-05-14 22:48:47 +07:00
parent 697f029ad2
commit 7e3d03d225

View File

@@ -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()