90 lines
2.5 KiB
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;
|
|
} |