Skip to content

Commit 1677402

Browse files
committed
fix(provider): re-filter on toggleTasted under the not-tasted filter
toggleFavorite re-applies filters when the favourites filter is active, but toggleTasted did not. Marking a drink tasted while the "not tasted" visibility filter was on left the drink stuck in the visible list until the next filter, sort or reload. Re-run filter+sort in toggleTasted when the notTasted filter is active, mirroring toggleFavorite. https://claude.ai/code/session_0135nVBYGpwkaQvG13XyS66H
1 parent a1b9bd0 commit 1677402

2 files changed

Lines changed: 36 additions & 0 deletions

File tree

lib/providers/beer_provider.dart

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -598,6 +598,12 @@ class BeerProvider extends ChangeNotifier {
598598
);
599599
drink.isTasted = newStatus;
600600

601+
// Re-filter so the drink appears/disappears immediately when the
602+
// not-tasted visibility filter is active.
603+
if (_visibilityFilters.contains(DrinkVisibilityFilter.notTasted)) {
604+
_applyFiltersAndSort();
605+
}
606+
601607
notifyListeners();
602608

603609
// Log analytics event

test/beer_provider_test.dart

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -948,6 +948,36 @@ void main() {
948948
expect(provider.drinks.any((d) => d.isTasted), isFalse);
949949
});
950950

951+
test('toggleTasted refreshes filtered list while notTasted filter is active',
952+
() async {
953+
provider = BeerProvider(
954+
drinkRepository: mockDrinkRepository,
955+
festivalRepository: mockFestivalRepository,
956+
analyticsService: mockAnalyticsService,
957+
);
958+
await provider.initialize();
959+
960+
final sampleDrinks = createSampleDrinks();
961+
when(mockDrinkRepository.getDrinks(any))
962+
.thenAnswer((_) async => sampleDrinks);
963+
await provider.loadDrinks();
964+
965+
await provider.setVisibilityFilter(DrinkVisibilityFilter.notTasted, true);
966+
expect(provider.drinks.length, sampleDrinks.length);
967+
968+
// Mark the first visible drink as tasted via the provider.
969+
final target = provider.drinks.first;
970+
when(mockDrinkRepository.toggleTasted(
971+
provider.currentFestival.id, target.id))
972+
.thenAnswer((_) async => true);
973+
await provider.toggleTasted(target);
974+
975+
// With the not-tasted filter active the drink must drop out
976+
// of the visible list immediately.
977+
expect(provider.drinks.length, sampleDrinks.length - 1);
978+
expect(provider.drinks.any((d) => d.id == target.id), isFalse);
979+
});
980+
951981
test('veganOnly filter shows only vegan drinks', () async {
952982
provider = BeerProvider(
953983
drinkRepository: mockDrinkRepository,

0 commit comments

Comments
 (0)