From aae5ac477aa5090d90cbb3ae2befd2eb15ecfa8e Mon Sep 17 00:00:00 2001 From: Efrain Date: Mon, 15 Mar 2021 20:45:45 -0500 Subject: [PATCH] Added initial material_bloc.dart --- lib/application/bloc.dart | 1 + lib/application/material/material_bloc.dart | 67 ++++++++++++++++++++ lib/application/material/material_event.dart | 14 ++++ lib/application/material/material_state.dart | 18 ++++++ lib/main.dart | 7 ++ 5 files changed, 107 insertions(+) create mode 100644 lib/application/material/material_bloc.dart create mode 100644 lib/application/material/material_event.dart create mode 100644 lib/application/material/material_state.dart diff --git a/lib/application/bloc.dart b/lib/application/bloc.dart index 8b1799c9e..f90b9bf27 100644 --- a/lib/application/bloc.dart +++ b/lib/application/bloc.dart @@ -9,6 +9,7 @@ export 'game_codes/game_codes_bloc.dart'; export 'home/home_bloc.dart'; export 'main/main_bloc.dart'; export 'main_tab/main_tab_bloc.dart'; +export 'material/material_bloc.dart'; export 'materials/materials_bloc.dart'; export 'settings/settings_bloc.dart'; export 'tierlist/tier_list_bloc.dart'; diff --git a/lib/application/material/material_bloc.dart b/lib/application/material/material_bloc.dart new file mode 100644 index 000000000..ecd241cfe --- /dev/null +++ b/lib/application/material/material_bloc.dart @@ -0,0 +1,67 @@ +import 'dart:async'; + +import 'package:flutter/cupertino.dart'; +import 'package:freezed_annotation/freezed_annotation.dart'; +import 'package:genshindb/application/common/pop_bloc.dart'; +import 'package:genshindb/domain/enums/enums.dart'; +import 'package:genshindb/domain/models/models.dart'; +import 'package:genshindb/domain/services/genshin_service.dart'; +import 'package:genshindb/domain/services/telemetry_service.dart'; +import 'package:meta/meta.dart'; + +part 'material_bloc.freezed.dart'; +part 'material_event.dart'; +part 'material_state.dart'; + +class MaterialBloc extends PopBloc { + final GenshinService _genshinService; + final TelemetryService _telemetryService; + + MaterialBloc(this._genshinService, this._telemetryService) : super(const MaterialState.loading()); + + @override + MaterialEvent getEventForPop(String key) => MaterialEvent.loadFromName(key: key, addToQueue: false); + + @override + Stream mapEventToState(MaterialEvent event) async* { + final s = await event.map( + loadFromName: (e) async { + final material = _genshinService.getMaterial(e.key); + if (e.addToQueue) { + await _telemetryService.trackMaterialLoaded(e.key); + currentItemsInStack.add(material.key); + } + return _buildInitialState(material); + }, + loadFromImg: (e) async { + final material = _genshinService.getMaterialByImage(e.image); + if (e.addToQueue) { + await _telemetryService.trackMaterialLoaded(material.image, loadedFromName: false); + currentItemsInStack.add(material.key); + } + return _buildInitialState(material); + }, + ); + + yield s; + } + + MaterialState _buildInitialState(MaterialFileModel material) { + final translation = _genshinService.getMaterialTranslation(material.key); + final charImgs = _genshinService.getCharacterImgsUsingMaterial(material.key); + final weaponImgs = _genshinService.getWeaponImgsUsingMaterial(material.key); + final relatedMaterials = _genshinService.getRelatedMaterialImgsToMaterial(material.key); + return MaterialState.loaded( + name: translation.name, + fullImage: material.fullImagePath, + rarity: material.rarity, + type: material.type, + description: translation.description, + charImages: charImgs, + weaponImages: weaponImgs, + days: material.days, + obtainedFrom: material.obtainedFrom, + relatedMaterials: relatedMaterials, + ); + } +} diff --git a/lib/application/material/material_event.dart b/lib/application/material/material_event.dart new file mode 100644 index 000000000..a2e5cdbce --- /dev/null +++ b/lib/application/material/material_event.dart @@ -0,0 +1,14 @@ +part of 'material_bloc.dart'; + +@freezed +abstract class MaterialEvent implements _$MaterialEvent { + const factory MaterialEvent.loadFromName({ + @required String key, + @Default(true) bool addToQueue, + }) = _LoadMaterialFromName; + + const factory MaterialEvent.loadFromImg({ + @required String image, + @Default(true) bool addToQueue, + }) = _LoadMaterialFromImg; +} diff --git a/lib/application/material/material_state.dart b/lib/application/material/material_state.dart new file mode 100644 index 000000000..9706a823f --- /dev/null +++ b/lib/application/material/material_state.dart @@ -0,0 +1,18 @@ +part of 'material_bloc.dart'; + +@freezed +abstract class MaterialState implements _$MaterialState { + const factory MaterialState.loading() = _LoadingState; + const factory MaterialState.loaded({ + @required String name, + @required String fullImage, + @required int rarity, + @required MaterialType type, + String description, + @required List charImages, + @required List weaponImages, + @required List days, + @required List obtainedFrom, + @required List relatedMaterials, + }) = _LoadedState; +} diff --git a/lib/main.dart b/lib/main.dart index aedcfd2a2..1937f397b 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -155,6 +155,13 @@ class MyApp extends StatelessWidget { return MaterialsBloc(genshinService); }, ), + BlocProvider( + create: (_) { + final genshinService = getIt(); + final telemetryService = getIt(); + return MaterialBloc(genshinService, telemetryService); + }, + ), ], child: BlocBuilder( builder: (ctx, state) => AppWidget(),