Initial commit

This commit is contained in:
gasaichandesu
2025-08-30 19:47:42 +04:00
commit 58d7808a8d
100 changed files with 6186 additions and 0 deletions
@@ -0,0 +1,114 @@
import 'dart:async';
import 'package:file_picker/file_picker.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:moonwell_launcher/app/home_screen/bloc/home_screen_model.dart';
import 'package:moonwell_launcher/features/downloader/application/download_manager.dart';
import 'package:moonwell_launcher/features/downloader/domain/entities/download_progress.dart';
import 'package:moonwell_launcher/features/downloader/domain/entities/download_request.dart';
import 'package:moonwell_launcher/features/preferences/domain/repositories/preferences_repository.dart';
import 'package:rxdart/rxdart.dart';
part 'home_screen_event.dart';
part 'home_screen_state.dart';
const _downloadId = 'client';
class HomeScreenBloc extends Bloc<HomeScreenEvent, HomeScreenState> {
final DownloadManager _downloadManager;
final PreferencesRepository _preferencesRepository;
StreamSubscription<DownloadProgress>? _downloadProgressSubscription;
HomeScreenBloc({
required DownloadManager downloadManager,
required PreferencesRepository preferencesRepository,
}) : _downloadManager = downloadManager,
_preferencesRepository = preferencesRepository,
super(HomeScreenInitialState(model: HomeScreenModel.initial())) {
_setupHandlers();
add(HomeScreenLoad());
}
void _setupHandlers() {
on<HomeScreenLoad>(_onHomeScreenLoad);
on<HomeScreenDownloadRequested>(_onHomeScreenDownloadRequested);
on<HomeScreenDownloadPaused>((event, emit) {
// _downloadManager.pauseDownload();
// emit(HomeScreenDownloadPausedState());
});
on<HomeScreenDownloadProgressUpdated>(
_onHomeScreenDownloadProgressUpdated,
transformer: (events, mapper) =>
events.throttleTime(const Duration(seconds: 2)).switchMap(mapper),
);
}
Future<void> _onHomeScreenLoad(
HomeScreenLoad event,
Emitter<HomeScreenState> emit,
) async {
final outputDir = await _preferencesRepository.getOutputDir();
emit(
HomeScreenReadyToDownloadState(
model: state.model.copyWith(outputPath: outputDir),
),
);
}
Future<void> _onHomeScreenDownloadRequested(
HomeScreenDownloadRequested event,
Emitter<HomeScreenState> emit,
) async {
if (state.model.outputPath == null) {
final directory = await FilePicker.platform.getDirectoryPath(
dialogTitle: 'Please select installation directory',
);
if (directory == null) {
return;
}
await _preferencesRepository.setOutputDir(Uri.directory(directory));
emit(
HomeScreenReadyToDownloadState(
model: state.model.copyWith(outputPath: Uri.directory(directory)),
),
);
}
_downloadProgressSubscription = _downloadManager
.start(
id: _downloadId,
request: DownloadRequest(
destinationPath: state.model.outputPath!.toFilePath(),
),
)
.listen((progress) => add(HomeScreenDownloadProgressUpdated(progress)));
}
void _onHomeScreenDownloadProgressUpdated(
HomeScreenDownloadProgressUpdated event,
Emitter<HomeScreenState> emit,
) {
emit(
HomeScreenDownloadingState(
model: state.model.copyWith(progress: event.progress),
),
);
}
@override
Future<void> close() async {
await _downloadProgressSubscription?.cancel();
await _downloadManager.cancel(_downloadId);
return super.close();
}
}
@@ -0,0 +1,16 @@
part of 'home_screen_bloc.dart';
@immutable
sealed class HomeScreenEvent {}
final class HomeScreenLoad extends HomeScreenEvent {}
final class HomeScreenDownloadRequested extends HomeScreenEvent {}
final class HomeScreenDownloadPaused extends HomeScreenEvent {}
final class HomeScreenDownloadProgressUpdated extends HomeScreenEvent {
final DownloadProgress progress;
HomeScreenDownloadProgressUpdated(this.progress);
}
@@ -0,0 +1,24 @@
import 'package:flutter/foundation.dart';
import 'package:moonwell_launcher/features/downloader/domain/entities/download_progress.dart';
@immutable
final class HomeScreenModel {
/// The current download progress.
final DownloadProgress progress;
/// The output path for the downloaded file.
final Uri? outputPath;
const HomeScreenModel({required this.progress, this.outputPath});
const HomeScreenModel.initial()
: progress = const DownloadProgress.initial(),
outputPath = null;
HomeScreenModel copyWith({DownloadProgress? progress, Uri? outputPath}) {
return HomeScreenModel(
progress: progress ?? this.progress,
outputPath: outputPath ?? this.outputPath,
);
}
}
@@ -0,0 +1,24 @@
part of 'home_screen_bloc.dart';
@immutable
sealed class HomeScreenState {
final HomeScreenModel model;
const HomeScreenState({required this.model});
}
final class HomeScreenInitialState extends HomeScreenState {
const HomeScreenInitialState({required super.model});
}
final class HomeScreenReadyToDownloadState extends HomeScreenState {
const HomeScreenReadyToDownloadState({required super.model});
}
final class HomeScreenDownloadPausedState extends HomeScreenState {
const HomeScreenDownloadPausedState({required super.model});
}
final class HomeScreenDownloadingState extends HomeScreenState {
const HomeScreenDownloadingState({required super.model});
}