Resolve merge conflicts: README + ignore IDE files

This commit is contained in:
David
2026-05-23 07:11:33 -06:00
parent abfbb255fe
commit 6ff72c738d
27 changed files with 2123 additions and 335 deletions

View File

@@ -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>[];
}