66 lines
1.6 KiB
Dart
66 lines
1.6 KiB
Dart
import 'package:flutter/foundation.dart';
|
|
|
|
import 'models.dart';
|
|
import 'service.dart';
|
|
|
|
class DestinationsProvider extends ChangeNotifier {
|
|
DestinationsProvider(this.service);
|
|
final DestinationService service;
|
|
DestinationCapabilities? capabilities;
|
|
List<SavedDestination> methods = [];
|
|
bool loading = false, failed = false, _disposed = false;
|
|
int _revision = 0;
|
|
Future<void> refresh() async {
|
|
final revision = ++_revision;
|
|
loading = true;
|
|
failed = false;
|
|
notifyListeners();
|
|
try {
|
|
final caps = await service.capabilities();
|
|
final rows = await service.list();
|
|
if (_disposed || revision != _revision) return;
|
|
capabilities = caps;
|
|
methods = rows;
|
|
} catch (_) {
|
|
if (_disposed || revision != _revision) return;
|
|
failed = true;
|
|
}
|
|
if (_disposed) return;
|
|
loading = false;
|
|
notifyListeners();
|
|
}
|
|
|
|
List<SavedDestination> search(String query, DestinationType type) {
|
|
final q = query.trim().toLowerCase();
|
|
final rows = methods
|
|
.where(
|
|
(d) =>
|
|
d.details.type == type &&
|
|
'${d.label} ${d.details.display}'.toLowerCase().contains(q),
|
|
)
|
|
.toList();
|
|
rows.sort(
|
|
(a, b) => (b.lastUsed ?? DateTime(1970)).compareTo(
|
|
a.lastUsed ?? DateTime(1970),
|
|
),
|
|
);
|
|
return rows;
|
|
}
|
|
|
|
void reset() {
|
|
_revision++;
|
|
methods = [];
|
|
capabilities = null;
|
|
loading = failed = false;
|
|
service.clearTransient();
|
|
notifyListeners();
|
|
}
|
|
|
|
@override
|
|
void dispose() {
|
|
_disposed = true;
|
|
_revision++;
|
|
super.dispose();
|
|
}
|
|
}
|