Files
ProxyTrash/lib/services/address_repository.dart

90 lines
2.5 KiB
Dart

import 'dart:convert';
import 'package:shared_preferences/shared_preferences.dart';
import '../models/address_entry.dart';
import '../models/address_record.dart';
import '../models/auth_session.dart';
abstract class AddressRepository {
Future<void> saveAddress({
required AuthSession session,
required AddressEntry address,
});
Future<List<AddressRecord>> getMyAddresses({required AuthSession session});
}
class LocalAddressRepository implements AddressRepository {
const LocalAddressRepository();
static const String _localAddressPrefix = 'local_addresses_';
@override
Future<void> saveAddress({
required AuthSession session,
required AddressEntry address,
}) async {
await _persistLocalAddress(session: session, address: address);
}
@override
Future<List<AddressRecord>> getMyAddresses({required AuthSession session}) async {
return _loadLocalAddresses(session);
}
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>[];
}
final decoded = jsonDecode(raw);
if (decoded is! List) {
return <AddressRecord>[];
}
return decoded
.whereType<Map<String, dynamic>>()
.map(AddressRecord.fromJson)
.toList(growable: false);
}
}
class AddressException implements Exception {
AddressException(this.message);
final String message;
@override
String toString() => message;
}