import 'dart:async'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:mobile_scanner/mobile_scanner.dart'; import 'package:seshat/data/repositories/book_instance_repository.dart'; import 'package:seshat/data/repositories/book_repository.dart'; import 'package:seshat/data/repositories/owner_repository.dart'; import 'package:seshat/domain/models/bal.dart'; import 'package:seshat/domain/models/book.dart'; import 'package:seshat/domain/models/book_instance.dart'; import 'package:seshat/domain/models/owner.dart'; import 'package:seshat/utils/command.dart'; import 'package:seshat/utils/result.dart'; class AddViewModel extends ChangeNotifier { AddViewModel({ required OwnerRepository ownerRepository, required BookRepository bookRepository, required BookInstanceRepository bookInstanceRepository, }) : _ownerRepository = ownerRepository, _bookRepository = bookRepository, _bookInstanceRepository = bookInstanceRepository { load = Command0(_load)..execute(); } final OwnerRepository _ownerRepository; final BookRepository _bookRepository; final BookInstanceRepository _bookInstanceRepository; late final StreamSubscription sub; /* * ==================== * =====[ OWNERS ]===== * ==================== */ Owner? _currentOwner; Owner? get currentOwner => _currentOwner; set currentOwner(Owner? owner) { _currentOwner = owner; notifyListeners(); } List _owners = []; List? get owners => _owners; Future> addOwner( String firstName, String lastName, String contact, ) async { debugPrint("\n\n\n\n(2) TRANFERRING\n\n\n\n"); final result = await _ownerRepository.addOwner( firstName, lastName, contact, ); switch (result) { case Ok(): final secondResult = await _ownerRepository.getOwners(); switch (secondResult) { case Ok(): debugPrint("\n\n\n${secondResult.value.length}"); _owners = secondResult.value; debugPrint("\n\n\n${_owners.length}"); _currentOwner = result.value; notifyListeners(); return Result.ok(result.value); case Error(): return Result.error(secondResult.error); } case Error(): return Result.error(result.error); } } /* * =================== * =====[ PRICE ]===== * =================== */ bool _askPrice = true; bool get askPrice => _askPrice; set askPrice(bool newValue) { _askPrice = newValue; notifyListeners(); } /* * ================================= * =====[ BOOKS AND INSTANCES ]===== * ================================= */ /// Sends an api request with a [bacorde], then gets the [Book] that was /// either created or retrieved. Sens the [Book] back wrapped in a [Result]. Future> scanBook(BarcodeCapture barcode) async { var ean = barcode.barcodes.first.rawValue!; var result = await _bookRepository.getBookByEAN(ean); return result; } Future> sendBook( Book book, Owner owner, Bal bal, double price, ) async { return await _bookInstanceRepository.sendBook(book, owner, bal, price); } /// Sends an api request with // Result newBookInstance() { // }; /* * ================================= * =====[ COMMAND AND LOADING ]===== * ================================= */ late final Command0 load; bool isLoaded = false; Future> _load() async { return await _loadOwners(); } Future> _loadOwners() async { final result = await _ownerRepository.getOwners(); switch (result) { case Ok(): _owners = result.value ..sort( (a, b) => "${a.firstName} ${a.lastName}".compareTo( "${b.firstName} ${b.lastName}", ), ); isLoaded = true; case Error(): debugPrint("Oupsie daysie, ${result.error}"); } notifyListeners(); return result; } @override void dispose() { sub.cancel(); super.dispose(); } }