import 'dart:async'; import 'dart:typed_data'; import 'package:commons_core/commons_core.dart'; import 'package:drift/drift.dart' show Value; import 'package:equatable/equatable.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import '../data/variety_repository.dart'; import '../db/enums.dart'; class VarietyDetailState extends Equatable { const VarietyDetailState({ this.detail, this.loading = true, this.deleted = false, }); final VarietyDetail? detail; final bool loading; final bool deleted; @override List get props => [detail, loading, deleted]; } /// Streams one variety's detail and edits it through the repository. class VarietyDetailCubit extends Cubit { VarietyDetailCubit(this._repo, this.varietyId) : super(const VarietyDetailState()) { _sub = _repo .watchVariety(varietyId) .listen( (d) => emit( VarietyDetailState( detail: d, loading: false, deleted: state.deleted, ), ), ); } final VarietyRepository _repo; final String varietyId; late final StreamSubscription _sub; Future updateFields({ String? label, String? category, String? notes, bool? isOrganic, bool? needsReproduction, Value sowMonths = const Value.absent(), Value transplantMonths = const Value.absent(), Value floweringMonths = const Value.absent(), Value fruitingMonths = const Value.absent(), Value seedHarvestMonths = const Value.absent(), }) => _repo.updateVariety( id: varietyId, label: label, category: category, notes: notes, isOrganic: isOrganic, needsReproduction: needsReproduction, sowMonths: sowMonths, transplantMonths: transplantMonths, floweringMonths: floweringMonths, fruitingMonths: fruitingMonths, seedHarvestMonths: seedHarvestMonths, ); Future addLot({ LotType type = LotType.seed, int? year, int? month, Quantity? quantity, Presentation? presentation, String? originName, String? originPlace, Abundance? abundance, PreservationFormat? preservationFormat, OfferStatus offerStatus = OfferStatus.private, double? priceAmount, String? priceCurrency, }) => _repo.addLot( varietyId: varietyId, type: type, harvestYear: year, harvestMonth: month, quantity: quantity, presentation: presentation, originName: originName, originPlace: originPlace, abundance: abundance, preservationFormat: preservationFormat, offerStatus: offerStatus, priceAmount: priceAmount, priceCurrency: priceCurrency, ); Future updateLot({ required String lotId, required LotType type, int? year, int? month, Quantity? quantity, Presentation? presentation, String? originName, String? originPlace, Abundance? abundance, PreservationFormat? preservationFormat, OfferStatus offerStatus = OfferStatus.private, double? priceAmount, String? priceCurrency, }) => _repo.updateLot( lotId: lotId, type: type, harvestYear: year, harvestMonth: month, quantity: quantity, presentation: presentation, originName: originName, originPlace: originPlace, abundance: abundance, preservationFormat: preservationFormat, offerStatus: offerStatus, priceAmount: priceAmount, priceCurrency: priceCurrency, ); Future deleteLot(String lotId) => _repo.softDeleteLot(lotId); Future addVernacularName(String name) => _repo.addVernacularName(varietyId, name); Future removeVernacularName(String nameId) => _repo.removeVernacularName(nameId); Future addPhoto(Uint8List bytes) => _repo.addPhoto(varietyId, bytes); Future removePhoto(String attachmentId) => _repo.removePhoto(attachmentId); Future setPreferredPhoto(String attachmentId) => _repo.setPreferredPhoto(varietyId, attachmentId); Future addExternalLink(String url, {String? title}) => _repo.addExternalLink(varietyId, url, title: title); Future removeExternalLink(String linkId) => _repo.removeExternalLink(linkId); Future linkSpecies(String speciesId) => _repo.linkSpecies(varietyId, speciesId); Future addGerminationTest({ required String lotId, int? testedOn, int? sampleSize, int? germinatedCount, }) => _repo.addGerminationTest( lotId: lotId, testedOn: testedOn, sampleSize: sampleSize, germinatedCount: germinatedCount, ); Future addConditionCheck({ required String lotId, int? checkedOn, int? containerCount, DesiccantState? desiccantState, }) => _repo.addConditionCheck( lotId: lotId, checkedOn: checkedOn, containerCount: containerCount, desiccantState: desiccantState, ); Future deleteVariety() async { await _repo.softDeleteVariety(varietyId); emit( VarietyDetailState(detail: state.detail, loading: false, deleted: true), ); } @override Future close() async { await _sub.cancel(); return super.close(); } }