Resolve merge conflicts: README + ignore IDE files
This commit is contained in:
@@ -1,6 +1,7 @@
|
||||
import 'dart:convert';
|
||||
import 'package:http/http.dart' as http;
|
||||
import '../app_config.dart';
|
||||
|
||||
import 'package:shared_preferences/shared_preferences.dart';
|
||||
|
||||
import '../models/address_entry.dart';
|
||||
import '../models/address_record.dart';
|
||||
import '../models/auth_session.dart';
|
||||
@@ -14,68 +15,61 @@ abstract class AddressRepository {
|
||||
Future<List<AddressRecord>> getMyAddresses({required AuthSession session});
|
||||
}
|
||||
|
||||
class HttpAddressRepository implements AddressRepository {
|
||||
const HttpAddressRepository({http.Client? client}) : _client = client;
|
||||
|
||||
final http.Client? _client;
|
||||
class LocalAddressRepository implements AddressRepository {
|
||||
const LocalAddressRepository();
|
||||
static const String _localAddressPrefix = 'local_addresses_';
|
||||
|
||||
@override
|
||||
Future<void> saveAddress({
|
||||
required AuthSession session,
|
||||
required AddressEntry address,
|
||||
}) async {
|
||||
final uri = Uri.parse('${AppConfig.apiBaseUrl}/addresses');
|
||||
|
||||
late final http.Response response;
|
||||
try {
|
||||
response = await (_client ?? http.Client()).post(
|
||||
uri,
|
||||
headers: {
|
||||
'Content-Type': 'application/json',
|
||||
'Accept': 'application/json',
|
||||
'Authorization': 'Bearer ${session.token}',
|
||||
},
|
||||
body: jsonEncode(address.toJson()),
|
||||
);
|
||||
} catch (_) {
|
||||
throw AddressException(
|
||||
'No se pudo conectar con el backend en ${AppConfig.apiBaseUrl}.',
|
||||
);
|
||||
}
|
||||
|
||||
if (response.statusCode < 200 || response.statusCode >= 300) {
|
||||
final payload = jsonDecode(response.body);
|
||||
final message = payload['message']?.toString() ?? 'Error al guardar la dirección.';
|
||||
throw AddressException(message);
|
||||
}
|
||||
await _persistLocalAddress(session: session, address: address);
|
||||
}
|
||||
|
||||
@override
|
||||
Future<List<AddressRecord>> getMyAddresses({required AuthSession session}) async {
|
||||
final uri = Uri.parse('${AppConfig.apiBaseUrl}/addresses/me');
|
||||
return _loadLocalAddresses(session);
|
||||
}
|
||||
|
||||
late final http.Response response;
|
||||
try {
|
||||
response = await (_client ?? http.Client()).get(
|
||||
uri,
|
||||
headers: {
|
||||
'Accept': 'application/json',
|
||||
'Authorization': 'Bearer ${session.token}',
|
||||
},
|
||||
);
|
||||
} catch (_) {
|
||||
throw AddressException(
|
||||
'No se pudo conectar con el backend en ${AppConfig.apiBaseUrl}.',
|
||||
);
|
||||
Future<void> _persistLocalAddress({required AuthSession session, required AddressEntry address}) async {
|
||||
final prefs = await SharedPreferences.getInstance();
|
||||
final key = '$_localAddressPrefix${session.email.toLowerCase()}';
|
||||
final existing = await _loadLocalAddresses(session);
|
||||
final records = <AddressRecord>[
|
||||
AddressRecord(
|
||||
id: DateTime.now().millisecondsSinceEpoch,
|
||||
houseNumber: address.houseNumber,
|
||||
colonia: address.colonia,
|
||||
street: address.street,
|
||||
),
|
||||
...existing,
|
||||
];
|
||||
|
||||
final encoded = jsonEncode(
|
||||
records
|
||||
.map(
|
||||
(record) => <String, dynamic>{
|
||||
'id': record.id,
|
||||
'houseNumber': record.houseNumber,
|
||||
'colonia': record.colonia,
|
||||
'street': record.street,
|
||||
},
|
||||
)
|
||||
.toList(growable: false),
|
||||
);
|
||||
await prefs.setString(key, encoded);
|
||||
}
|
||||
|
||||
Future<List<AddressRecord>> _loadLocalAddresses(AuthSession session) async {
|
||||
final prefs = await SharedPreferences.getInstance();
|
||||
final key = '$_localAddressPrefix${session.email.toLowerCase()}';
|
||||
final raw = prefs.getString(key);
|
||||
if (raw == null || raw.trim().isEmpty) {
|
||||
return <AddressRecord>[];
|
||||
}
|
||||
|
||||
if (response.statusCode < 200 || response.statusCode >= 300) {
|
||||
final payload = jsonDecode(response.body);
|
||||
final message = payload['message']?.toString() ?? 'Error al obtener las direcciones.';
|
||||
throw AddressException(message);
|
||||
}
|
||||
|
||||
final decoded = jsonDecode(response.body);
|
||||
final decoded = jsonDecode(raw);
|
||||
if (decoded is! List) {
|
||||
return <AddressRecord>[];
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user