Skip to content

Commit

Permalink
Added initial materials bloc
Browse files Browse the repository at this point in the history
  • Loading branch information
Wolfteam committed Mar 14, 2021
1 parent 7f00140 commit 833388c
Show file tree
Hide file tree
Showing 17 changed files with 269 additions and 49 deletions.
1 change: 1 addition & 0 deletions lib/application/bloc.dart
Expand Up @@ -12,6 +12,7 @@ export 'main_tab/main_tab_bloc.dart';
export 'materials/materials_bloc.dart';
export 'settings/settings_bloc.dart';
export 'tierlist/tier_list_bloc.dart';
export 'today_materials/today_materials_bloc.dart';
export 'url_page/url_page_bloc.dart';
export 'weapon/weapon_bloc.dart';
export 'weapons/weapons_bloc.dart';
Expand Up @@ -161,7 +161,7 @@ class CalculatorAscMaterialsBloc extends Bloc<CalculatorAscMaterialsEvent, Calcu
case MaterialType.weaponPrimary:
key = AscensionMaterialSummaryType.common;
break;
case MaterialType.elemental:
case MaterialType.elementalStone:
case MaterialType.jewels:
case MaterialType.talents:
case MaterialType.others:
Expand Down
161 changes: 121 additions & 40 deletions lib/application/materials/materials_bloc.dart
Expand Up @@ -2,63 +2,144 @@ import 'dart:async';

import 'package:bloc/bloc.dart';
import 'package:freezed_annotation/freezed_annotation.dart';
import 'package:genshindb/domain/enums/enums.dart';
import 'package:genshindb/domain/enums/material_type.dart';
import 'package:genshindb/domain/models/models.dart';
import 'package:genshindb/domain/services/genshin_service.dart';
import 'package:genshindb/domain/services/telemetry_service.dart';

part 'materials_bloc.freezed.dart';
part 'materials_event.dart';
part 'materials_state.dart';

