progress on home page

This commit is contained in:
2025-06-27 17:26:36 +02:00
parent a866d97b70
commit 03d0f77ac2
15 changed files with 929 additions and 279 deletions

View File

@@ -10,6 +10,10 @@ part 'home_controller.g.dart';
class HomeScreenModel {
List<dynamic> transactions = [];
List<Category> categories = [];
List<BillProvider> providers = [];
List<BillProvider> filterableProviders = [];
BillProvider? selectedProvider;
dynamic selectedCategory;
dynamic account = {};
dynamic profile = {};
bool isLoading = false;
@@ -30,13 +34,64 @@ abstract class Category with _$Category {
_$CategoryFromJson(json);
}
var logger = Logger(printer: PrettyPrinter());
@freezed
abstract class BillProvider with _$BillProvider {
const factory BillProvider({
required String clientId,
required String name,
required String description,
required bool requiresAccount,
required bool requiresAmount,
required bool requiresAmountFromMerchant,
required bool requiresPhone,
required bool requiresReversal,
required String? additionalDataString,
required String processorType,
required String uid,
required String image,
required String label,
required String category,
}) = _BillProvider;
factory BillProvider.fromJson(Map<String, dynamic> json) =>
_$BillProviderFromJson(json);
}
class HomeController extends ChangeNotifier {
final HomeScreenModel model = HomeScreenModel();
final Http http = Http();
Future<void> getProviders() async {
model.providers = getFakeProviders();
try {
model.isLoading = true;
List<dynamic> response = await http.get('/providers');
model.providers = response.map((e) => BillProvider.fromJson(e)).toList();
model.filterableProviders = model.providers;
if (model.providers.isNotEmpty) {
updateSelectedProvider(model.providers[0]);
}
} catch (e) {
logger.e(e);
model.errorMessage = e.toString();
model.providers = [];
model.filterableProviders = [];
}
model.isLoading = false;
notifyListeners();
}
void updateSelectedProvider(BillProvider provider) {
model.selectedProvider = provider;
// getProducts(provider.uid);
notifyListeners();
}
Future<void> getCategories() async {
// activate skeletonizer
model.categories = getFakeCategoryData();
@@ -45,16 +100,58 @@ class HomeController extends ChangeNotifier {
model.isLoading = true;
List<dynamic> response = await http.get('/categories');
model.categories = response.map((e) => Category.fromJson(e)).toList();
} on DioException catch (e) {
if (model.categories.isNotEmpty) {
updateSelectedCategory(model.categories[0]);
}
} on Exception catch (e) {
logger.e(e);
model.errorMessage = e.type.name;
model.errorMessage = e.toString();
model.categories = [];
} finally {
model.isLoading = false;
notifyListeners();
}
}
Future<void> updateSelectedCategory(Category? category) async {
if (category == null) {
model.filterableProviders = model.providers;
notifyListeners();
return;
}
model.isLoading = false;
model.selectedCategory = category;
model.filterableProviders =
model.providers
.where((element) => element.category == category.label)
.toList();
notifyListeners();
}
List<BillProvider> getFakeProviders() {
return [
BillProvider(
clientId: '1',
name: 'ZESA',
description: 'Pay your electricity bills easily',
requiresAccount: false,
requiresAmount: false,
requiresAmountFromMerchant: false,
requiresPhone: false,
requiresReversal: false,
additionalDataString: '',
processorType: '',
uid: '',
image: 'econet.png',
label: '',
category: '',
),
];
}
// required by skeletonizer
List<Category> getFakeCategoryData() {
return [