Skip to content

Commit

Permalink
We are now showing the character's birthday
Browse files Browse the repository at this point in the history
  • Loading branch information
Wolfteam committed Feb 2, 2021
1 parent d7b0bcf commit dc52d21
Show file tree
Hide file tree
Showing 35 changed files with 309 additions and 75 deletions.
5 changes: 4 additions & 1 deletion lib/application/character/character_bloc.dart
Expand Up @@ -6,6 +6,7 @@ import 'package:genshindb/domain/assets.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/locale_service.dart';
import 'package:genshindb/domain/services/telemetry_service.dart';

part 'character_bloc.freezed.dart';
Expand All @@ -15,8 +16,9 @@ part 'character_state.dart';
class CharacterBloc extends Bloc<CharacterEvent, CharacterState> {
final GenshinService _genshinService;
final TelemetryService _telemetryService;
final LocaleService _localeService;

CharacterBloc(this._genshinService, this._telemetryService) : super(const CharacterState.loading());
CharacterBloc(this._genshinService, this._telemetryService, this._localeService) : super(const CharacterState.loading());

@override
Stream<CharacterState> mapEventToState(
Expand Down Expand Up @@ -52,6 +54,7 @@ class CharacterBloc extends Bloc<CharacterEvent, CharacterState> {
secondFullImage: char.secondFullImage != null ? Assets.getCharacterFullPath(char.secondFullImage) : null,
description: translation.description,
rarity: char.rarity,
birthday: _localeService.formatCharBirthDate(char.birthday),
elementType: char.elementType,
weaponType: char.weaponType,
ascensionMaterials: char.ascensionMaterials,
Expand Down
1 change: 1 addition & 0 deletions lib/application/character/character_state.dart
Expand Up @@ -14,6 +14,7 @@ abstract class CharacterState with _$CharacterState {
@required RegionType region,
@required CharacterType role,
@required bool isFemale,
String birthday,
@required List<CharacterFileAscensionMaterialModel> ascensionMaterials,
@required List<CharacterFileTalentAscensionMaterialModel> talentAscensionsMaterials,
List<CharacterFileMultiTalentAscensionMaterialModel> multiTalentAscensionMaterials,
Expand Down
5 changes: 4 additions & 1 deletion lib/application/home/home_bloc.dart
Expand Up @@ -2,6 +2,7 @@ import 'dart:async';

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

Expand All @@ -11,6 +12,7 @@ part 'home_state.dart';

class HomeBloc extends Bloc<HomeEvent, HomeState> {
final GenshinService _genshinService;

HomeBloc(this._genshinService) : super(const HomeState.loading());

@override
Expand All @@ -22,8 +24,9 @@ class HomeBloc extends Bloc<HomeEvent, HomeState> {
final day = DateTime.now().weekday;
final charMaterials = _genshinService.getCharacterAscensionMaterials(day);
final weaponMaterials = _genshinService.getWeaponAscensionMaterials(day);
final charsForBirthday = _genshinService.getCharactersForBirthday(DateTime.now()).map((e) => Assets.getCharacterPath(e.image)).toList();

return HomeState.loaded(charAscMaterials: charMaterials, weaponAscMaterials: weaponMaterials);
return HomeState.loaded(charAscMaterials: charMaterials, weaponAscMaterials: weaponMaterials, characterImgBirthday: charsForBirthday);
},
);

Expand Down
1 change: 1 addition & 0 deletions lib/application/home/home_state.dart
Expand Up @@ -6,5 +6,6 @@ abstract class HomeState with _$HomeState {
const factory HomeState.loaded({
@required List<TodayCharAscensionMaterialsModel> charAscMaterials,
@required List<TodayWeaponAscensionMaterialModel> weaponAscMaterials,
@Default([]) List<String> characterImgBirthday,
}) = _LoadedState;
}
21 changes: 12 additions & 9 deletions lib/application/main/main_bloc.dart
Expand Up @@ -4,7 +4,9 @@ import 'package:bloc/bloc.dart';
import 'package:freezed_annotation/freezed_annotation.dart';
import 'package:genshindb/application/utils/app_path_utils.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/locale_service.dart';
import 'package:genshindb/domain/services/logging_service.dart';
import 'package:genshindb/domain/services/settings_service.dart';
import 'package:package_info/package_info.dart';
Expand All @@ -19,6 +21,7 @@ class MainBloc extends Bloc<MainEvent, MainState> {
final LoggingService _logger;
final GenshinService _genshinService;
final SettingsService _settingsService;
final LocaleService _localeService;

final CharactersBloc _charactersBloc;
final WeaponsBloc _weaponsBloc;
Expand All @@ -29,6 +32,7 @@ class MainBloc extends Bloc<MainEvent, MainState> {
this._logger,
this._genshinService,
this._settingsService,
this._localeService,
this._charactersBloc,
this._weaponsBloc,
this._homeBloc,
Expand All @@ -43,13 +47,13 @@ class MainBloc extends Bloc<MainEvent, MainState> {
) async* {
final s = await event.when(
init: () async {
return _init();
return _init(init: true);
},
themeChanged: (theme) async {
return _loadThemeData(currentState.appTitle, theme, _settingsService.accentColor, _settingsService.language);
return _loadThemeData(currentState.appTitle, theme, _settingsService.accentColor);
},
accentColorChanged: (accentColor) async {
return _loadThemeData(currentState.appTitle, _settingsService.appTheme, accentColor, _settingsService.language);
return _loadThemeData(currentState.appTitle, _settingsService.appTheme, accentColor);
},
languageChanged: (language) async {
return _init(languageChanged: true);
Expand All @@ -59,7 +63,7 @@ class MainBloc extends Bloc<MainEvent, MainState> {
yield s;
}

Future<MainState> _init({bool languageChanged = false}) async {
Future<MainState> _init({bool languageChanged = false, bool init = false}) async {
_logger.info(runtimeType, '_init: Initializing all..');
await _settingsService.init();

Expand All @@ -81,26 +85,25 @@ class MainBloc extends Bloc<MainEvent, MainState> {

final packageInfo = await PackageInfo.fromPlatform();
final settings = _settingsService.appSettings;
if (!languageChanged) {
if (init) {
await Future.delayed(const Duration(milliseconds: 600));
}

return _loadThemeData(packageInfo.appName, settings.appTheme, settings.accentColor, settings.appLanguage);
return _loadThemeData(packageInfo.appName, settings.appTheme, settings.accentColor);
}

Future<MainState> _loadThemeData(
String appTitle,
AppThemeType theme,
AppAccentColorType accentColor,
AppLanguageType language, {
AppAccentColorType accentColor, {
bool isInitialized = true,
}) async {
_logger.info(runtimeType, '_init: Is first install = ${_settingsService.isFirstInstall}');

return MainState.loaded(
appTitle: appTitle,
accentColor: accentColor,
currentLanguage: language,
language: _localeService.getLocaleWithoutLang(),
initialized: isInitialized,
theme: theme,
firstInstall: _settingsService.isFirstInstall,
Expand Down
2 changes: 1 addition & 1 deletion lib/application/main/main_state.dart
Expand Up @@ -7,7 +7,7 @@ abstract class MainState with _$MainState {
@required String appTitle,
@required AppThemeType theme,
@required AppAccentColorType accentColor,
@required AppLanguageType currentLanguage,
@required LanguageModel language,
@required bool initialized,
@required bool firstInstall,
}) = _MainLoadedState;
Expand Down
1 change: 1 addition & 0 deletions lib/domain/models/db/characters/character_file_model.dart
Expand Up @@ -29,6 +29,7 @@ abstract class CharacterFileModel implements _$CharacterFileModel {
@required bool isComingSoon,
@required bool isNew,
@required CharacterType role,
String birthday,
@required List<CharacterFileAscensionMaterialModel> ascensionMaterials,
@required List<CharacterFileTalentAscensionMaterialModel> talentAscensionMaterials,
List<CharacterFileMultiTalentAscensionMaterialModel> multiTalentAscensionMaterials,
Expand Down
8 changes: 8 additions & 0 deletions lib/domain/models/language_model.dart
@@ -0,0 +1,8 @@
class LanguageModel {
final String code;
final String countryCode;

LanguageModel(this.code, this.countryCode)
: assert(code != null),
assert(countryCode != null);
}
1 change: 1 addition & 0 deletions lib/domain/models/models.dart
Expand Up @@ -31,6 +31,7 @@ export 'elements/element_reaction_card_model.dart';
export 'home/today_char_ascension_materials_model.dart';
export 'home/today_weapon_ascension_material_model.dart';
export 'items/item_ascension_material_model.dart';
export 'language_model.dart';
export 'settings/app_settings.dart';
export 'weapons/weapon_card_model.dart';
export 'weapons/weapon_file_refinement_model.dart';
1 change: 1 addition & 0 deletions lib/domain/services/genshin_service.dart
Expand Up @@ -13,6 +13,7 @@ abstract class GenshinService {
List<CharacterCardModel> getCharactersForCard();
CharacterFileModel getCharacter(String key);
CharacterFileModel getCharacterByImg(String img);
List<CharacterFileModel> getCharactersForBirthday(DateTime date);

List<WeaponCardModel> getWeaponsForCard();
WeaponCardModel getWeaponForCardByImg(String image);
Expand Down
14 changes: 14 additions & 0 deletions lib/domain/services/locale_service.dart
@@ -0,0 +1,14 @@
import 'package:genshindb/domain/enums/enums.dart';
import 'package:genshindb/domain/models/models.dart';

abstract class LocaleService {
LanguageModel getLocaleWithoutLang();

LanguageModel getLocale(AppLanguageType language);

String getFormattedLocale(AppLanguageType language);

DateTime getCharBirthDate(String birthday);

String formatCharBirthDate(String birthday);
}
1 change: 1 addition & 0 deletions lib/generated/intl/messages_en.dart
Expand Up @@ -78,6 +78,7 @@ class MessageLookup extends MessageLookupByLibrary {
"atk" : m1,
"atkPercentage" : m2,
"baseAtk" : MessageLookupByLibrary.simpleMessage("Base ATK"),
"birthday" : MessageLookupByLibrary.simpleMessage("Birthday"),
"bonus" : MessageLookupByLibrary.simpleMessage("Bonus"),
"boss" : MessageLookupByLibrary.simpleMessage("Boss"),
"bow" : MessageLookupByLibrary.simpleMessage("Bow"),
Expand Down
1 change: 1 addition & 0 deletions lib/generated/intl/messages_es_ES.dart
Expand Up @@ -78,6 +78,7 @@ class MessageLookup extends MessageLookupByLibrary {
"atk" : m1,
"atkPercentage" : m2,
"baseAtk" : MessageLookupByLibrary.simpleMessage("ATQ Base"),
"birthday" : MessageLookupByLibrary.simpleMessage("Cumpleaños"),
"bonus" : MessageLookupByLibrary.simpleMessage("Bonos"),
"boss" : MessageLookupByLibrary.simpleMessage("Jefe"),
"bow" : MessageLookupByLibrary.simpleMessage("Arco"),
Expand Down
10 changes: 10 additions & 0 deletions lib/generated/l10n.dart

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

18 changes: 18 additions & 0 deletions lib/infrastructure/genshin_service.dart
Expand Up @@ -3,17 +3,23 @@ import 'dart:convert';
import 'package:flutter/services.dart' show rootBundle;
import 'package:genshindb/domain/assets.dart';
import 'package:genshindb/domain/enums/enums.dart';
import 'package:genshindb/domain/extensions/string_extensions.dart';
import 'package:genshindb/domain/models/models.dart';
import 'package:genshindb/domain/services/genshin_service.dart';
import 'package:genshindb/domain/services/locale_service.dart';

class GenshinServiceImpl implements GenshinService {
final LocaleService _localeService;

CharactersFile _charactersFile;
WeaponsFile _weaponsFile;
TranslationFile _translationFile;
ArtifactsFile _artifactsFile;
MaterialsFile _materialsFile;
ElementsFile _elementsFile;

GenshinServiceImpl(this._localeService);

@override
Future<void> init(AppLanguageType languageType) async {
await Future.wait([initCharacters(), initWeapons(), initArtifacts(), initMaterials(), initElements(), initTranslations(languageType)]);
Expand Down Expand Up @@ -112,6 +118,18 @@ class GenshinServiceImpl implements GenshinService {
return _charactersFile.characters.firstWhere((element) => Assets.getCharacterPath(element.image) == img);
}

@override
List<CharacterFileModel> getCharactersForBirthday(DateTime date) {
return _charactersFile.characters.where((char) {
if (char.birthday.isNullEmptyOrWhitespace) {
return false;
}

final charBirthday = _localeService.getCharBirthDate(char.birthday);
return charBirthday.day == date.day && charBirthday.month == date.month;
}).toList();
}

@override
List<WeaponCardModel> getWeaponsForCard() {
return _weaponsFile.weapons.map(
Expand Down
63 changes: 63 additions & 0 deletions lib/infrastructure/locale_service.dart
@@ -0,0 +1,63 @@
import 'package:genshindb/domain/enums/enums.dart';
import 'package:genshindb/domain/extensions/string_extensions.dart';
import 'package:genshindb/domain/models/models.dart';
import 'package:genshindb/domain/services/locale_service.dart';
import 'package:genshindb/domain/services/settings_service.dart';
import 'package:intl/intl.dart';

class LocaleServiceImpl implements LocaleService {
final SettingsService _settingsService;

LocaleServiceImpl(this._settingsService);

@override
DateTime getCharBirthDate(String birthday) {
if (birthday.isNullEmptyOrWhitespace) {
throw Exception('Character birthday must not be null');
}
final locale = getFormattedLocale(_settingsService.language);
final format = DateFormat('MM/dd', locale);
return format.parse(birthday);
}

@override
String formatCharBirthDate(String birthday) {
if (birthday.isNullEmptyOrWhitespace) {
return '';
}
final locale = getFormattedLocale(_settingsService.language);
final birthdayDate = getCharBirthDate(birthday);
return toBeginningOfSentenceCase(DateFormat('MMMM d', locale).format(birthdayDate));
}

@override
String getFormattedLocale(AppLanguageType language) {
final locale = getLocale(language);
return '${locale.code}_${locale.countryCode}';
}

@override
LanguageModel getLocaleWithoutLang() {
return getLocale(_settingsService.language);
}

@override
LanguageModel getLocale(AppLanguageType language) {
var langCode = 'en';
var countryCode = 'US';
switch (language) {
case AppLanguageType.spanish:
langCode = 'es';
countryCode = 'ES';
break;
case AppLanguageType.french:
langCode = 'fr';
countryCode = 'FR';
break;
default:
break;
}

return LanguageModel(langCode, countryCode);
}
}
9 changes: 7 additions & 2 deletions lib/injection.dart
@@ -1,9 +1,11 @@
import 'package:genshindb/domain/services/genshin_service.dart';
import 'package:genshindb/domain/services/locale_service.dart';
import 'package:genshindb/domain/services/logging_service.dart';
import 'package:genshindb/domain/services/network_service.dart';
import 'package:genshindb/domain/services/settings_service.dart';
import 'package:genshindb/domain/services/telemetry_service.dart';
import 'package:genshindb/infrastructure/genshin_service.dart';
import 'package:genshindb/infrastructure/locale_service.dart';
import 'package:genshindb/infrastructure/logging_service.dart';
import 'package:genshindb/infrastructure/network_service.dart';
import 'package:genshindb/infrastructure/settings_service.dart';
Expand All @@ -15,11 +17,14 @@ final GetIt getIt = GetIt.instance;

Future<void> initInjection() async {
getIt.registerSingleton(Logger());
getIt.registerSingleton<NetworkService>(NetworkServiceImpl());

final telemetryService = TelemetryServiceImpl();
getIt.registerSingleton<TelemetryService>(telemetryService);
await telemetryService.initTelemetry();
getIt.registerSingleton<GenshinService>(GenshinServiceImpl());

getIt.registerSingleton<LoggingService>(LoggingServiceImpl(getIt<Logger>(), getIt<TelemetryService>()));
getIt.registerSingleton<SettingsService>(SettingsServiceImpl(getIt<LoggingService>()));
getIt.registerSingleton<NetworkService>(NetworkServiceImpl());
getIt.registerSingleton<LocaleService>(LocaleServiceImpl(getIt<SettingsService>()));
getIt.registerSingleton<GenshinService>(GenshinServiceImpl(getIt<LocaleService>()));
}
1 change: 1 addition & 0 deletions lib/l10n/intl_en.arb
Expand Up @@ -178,6 +178,7 @@
"boss": "Boss",
"day": "Day",
"currency": "Currency",
"birthday": "Birthday",
"todayBirthdays": "Today's Birthdays",
"happyBirthday": "Happy Birthday!"
}
1 change: 1 addition & 0 deletions lib/l10n/intl_es_ES.arb
Expand Up @@ -177,6 +177,7 @@
"boss": "Jefe",
"day": "Día",
"currency": "Moneda",
"birthday": "Cumpleaños",
"todayBirthdays": "Los Cumpleaños de Hoy",
"happyBirthday": "¡Feliz Cumpleaños!"
}

0 comments on commit dc52d21

Please sign in to comment.