Приложение на флаторе, настройки

This commit is contained in:
Халимов Рустам
2026-05-13 17:21:37 +03:00
parent 89e325556c
commit e8161d23d4
119 changed files with 18469 additions and 0 deletions
@@ -0,0 +1,57 @@
import 'dart:convert';
import 'package:shared_preferences/shared_preferences.dart';
import '../../../../core/constants/storage_keys.dart';
import '../../domain/entities/server_config.dart';
abstract class SettingsLocalDataSource {
Future<String?> getApiUrl();
Future<void> saveApiUrl(String url);
Future<String?> getLanguageCode();
Future<void> saveLanguageCode(String code);
Future<ServerConfig?> getServerConfig();
Future<void> saveServerConfig(ServerConfig config);
}
class SettingsLocalDataSourceImpl implements SettingsLocalDataSource {
final SharedPreferences _prefs;
SettingsLocalDataSourceImpl(this._prefs);
@override
Future<String?> getApiUrl() async {
return _prefs.getString(StorageKeys.apiUrl);
}
@override
Future<void> saveApiUrl(String url) async {
await _prefs.setString(StorageKeys.apiUrl, url);
}
@override
Future<String?> getLanguageCode() async {
return _prefs.getString(StorageKeys.languageCode);
}
@override
Future<void> saveLanguageCode(String code) async {
await _prefs.setString(StorageKeys.languageCode, code);
}
@override
Future<ServerConfig?> getServerConfig() async {
final jsonString = _prefs.getString(StorageKeys.serverConfig);
if (jsonString == null) return null;
try {
final json = jsonDecode(jsonString) as Map<String, dynamic>;
return ServerConfig.fromJson(json);
} catch (_) {
return null;
}
}
@override
Future<void> saveServerConfig(ServerConfig config) async {
final jsonString = jsonEncode(config.toJson());
await _prefs.setString(StorageKeys.serverConfig, jsonString);
}
}
@@ -0,0 +1,30 @@
import 'package:dio/dio.dart';
import '../../../../core/errors/errors.dart';
import '../../../../core/errors/result.dart';
import '../../domain/entities/server_config.dart';
abstract class SettingsRemoteDataSource {
Future<Result<ServerConfig>> getServerConfig();
}
class SettingsRemoteDataSourceImpl implements SettingsRemoteDataSource {
final Dio _dio;
SettingsRemoteDataSourceImpl(this._dio);
@override
Future<Result<ServerConfig>> getServerConfig() async {
try {
final response = await _dio.get('/api/config');
if (response.statusCode == 200) {
final config = ServerConfig.fromJson(response.data as Map<String, dynamic>);
return Result.success(config);
}
return Result.failure(AppError.server(statusCode: 500, message: 'Failed to load config'));
} on DioException catch (e) {
return Result.failure(AppError.network(message: e.message));
} catch (e) {
return Result.failure(const AppError.unknown(message: 'Unknown error'));
}
}
}
@@ -0,0 +1,83 @@
import '../../../../core/errors/errors.dart';
import '../../../../core/errors/result.dart';
import '../../domain/entities/server_config.dart';
import '../../domain/repositories/settings_repository.dart';
import '../datasources/settings_local_datasource.dart';
import '../datasources/settings_remote_datasource.dart';
class SettingsRepositoryImpl implements SettingsRepository {
final SettingsLocalDataSource _local;
final SettingsRemoteDataSource _remote;
SettingsRepositoryImpl(this._local, this._remote);
@override
Future<String?> getApiUrl() => _local.getApiUrl();
@override
Future<Result<void>> saveApiUrl(String url) async {
try {
await _local.saveApiUrl(url);
return const Result.success(null);
} catch (e) {
return const Result.failure(AppError.unknown(message: 'Failed to save API URL'));
}
}
@override
Future<String?> getLanguageCode() => _local.getLanguageCode();
@override
Future<Result<void>> saveLanguageCode(String code) async {
try {
await _local.saveLanguageCode(code);
return const Result.success(null);
} catch (e) {
return const Result.failure(AppError.unknown(message: 'Failed to save language'));
}
}
@override
Future<Result<ServerConfig>> getServerConfig() async {
final local = await _local.getServerConfig();
if (local != null) {
return Result.success(local);
}
return refreshServerConfig();
}
@override
Future<Result<ServerConfig>> refreshServerConfig() async {
final result = await _remote.getServerConfig();
result.when(
onSuccess: (config) async => await _local.saveServerConfig(config),
onFailure: (_) {},
);
return result;
}
@override
Future<Result<bool>> getNotificationsEnabled() async {
return const Result.success(true);
}
@override
Future<Result<void>> setNotificationsEnabled(bool enabled) async {
return const Result.success(null);
}
@override
Future<Result<bool>> getDarkModeEnabled() async {
return const Result.success(false);
}
@override
Future<Result<void>> setDarkModeEnabled(bool enabled) async {
return const Result.success(null);
}
@override
Future<Result<void>> clearAllData() async {
return const Result.success(null);
}
}