import 'package:dio/dio.dart'; import 'package:flutter/material.dart'; import 'package:logger/logger.dart'; import 'package:freezed_annotation/freezed_annotation.dart'; import 'package:qpay/http/http.dart'; part 'home_controller.freezed.dart'; part 'home_controller.g.dart'; class HomeScreenModel { List transactions = []; List categories = []; dynamic account = {}; dynamic profile = {}; bool isLoading = false; bool isLoggedIn = false; String? errorMessage; } @freezed abstract class Category with _$Category { const factory Category({ required String name, required String description, required String? image, required String label, }) = _Category; factory Category.fromJson(Map json) => _$CategoryFromJson(json); } var logger = Logger(printer: PrettyPrinter()); class HomeController extends ChangeNotifier { final HomeScreenModel model = HomeScreenModel(); final Http http = Http(); Future getCategories() async { // activate skeletonizer model.categories = getFakeCategoryData(); // Simulate fetching categories try { model.isLoading = true; List response = await http.get('/categories'); model.categories = response.map((e) => Category.fromJson(e)).toList(); } on DioException catch (e) { logger.e(e); model.errorMessage = e.type.name; model.categories = []; } model.isLoading = false; notifyListeners(); } // required by skeletonizer List getFakeCategoryData() { return [ Category( name: 'Electricity', description: 'Pay your electricity bills easily', image: 'assets/images/electricity.png', label: 'Electricity', ), Category( name: 'Internet', description: 'Pay your internet bills easily', image: 'assets/images/internet.png', label: 'Internet', ), ]; } }