import 'package:flutter/material.dart'; import 'package:seshat/data/repositories/bal_repository.dart'; import 'package:seshat/domain/models/bal.dart'; import 'package:seshat/utils/command.dart'; import 'package:seshat/utils/result.dart'; class HomeViewModel extends ChangeNotifier { HomeViewModel({required BalRepository balRepository}) : _balRepository = balRepository { load = Command0(_load)..execute(); } final BalRepository _balRepository; /* * ================= * =====[ BAL ]===== * ================= */ /// [List] of all [Bal] List _bals = []; /// [List] of all [Bal] List get bals => _bals; /// [Bal] currently [BalState.ongoing] Bal? _ongoingBal; /// [Bal] currently [BalState.ongoing] Bal? get ongoingBal => _ongoingBal; /// Creates a [Bal] from its [name], [startTime] and [endTime] Future> createBal( String name, DateTime startTime, DateTime endTime, ) async { final result = await _balRepository.addBal(name, startTime, endTime); switch (result) { case Ok(): final result2 = await _balRepository.getBals(); switch (result2) { case Ok(): _bals = result2.value..sort((a, b) => a.compareTo(b)); break; case Error(): return result2; } break; case Error(): return result; } notifyListeners(); return result; } /* * ================================= * =====[ COMMAND AND LOADING ]===== * ================================= */ /// Command to load all necessary data late final Command0 load; bool isLoaded = false; /// Manages loaders Future> _load() async { final result2 = await _loadBal(); switch (result2) { case Ok(): isLoaded = true; break; default: break; } notifyListeners(); return result2; } /// Loads data about [Bal] Future> _loadBal() async { final result = await _balRepository.getBals(); switch (result) { case Ok(): _bals = result.value..sort((a, b) => a.compareTo(b)); _ongoingBal = _bals .where((bal) => bal.state == BalState.ongoing) .firstOrNull; break; case Error(): return result; } return result; } }