class MaterialsBloc extends Bloc<MaterialsEvent, MaterialsState> {
final GenshinService _genshinService;
final TelemetryService _telemetryService;

MaterialsBloc(this._genshinService, this._telemetryService) : super(const MaterialsState.loading());
_LoadedState get currentState => state as _LoadedState;

MaterialsBloc(this._genshinService) : super(const MaterialsState.loading());

@override
Stream<MaterialsState> mapEventToState(
MaterialsEvent event,
) async* {
await _telemetryService.trackAscensionMaterialsOpened();
final s = event.when(
init: () {
final days = [
DateTime.monday,
DateTime.tuesday,
DateTime.wednesday,
DateTime.thursday,
DateTime.friday,
DateTime.saturday,
DateTime.sunday,
];
Stream<MaterialsState> mapEventToState(MaterialsEvent event) async* {
final s = event.map(
init: (e) => _buildInitialState(),
rarityChanged: (e) => currentState.copyWith.call(tempRarity: e.rarity),
sortDirectionTypeChanged: (e) => currentState.copyWith.call(tempSortDirectionType: e.sortDirectionType),
typeChanged: (e) => currentState.copyWith.call(tempType: e.type),
filterTypeChanged: (e) => currentState.copyWith.call(tempFilterType: e.type),
searchChanged: (e) => _buildInitialState(
search: e.search,
rarity: currentState.rarity,
type: currentState.type,
filterType: currentState.filterType,
sortDirectionType: currentState.sortDirectionType,
),
applyFilterChanges: (_) => _buildInitialState(
search: currentState.search,
rarity: currentState.tempRarity,
type: currentState.tempType,
filterType: currentState.tempFilterType,
sortDirectionType: currentState.tempSortDirectionType,
),
cancelChanges: (_) => currentState.copyWith.call(
tempFilterType: currentState.filterType,
tempRarity: currentState.rarity,
tempSortDirectionType: currentState.sortDirectionType,
tempType: currentState.type,
),
);

final charMaterials = <TodayCharAscensionMaterialsModel>[];
final weaponMaterials = <TodayWeaponAscensionMaterialModel>[];
//TODO: YOU MAY WANT TO SHOW THE BOSS ITEMS AS WELL
for (final day in days) {
final charMaterialsForDay = _genshinService.getCharacterAscensionMaterials(day);
final weaponMaterialsForDay = _genshinService.getWeaponAscensionMaterials(day);
yield s;
}

for (final material in charMaterialsForDay) {
if (charMaterials.any((m) => m.name == material.name)) {
continue;
}
charMaterials.add(material);
}
MaterialsState _buildInitialState({
String search,
int rarity = 0,
MaterialType type = MaterialType.all,
MaterialFilterType filterType = MaterialFilterType.rarity,
SortDirectionType sortDirectionType = SortDirectionType.asc,
}) {
final isLoaded = state is _LoadedState;
var data = _genshinService.getAllMaterials();

for (final material in weaponMaterialsForDay) {
if (weaponMaterials.any((m) => m.name == material.name)) {
continue;
}
weaponMaterials.add(material);
}
}
if (!isLoaded) {
_sortData(data, filterType, sortDirectionType);
return MaterialsState.loaded(
materials: data,
search: search,
rarity: rarity,
tempRarity: rarity,
type: type,
tempType: type,
filterType: filterType,
tempFilterType: filterType,
sortDirectionType: sortDirectionType,
tempSortDirectionType: sortDirectionType,
);
}

if (search != null && search.isNotEmpty) {
data = data.where((el) => el.name.toLowerCase().contains(search.toLowerCase())).toList();
}

if (rarity > 0) {
data = data.where((el) => el.rarity == rarity).toList();
}

return MaterialsState.loaded(charAscMaterials: charMaterials, weaponAscMaterials: weaponMaterials);
},
if (type != MaterialType.all) {
switch (type) {
case MaterialType.expWeapon:
case MaterialType.expCharacter:
data = data.where((el) => [MaterialType.expWeapon, MaterialType.expCharacter].contains(el.type)).toList();
break;
case MaterialType.weaponPrimary:
case MaterialType.weapon:
data = data.where((el) => [MaterialType.weaponPrimary, MaterialType.weapon].contains(el.type)).toList();
break;
default:
data = data.where((el) => el.type == type).toList();
break;
}
}

_sortData(data, filterType, sortDirectionType);

final s = currentState.copyWith.call(
materials: data,
search: search,
rarity: rarity,
tempRarity: rarity,
type: type,
tempType: type,
filterType: filterType,
tempFilterType: filterType,
sortDirectionType: sortDirectionType,
tempSortDirectionType: sortDirectionType,
);
return s;
}

yield s;
void _sortData(
List<MaterialCardModel> data,
MaterialFilterType filterType,
SortDirectionType sortDirectionType,
) {
switch (filterType) {
case MaterialFilterType.name:
if (sortDirectionType == SortDirectionType.asc) {
data.sort((x, y) => x.name.compareTo(y.name));
} else {
data.sort((x, y) => y.name.compareTo(x.name));
}
break;
case MaterialFilterType.rarity:
if (sortDirectionType == SortDirectionType.asc) {
data.sort((x, y) => x.rarity.compareTo(y.rarity));
} else {
data.sort((x, y) => y.rarity.compareTo(x.rarity));
}
break;
default:
break;
}
}
}
13 changes: 12 additions & 1 deletion lib/application/materials/materials_event.dart
@@ -1,6 +1,17 @@
part of 'materials_bloc.dart';

@freezed
abstract class MaterialsEvent with _$MaterialsEvent {
abstract class MaterialsEvent implements _$MaterialsEvent {
const factory MaterialsEvent.init() = _Init;
const factory MaterialsEvent.searchChanged({
@required String search,
}) = _SearchChanged;

const factory MaterialsEvent.rarityChanged(int rarity) = _RarityChanged;
const factory MaterialsEvent.typeChanged(MaterialType type) = _TypeChanged;
const factory MaterialsEvent.filterTypeChanged(MaterialFilterType type) = _FilterTypeChanged;
const factory MaterialsEvent.applyFilterChanges() = _ApplyFilterChanges;
const factory MaterialsEvent.sortDirectionTypeChanged(SortDirectionType sortDirectionType) = _SortDirectionTypeChanged;

const factory MaterialsEvent.cancelChanges() = _CancelChanges;
}
15 changes: 12 additions & 3 deletions lib/application/materials/materials_state.dart
@@ -1,10 +1,19 @@
part of 'materials_bloc.dart';

@freezed
abstract class MaterialsState with _$MaterialsState {
abstract class MaterialsState implements _$MaterialsState {
const factory MaterialsState.loading() = _LoadingState;

const factory MaterialsState.loaded({
@required List<TodayCharAscensionMaterialsModel> charAscMaterials,
@required List<TodayWeaponAscensionMaterialModel> weaponAscMaterials,
@required List<MaterialCardModel> materials,
String search,
@required int rarity,
@required int tempRarity,
@required MaterialFilterType filterType,
@required MaterialFilterType tempFilterType,
@required MaterialType type,
@required MaterialType tempType,
@required SortDirectionType sortDirectionType,
@required SortDirectionType tempSortDirectionType,
}) = _LoadedState;
}
64 changes: 64 additions & 0 deletions lib/application/today_materials/today_materials_bloc.dart
@@ -0,0 +1,64 @@
import 'dart:async';

import 'package:bloc/bloc.dart';
import 'package:freezed_annotation/freezed_annotation.dart';
import 'package:genshindb/domain/models/models.dart';
import 'package:genshindb/domain/services/genshin_service.dart';
import 'package:genshindb/domain/services/telemetry_service.dart';

part 'today_materials_bloc.freezed.dart';
part 'today_materials_event.dart';
part 'today_materials_state.dart';

class TodayMaterialsBloc extends Bloc<TodayMaterialsEvent, TodayMaterialsState> {
final GenshinService _genshinService;
final TelemetryService _telemetryService;

TodayMaterialsBloc(this._genshinService, this._telemetryService) : super(const TodayMaterialsState.loading());

@override
Stream<TodayMaterialsState> mapEventToState(
TodayMaterialsEvent event,
) async* {
await _telemetryService.trackAscensionMaterialsOpened();
final s = event.when(
init: () {
final days = [
DateTime.monday,
DateTime.tuesday,
DateTime.wednesday,
DateTime.thursday,
DateTime.friday,
DateTime.saturday,
DateTime.sunday,
];

final charMaterials = <TodayCharAscensionMaterialsModel>[];
final weaponMaterials = <TodayWeaponAscensionMaterialModel>[];
//TODO: YOU MAY WANT TO SHOW THE BOSS ITEMS AS WELL
for (final day in days) {
final charMaterialsForDay = _genshinService.getCharacterAscensionMaterials(day);
final weaponMaterialsForDay = _genshinService.getWeaponAscensionMaterials(day);

for (final material in charMaterialsForDay) {
if (charMaterials.any((m) => m.name == material.name)) {
continue;
}
charMaterials.add(material);
}

for (final material in weaponMaterialsForDay) {
if (weaponMaterials.any((m) => m.name == material.name)) {
continue;
}
weaponMaterials.add(material);
}
}

return TodayMaterialsState.loaded(charAscMaterials: charMaterials, weaponAscMaterials: weaponMaterials);
},
);

yield s;
}
}
6 changes: 6 additions & 0 deletions lib/application/today_materials/today_materials_event.dart
@@ -0,0 +1,6 @@
part of 'today_materials_bloc.dart';

@freezed
abstract class TodayMaterialsEvent with _$TodayMaterialsEvent {
const factory TodayMaterialsEvent.init() = _Init;
}
10 changes: 10 additions & 0 deletions lib/application/today_materials/today_materials_state.dart
@@ -0,0 +1,10 @@
part of 'today_materials_bloc.dart';

@freezed
abstract class TodayMaterialsState with _$TodayMaterialsState {
const factory TodayMaterialsState.loading() = _LoadingState;
const factory TodayMaterialsState.loaded({
@required List<TodayCharAscensionMaterialsModel> charAscMaterials,
@required List<TodayWeaponAscensionMaterialModel> weaponAscMaterials,
}) = _LoadedState;
}
1 change: 1 addition & 0 deletions lib/domain/models/db/materials/material_file_model.dart
Expand Up @@ -20,6 +20,7 @@ abstract class MaterialFileModel implements _$MaterialFileModel {

factory MaterialFileModel({
@required String key,
@required int rarity,
@required String image,
@required bool isFromBoss,
@required bool isForCharacters,
Expand Down
4 changes: 3 additions & 1 deletion lib/domain/models/db/materials/materials_file.dart
Expand Up @@ -8,7 +8,8 @@ part 'materials_file.g.dart';
@freezed
abstract class MaterialsFile implements _$MaterialsFile {
@late
List<MaterialFileModel> get materials => talents + weapon + weaponPrimary + common + currency + elemental + jewels + locals + experience;
List<MaterialFileModel> get materials =>
talents + weapon + weaponPrimary + common + currency + elemental + jewels + locals + experience + ingredient;

factory MaterialsFile({
@required List<MaterialFileModel> talents,
Expand All @@ -20,6 +21,7 @@ abstract class MaterialsFile implements _$MaterialsFile {
@required List<MaterialFileModel> jewels,
@required List<MaterialFileModel> locals,
@required List<MaterialFileModel> experience,
@required List<MaterialFileModel> ingredient,
}) = _MaterialsFile;

MaterialsFile._();
Expand Down
18 changes: 18 additions & 0 deletions lib/domain/models/materials/material_card_model.dart
@@ -0,0 +1,18 @@
import 'package:flutter/foundation.dart';
import 'package:genshindb/domain/enums/material_type.dart';

class MaterialCardModel {
final String key;
final String name;
final int rarity;
final String image;
final MaterialType type;

MaterialCardModel({
@required this.key,
@required this.name,
@required this.rarity,
@required this.image,
@required this.type,
});
}
1 change: 1 addition & 0 deletions lib/domain/models/models.dart
Expand Up @@ -34,6 +34,7 @@ export 'home/today_weapon_ascension_material_model.dart';
export 'items/item_ascension_material_model.dart';
export 'items/item_experience_model.dart';
export 'language_model.dart';
export 'materials/material_card_model.dart';
export 'settings/app_settings.dart';
export 'tierlist/tierlist_row_model.dart';
export 'weapons/weapon_card_model.dart';
Expand Down
1 change: 1 addition & 0 deletions lib/domain/services/genshin_service.dart
Expand Up @@ -39,6 +39,7 @@ abstract class GenshinService {
List<ElementReactionCardModel> getElementReactions();
List<ElementReactionCardModel> getElementResonances();

List<MaterialCardModel> getAllMaterials();
MaterialFileModel getMaterialByImage(String image);
List<MaterialFileModel> getMaterials(MaterialType type);

Expand Down

0 comments on commit 833388c

Please sign in to comment.