import 'dart:async'; import 'dart:typed_data'; import 'package:commons_core/commons_core.dart'; 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}) => _repo.updateVariety( id: varietyId, label: label, category: category, notes: notes, ); Future addLot({ LotType type = LotType.seed, int? year, int? month, Quantity? quantity, Presentation? presentation, }) => _repo.addLot( varietyId: varietyId, type: type, harvestYear: year, harvestMonth: month, quantity: quantity, presentation: presentation, ); Future updateLot({ required String lotId, required LotType type, int? year, int? month, Quantity? quantity, Presentation? presentation, }) => _repo.updateLot( lotId: lotId, type: type, harvestYear: year, harvestMonth: month, quantity: quantity, presentation: presentation, ); 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 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(); } }