Приложение на флаторе, настройки
This commit is contained in:
@@ -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);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user