Files
moonwell-launcher/lib/app/home_screen/bloc/home_screen_model.dart
T

134 lines
4.1 KiB
Dart

import 'package:flutter/foundation.dart';
import 'package:moonwell_launcher/features/downloader/domain/entities/download_progress.dart';
import 'package:moonwell_launcher/features/launcher/domain/entities/client_sync_status.dart';
import 'package:moonwell_launcher/features/launcher/domain/entities/launcher_news_item.dart';
enum HomeScreenPhase {
idle,
ready,
authenticating,
syncing,
paused,
readyToPlay,
failure,
}
@immutable
final class HomeScreenModel {
static const Object _sentinel = Object();
final DownloadProgress progress;
final Uri? outputPath;
final HomeScreenPhase phase;
final bool isAuthenticated;
final bool hasClientExecutable;
final String statusText;
final String? currentPath;
final String? errorMessage;
final String? localBuildHash;
final String? remoteBuildHash;
final int processedFiles;
final int totalFiles;
final List<LauncherNewsItem> newsItems;
final bool isLoadingNews;
final String? newsErrorMessage;
final ClientSyncStage? syncStage;
const HomeScreenModel({
required this.progress,
required this.outputPath,
required this.phase,
required this.isAuthenticated,
required this.hasClientExecutable,
required this.statusText,
required this.currentPath,
required this.errorMessage,
required this.localBuildHash,
required this.remoteBuildHash,
required this.processedFiles,
required this.totalFiles,
required this.newsItems,
required this.isLoadingNews,
required this.newsErrorMessage,
required this.syncStage,
});
const HomeScreenModel.initial()
: progress = const DownloadProgress.initial(),
outputPath = null,
phase = HomeScreenPhase.idle,
isAuthenticated = false,
hasClientExecutable = false,
statusText = 'Загрузка...',
currentPath = null,
errorMessage = null,
localBuildHash = null,
remoteBuildHash = null,
processedFiles = 0,
totalFiles = 0,
newsItems = const <LauncherNewsItem>[],
isLoadingNews = true,
newsErrorMessage = null,
syncStage = null;
bool get isBusy =>
phase == HomeScreenPhase.authenticating ||
phase == HomeScreenPhase.syncing;
bool get isSyncing => phase == HomeScreenPhase.syncing;
bool get canPlay => hasClientExecutable && !isBusy;
HomeScreenModel copyWith({
DownloadProgress? progress,
Object? outputPath = _sentinel,
HomeScreenPhase? phase,
bool? isAuthenticated,
bool? hasClientExecutable,
String? statusText,
Object? currentPath = _sentinel,
Object? errorMessage = _sentinel,
Object? localBuildHash = _sentinel,
Object? remoteBuildHash = _sentinel,
int? processedFiles,
int? totalFiles,
List<LauncherNewsItem>? newsItems,
bool? isLoadingNews,
Object? newsErrorMessage = _sentinel,
Object? syncStage = _sentinel,
}) {
return HomeScreenModel(
progress: progress ?? this.progress,
outputPath: outputPath == _sentinel
? this.outputPath
: outputPath as Uri?,
phase: phase ?? this.phase,
isAuthenticated: isAuthenticated ?? this.isAuthenticated,
hasClientExecutable: hasClientExecutable ?? this.hasClientExecutable,
statusText: statusText ?? this.statusText,
currentPath: currentPath == _sentinel
? this.currentPath
: currentPath as String?,
errorMessage: errorMessage == _sentinel
? this.errorMessage
: errorMessage as String?,
localBuildHash: localBuildHash == _sentinel
? this.localBuildHash
: localBuildHash as String?,
remoteBuildHash: remoteBuildHash == _sentinel
? this.remoteBuildHash
: remoteBuildHash as String?,
processedFiles: processedFiles ?? this.processedFiles,
totalFiles: totalFiles ?? this.totalFiles,
newsItems: newsItems ?? this.newsItems,
isLoadingNews: isLoadingNews ?? this.isLoadingNews,
newsErrorMessage: newsErrorMessage == _sentinel
? this.newsErrorMessage
: newsErrorMessage as String?,
syncStage: syncStage == _sentinel
? this.syncStage
: syncStage as ClientSyncStage?,
);
}
}