Skip to content

Commit

Permalink
[Application] Added initial donations bloc
Browse files Browse the repository at this point in the history
  • Loading branch information
Wolfteam committed Feb 27, 2022
1 parent 6d5ed56 commit f02e42b
Show file tree
Hide file tree
Showing 5 changed files with 109 additions and 0 deletions.
1 change: 1 addition & 0 deletions lib/application/bloc.dart
Expand Up @@ -12,6 +12,7 @@ export 'character/character_bloc.dart';
export 'characters/characters_bloc.dart';
export 'custom_build/custom_build_bloc.dart';
export 'custom_builds/custom_builds_bloc.dart';
export 'donations/donations_bloc.dart';
export 'elements/elements_bloc.dart';
export 'game_codes/game_codes_bloc.dart';
export 'home/home_bloc.dart';
Expand Down
63 changes: 63 additions & 0 deletions lib/application/donations/donations_bloc.dart
@@ -0,0 +1,63 @@
import 'package:bloc/bloc.dart';
import 'package:freezed_annotation/freezed_annotation.dart';
import 'package:shiori/domain/models/models.dart';
import 'package:shiori/domain/services/network_service.dart';
import 'package:shiori/domain/services/purchase_service.dart';

part 'donations_bloc.freezed.dart';
part 'donations_event.dart';
part 'donations_state.dart';

class DonationsBloc extends Bloc<DonationsEvent, DonationsState> {
final PurchaseService _purchaseService;
final NetworkService _networkService;

static int maxUserIdLength = 20;

DonationsBloc(this._purchaseService, this._networkService) : super(const DonationsState.loading());

@override
Stream<DonationsState> mapEventToState(DonationsEvent event) async* {
if (!await _networkService.isInternetAvailable()) {
yield const DonationsState.initial(packages: [], isInitialized: false, noInternetConnection: true);
return;
}

if (!await _purchaseService.isPlatformSupported()) {
yield const DonationsState.initial(packages: [], isInitialized: false, noInternetConnection: false);
return;
}

if (!_purchaseService.isInitialized) {
await _purchaseService.init();
}

final currentState = state;
final s = await event.map(
init: (_) => _init(),
restorePurchases: (e) => _restorePurchases(e.userId),
purchase: (e) => _purchase(e),
);

yield s;

if ((s is _PurchaseCompleted && s.error) || (s is _RestoreCompleted && s.error)) {
yield currentState;
}
}

Future<DonationsState> _init() async {
final packages = await _purchaseService.getInAppPurchases();
return DonationsState.initial(packages: packages, isInitialized: _purchaseService.isInitialized, noInternetConnection: false);
}

Future<DonationsState> _restorePurchases(String userId) async {
final restored = await _purchaseService.restorePurchases(userId);
return DonationsState.restoreCompleted(error: !restored);
}

Future<DonationsState> _purchase(_Purchase e) async {
final succeed = await _purchaseService.purchase(e.userId, e.identifier, e.offeringIdentifier);
return DonationsState.purchaseCompleted(error: !succeed);
}
}
14 changes: 14 additions & 0 deletions lib/application/donations/donations_event.dart
@@ -0,0 +1,14 @@
part of 'donations_bloc.dart';

@freezed
class DonationsEvent with _$DonationsEvent {
const factory DonationsEvent.init() = _Init;

const factory DonationsEvent.restorePurchases({required String userId}) = _RestorePurchases;

const factory DonationsEvent.purchase({
required String userId,
required String identifier,
required String offeringIdentifier,
}) = _Purchase;
}
20 changes: 20 additions & 0 deletions lib/application/donations/donations_state.dart
@@ -0,0 +1,20 @@
part of 'donations_bloc.dart';

@freezed
class DonationsState with _$DonationsState {
const factory DonationsState.loading() = _Loading;

const factory DonationsState.initial({
required List<PackageItemModel> packages,
required bool isInitialized,
required bool noInternetConnection,
}) = _InitialState;

const factory DonationsState.purchaseCompleted({
required bool error,
}) = _PurchaseCompleted;

const factory DonationsState.restoreCompleted({
required bool error,
}) = _RestoreCompleted;
}
11 changes: 11 additions & 0 deletions lib/injection.dart
Expand Up @@ -10,6 +10,7 @@ import 'package:shiori/domain/services/locale_service.dart';
import 'package:shiori/domain/services/logging_service.dart';
import 'package:shiori/domain/services/network_service.dart';
import 'package:shiori/domain/services/notification_service.dart';
import 'package:shiori/domain/services/purchase_service.dart';
import 'package:shiori/domain/services/settings_service.dart';
import 'package:shiori/domain/services/telemetry_service.dart';
import 'package:shiori/infrastructure/infrastructure.dart';
Expand Down Expand Up @@ -136,6 +137,12 @@ class Injection {
return CustomBuildsBloc(dataService);
}

static DonationsBloc get donationsBloc {
final purchaseService = getIt<PurchaseService>();
final networkService = getIt<NetworkService>();
return DonationsBloc(purchaseService, networkService);
}

//TODO: USE THIS PROP
// static CalculatorAscMaterialsItemBloc get calculatorAscMaterialsItemBloc {
// final genshinService = getIt<GenshinService>();
Expand Down Expand Up @@ -215,5 +222,9 @@ class Injection {

final changelogProvider = ChangelogProviderImpl(loggingService, networkService);
getIt.registerSingleton<ChangelogProvider>(changelogProvider);

final purchaseService = PurchaseServiceImpl(loggingService);
await purchaseService.init();
getIt.registerSingleton<PurchaseService>(purchaseService);
}
}

0 comments on commit f02e42b

Please sign in to comment.