From e745e81117ccbce5c53ac9fc133d293204dad42f Mon Sep 17 00:00:00 2001 From: Efrain Date: Thu, 5 May 2022 21:56:26 -0500 Subject: [PATCH] [Application] Added initial charts bloc --- lib/application/bloc.dart | 1 + lib/application/charts/charts_bloc.dart | 59 ++++++++++++++++++++++++ lib/application/charts/charts_event.dart | 10 ++++ lib/application/charts/charts_state.dart | 14 ++++++ lib/injection.dart | 6 +++ 5 files changed, 90 insertions(+) create mode 100644 lib/application/charts/charts_bloc.dart create mode 100644 lib/application/charts/charts_event.dart create mode 100644 lib/application/charts/charts_state.dart diff --git a/lib/application/bloc.dart b/lib/application/bloc.dart index ea343bf7c..99a0cd2cd 100644 --- a/lib/application/bloc.dart +++ b/lib/application/bloc.dart @@ -12,6 +12,7 @@ export 'calculator_asc_materials/sessions_order/calculator_asc_materials_session export 'changelog/changelog_bloc.dart'; export 'character/character_bloc.dart'; export 'characters/characters_bloc.dart'; +export 'charts/charts_bloc.dart'; export 'custom_build/custom_build_bloc.dart'; export 'custom_builds/custom_builds_bloc.dart'; export 'donations/donations_bloc.dart'; diff --git a/lib/application/charts/charts_bloc.dart b/lib/application/charts/charts_bloc.dart new file mode 100644 index 000000000..357e55375 --- /dev/null +++ b/lib/application/charts/charts_bloc.dart @@ -0,0 +1,59 @@ +import 'package:bloc/bloc.dart'; +import 'package:freezed_annotation/freezed_annotation.dart'; +import 'package:shiori/domain/enums/enums.dart'; +import 'package:shiori/domain/models/models.dart'; +import 'package:shiori/domain/services/genshin_service.dart'; +import 'package:shiori/domain/services/telemetry_service.dart'; + +part 'charts_bloc.freezed.dart'; +part 'charts_event.dart'; +part 'charts_state.dart'; + +class ChartsBloc extends Bloc { + final GenshinService _genshinService; + final TelemetryService _telemetryService; + + ChartsBloc(this._genshinService, this._telemetryService) : super(const ChartsState.loading()); + + @override + Stream mapEventToState(ChartsEvent event) async* { + final s = await event.map( + init: (_) async => _init(), + elementSelected: (e) async => _elementSelected(e.type), + ); + + yield s; + } + + Future _init() async { + await _telemetryService.trackChartsOpened(); + final tops = [ + ..._genshinService.getTopCharts(ChartType.topFiveStarCharacterMostReruns), + ..._genshinService.getTopCharts(ChartType.topFiveStarCharacterLeastReruns), + ..._genshinService.getTopCharts(ChartType.topFiveStarWeaponMostReruns), + ..._genshinService.getTopCharts(ChartType.topFiveStarWeaponLeastReruns), + ..._genshinService.getTopCharts(ChartType.topFourStarCharacterMostReruns), + ..._genshinService.getTopCharts(ChartType.topFourStarCharacterLeastReruns), + ..._genshinService.getTopCharts(ChartType.topFourStarWeaponMostReruns), + ..._genshinService.getTopCharts(ChartType.topFourStarWeaponLeastReruns), + ]; + final birthdays = _genshinService.getCharacterBirthdaysForCharts(); + final elements = _genshinService.getElementsForCharts(); + return ChartsState.initial(tops: tops, birthdays: birthdays, elements: elements, filteredElements: elements); + } + + ChartsState _elementSelected(ElementType type) => state.maybeMap( + initial: (state) { + final selectedTypes = [...state.selectedElementTypes]; + if (selectedTypes.contains(type)) { + selectedTypes.remove(type); + } else { + selectedTypes.add(type); + } + + final filteredElements = selectedTypes.isEmpty ? state.elements : state.elements.where((el) => selectedTypes.contains(el.type)).toList(); + return state.copyWith(selectedElementTypes: selectedTypes, filteredElements: filteredElements); + }, + orElse: () => state, + ); +} diff --git a/lib/application/charts/charts_event.dart b/lib/application/charts/charts_event.dart new file mode 100644 index 000000000..aa6ccbada --- /dev/null +++ b/lib/application/charts/charts_event.dart @@ -0,0 +1,10 @@ +part of 'charts_bloc.dart'; + +@freezed +class ChartsEvent with _$ChartsEvent { + const factory ChartsEvent.init() = _Init; + + const factory ChartsEvent.elementSelected({ + required ElementType type, + }) = _ElementSelected; +} diff --git a/lib/application/charts/charts_state.dart b/lib/application/charts/charts_state.dart new file mode 100644 index 000000000..71d7c002f --- /dev/null +++ b/lib/application/charts/charts_state.dart @@ -0,0 +1,14 @@ +part of 'charts_bloc.dart'; + +@freezed +class ChartsState with _$ChartsState { + const factory ChartsState.loading() = _LoadingState; + + const factory ChartsState.initial({ + required List tops, + required List birthdays, + required List elements, + required List filteredElements, + @Default([]) List selectedElementTypes, + }) = _InitialState; +} diff --git a/lib/injection.dart b/lib/injection.dart index 451e630e3..2ea7bc155 100644 --- a/lib/injection.dart +++ b/lib/injection.dart @@ -162,6 +162,12 @@ class Injection { return ItemReleaseHistoryBloc(genshinService, telemetryService); } + static ChartsBloc get chartsBloc { + final genshinService = getIt(); + final telemetryService = getIt(); + return ChartsBloc(genshinService, telemetryService); + } + //TODO: USE THIS PROP // static CalculatorAscMaterialsItemBloc get calculatorAscMaterialsItemBloc { // final genshinService = getIt();