96 lines
3.3 KiB
Dart
96 lines
3.3 KiB
Dart
import 'package:flutter_bloc/flutter_bloc.dart';
|
|
import 'package:minecraft_server_installer/main/adapter/presenter/installation_state.dart';
|
|
import 'package:minecraft_server_installer/main/adapter/presenter/progress_view_model.dart';
|
|
import 'package:minecraft_server_installer/main/adapter/presenter/range_view_model.dart';
|
|
import 'package:minecraft_server_installer/main/application/use_case/install_server_use_case.dart';
|
|
import 'package:minecraft_server_installer/properties/adapter/presenter/server_properties_view_model.dart';
|
|
import 'package:minecraft_server_installer/vanilla/adapter/presenter/game_version_view_model.dart';
|
|
|
|
class InstallationBloc extends Bloc<InstallationEvent, InstallationState> {
|
|
InstallationBloc(
|
|
InstallServerUseCase installServerUseCase,
|
|
) : super(const InstallationState.empty()) {
|
|
on<InstallationStartedEvent>((event, emit) async {
|
|
if (!state.canStartToInstall) {
|
|
return;
|
|
}
|
|
|
|
emit(state.copyWith(isLocked: true, downloadProgress: const ProgressViewModel.start()));
|
|
|
|
await installServerUseCase(
|
|
gameVersion: state.gameVersion!.toEntity(),
|
|
savePath: state.savePath!,
|
|
maxRam: state.ramSize.max,
|
|
minRam: state.ramSize.min,
|
|
isGuiEnabled: state.isGuiEnabled,
|
|
serverProperties: event.serverProperties.toEntity(),
|
|
onProgressChanged: (progressValue) => add(_InstallationProgressValueChangedEvent(progressValue)),
|
|
);
|
|
|
|
emit(state.copyWith(isLocked: false, downloadProgress: const ProgressViewModel.complete()));
|
|
});
|
|
|
|
on<_InstallationProgressValueChangedEvent>((event, emit) {
|
|
ProgressViewModel newProgress;
|
|
|
|
if (event.progressValue < 0) {
|
|
newProgress = state.downloadProgress.copyWith(value: 0.0);
|
|
} else if (event.progressValue > 1) {
|
|
newProgress = state.downloadProgress.copyWith(value: 1.0);
|
|
} else {
|
|
newProgress = state.downloadProgress.copyWith(value: event.progressValue);
|
|
}
|
|
|
|
emit(state.copyWith(downloadProgress: newProgress));
|
|
});
|
|
|
|
on<InstallationConfigurationUpdatedEvent>((event, emit) {
|
|
if (event.customRamSize != null && !event.customRamSize!.isValid) {
|
|
return;
|
|
}
|
|
|
|
final newState = state.copyWith(
|
|
gameVersion: event.gameVersion,
|
|
savePath: event.savePath,
|
|
isEulaAgreed: event.isEulaAgreed,
|
|
isGuiEnabled: event.isGuiEnabled,
|
|
isCustomRamSizeEnabled: event.isCustomRamSizeEnabled,
|
|
customRamSize: event.customRamSize,
|
|
);
|
|
emit(newState);
|
|
});
|
|
}
|
|
}
|
|
|
|
sealed class InstallationEvent {}
|
|
|
|
class InstallationStartedEvent extends InstallationEvent {
|
|
final ServerPropertiesViewModel serverProperties;
|
|
|
|
InstallationStartedEvent(this.serverProperties);
|
|
}
|
|
|
|
class _InstallationProgressValueChangedEvent extends InstallationEvent {
|
|
final double progressValue;
|
|
|
|
_InstallationProgressValueChangedEvent(this.progressValue);
|
|
}
|
|
|
|
class InstallationConfigurationUpdatedEvent extends InstallationEvent {
|
|
final GameVersionViewModel? gameVersion;
|
|
final String? savePath;
|
|
final bool? isEulaAgreed;
|
|
final bool? isGuiEnabled;
|
|
final bool? isCustomRamSizeEnabled;
|
|
final RangeViewModel? customRamSize;
|
|
|
|
InstallationConfigurationUpdatedEvent({
|
|
this.gameVersion,
|
|
this.savePath,
|
|
this.isEulaAgreed,
|
|
this.isGuiEnabled,
|
|
this.isCustomRamSizeEnabled,
|
|
this.customRamSize,
|
|
});
|
|
}
|