правки лаунчера

This commit is contained in:
2026-03-22 14:15:50 +04:00
parent 8ed2b692b6
commit 4edfb52396
14 changed files with 533 additions and 54 deletions
@@ -0,0 +1,59 @@
import 'package:moonwell_launcher/features/launcher/data/launcher_api_client.dart';
import 'package:moonwell_launcher/features/launcher/domain/entities/client_manifest.dart';
import 'package:moonwell_launcher/features/launcher/domain/entities/launcher_session.dart';
import 'package:moonwell_launcher/features/preferences/domain/repositories/preferences_repository.dart';
final class RestoreLauncherSessionResult {
final LauncherSession? session;
final ClientManifest? manifest;
const RestoreLauncherSessionResult._({
required this.session,
required this.manifest,
});
const RestoreLauncherSessionResult.unauthenticated()
: this._(session: null, manifest: null);
const RestoreLauncherSessionResult.authenticated({
required LauncherSession session,
required ClientManifest manifest,
}) : this._(session: session, manifest: manifest);
bool get isAuthenticated => session != null && manifest != null;
}
class RestoreLauncherSessionUseCase {
RestoreLauncherSessionUseCase({
required LauncherApiClient launcherApiClient,
required PreferencesRepository preferencesRepository,
}) : _launcherApiClient = launcherApiClient,
_preferencesRepository = preferencesRepository;
final LauncherApiClient _launcherApiClient;
final PreferencesRepository _preferencesRepository;
Future<RestoreLauncherSessionResult> call() async {
final savedSession = await _preferencesRepository.getLauncherSession();
if (savedSession == null || !savedSession.hasAccessToken) {
return const RestoreLauncherSessionResult.unauthenticated();
}
if (savedSession.isExpired) {
await _preferencesRepository.clearLauncherSession();
return const RestoreLauncherSessionResult.unauthenticated();
}
try {
final manifest = await _launcherApiClient.fetchManifest(
savedSession.accessToken,
);
return RestoreLauncherSessionResult.authenticated(
session: savedSession,
manifest: manifest,
);
} catch (_) {
return const RestoreLauncherSessionResult.unauthenticated();
}
}
}
@@ -17,6 +17,25 @@ final class LauncherSession {
);
}
Map<String, dynamic> toJson() {
return <String, dynamic>{
'access_token': accessToken,
'token_type': tokenType,
'expires_at': expiresAt?.toIso8601String(),
};
}
bool get hasAccessToken => accessToken.trim().isNotEmpty;
bool get isExpired {
final expiresAt = this.expiresAt;
if (expiresAt == null) {
return false;
}
return !expiresAt.toUtc().isAfter(DateTime.now().toUtc());
}
static DateTime? _parseDateTime(String? rawValue) {
if (rawValue == null || rawValue.isEmpty) {
return null;