// gets all quotes from the database and returns them in a list import 'package:flutter/material.dart'; import 'package:frontend/model/quote.dart'; import 'package:frontend/repository/quote_repository.dart'; class QuoteProvider extends ChangeNotifier { List _quotes = []; List _filteredQuotes = []; Set _authors = {}; bool _loading = false; String? _error; List get quotes => _quotes; List get filteredQuotes => _filteredQuotes; Set get authors => _authors; bool get loading => _loading; String? get error => _error; final QuoteRepository repo = QuoteRepository(); int filterBy = 0; // 0 = by author, 1 = by quote var filterController = TextEditingController(text: ''); void clearFilterController() { filterController.text = ''; } QuoteProvider() { readQuotes(); // auto-load on creation } void populateAuthors() { _authors = {}; for (var i = 0; i < quotes.length; i++) { _authors.add(quotes[i].author); } } void filterQuotes() { _filteredQuotes = []; for (var quote in _quotes) { switch (filterBy) { case 0: if (quote.author.toLowerCase() == filterController.text.toLowerCase()) { _filteredQuotes.add(quote); } break; case 1: if (quote.body.toLowerCase().contains(filterController.text.toLowerCase())) { _filteredQuotes.add(quote); } break; } } notifyListeners(); } Future readQuotes() async { _loading = true; _error = null; notifyListeners(); try { _quotes = await repo.readQuotes(); _filteredQuotes = _quotes; } catch (e) { _error = e.toString(); } populateAuthors(); _loading = false; notifyListeners(); } Future createQuote(Quote quote) async { final newQuote = await repo.createQuote(quote); _quotes.add(newQuote); populateAuthors(); notifyListeners(); } Future updateQuote(Quote quote) async { try { _loading = true; notifyListeners(); final updated = await repo.updateQuote(quote); final index = _quotes.indexWhere((q) => q.id == quote.id); if (index != -1) { final oldAuthor = _quotes[index].author; final newList = List.from(_quotes); newList[index] = updated; _quotes = newList; Map authorMap = {}; for (final q in quotes) { authorMap[q.author] = (authorMap[q.author] ?? 0) + 1; } if (authorMap[oldAuthor] == 1) { _authors.remove(oldAuthor); } _authors.add(updated.author); } } finally { _loading = false; notifyListeners(); } } Future deleteQuote(Quote quote) async { await repo.deleteQuote(quote); _quotes.removeWhere((q) => q.id == quote.id); populateAuthors(); notifyListeners(); } }