import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:mobile_scanner/mobile_scanner.dart'; import 'package:seshat/data/repositories/owner_repository.dart'; import 'package:seshat/domain/models/book.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}) : _ownerRepository = ownerRepository { load = Command0(_load)..execute(); } final OwnerRepository _ownerRepository; /* * ==================== * =====[ 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 { final result = await _ownerRepository.postOwner( firstName, lastName, contact, ); switch (result) { case Ok(): final secondResult = await _ownerRepository.getOwners(); switch (secondResult) { case Ok(): _owners = secondResult.value; _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 { return Result.ok( Book( author: "Patrick K. Dewdney", ean: barcode.barcodes.first.rawValue!, id: 56, priceNew: "50 EUR", title: "Les chiens et la charrue", ), ); } /// 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; isLoaded = true; case Error(): debugPrint("Oupsie daysie, ${result.error}"); } notifyListeners(); _ownerRepository.liveOwners().listen((Owner owner) { _owners.add(owner); notifyListeners(); }); return result; } }