feat(app): offline-кэш на остальных экранах — фаза 5
accounts, cashflow, categories, goals, income, portfolio (+instrument), rebalance, tax, rules переведены на Cached<T> по контракту docs/ai/offline-cache.md. Общие/второстепенные селекторы (scopesProvider, categoriesListProvider и т.п.) оставлены как есть — не основной контент экрана. sync_page.dart и settings_page.dart не тронуты (первый — заменён health-page отдельно, второй — чистые действия без списка для баннера).
This commit is contained in:
@@ -10,6 +10,7 @@ library;
|
||||
|
||||
import 'package:dio/dio.dart';
|
||||
|
||||
import '../../../core/cache/cached.dart';
|
||||
import '../../../core/utils/json.dart';
|
||||
|
||||
/// One benchmark inside one period row.
|
||||
@@ -92,7 +93,9 @@ class BenchmarksApi {
|
||||
|
||||
final Dio _dio;
|
||||
|
||||
Future<List<BenchmarkRow>> compare({
|
||||
/// See `docs/ai/offline-cache.md`: this hand-written client returns `Cached<T>` directly
|
||||
/// (there is no generated `Response<T>` for `BenchmarksCard` to unwrap `r.cached` from).
|
||||
Future<Cached<List<BenchmarkRow>>> compare({
|
||||
String scope = 'all',
|
||||
List<String> periods = const ['1m', 'ytd', '1y', 'all'],
|
||||
}) async {
|
||||
@@ -101,6 +104,7 @@ class BenchmarksApi {
|
||||
// `period` is repeatable; Dio serialises a list as repeated query parameters.
|
||||
queryParameters: {'scope': scope, 'period': periods},
|
||||
);
|
||||
return asObjects((r.data ?? const {})['rows']).map(BenchmarkRow.fromJson).toList();
|
||||
final rows = asObjects((r.data ?? const {})['rows']).map(BenchmarkRow.fromJson).toList();
|
||||
return Cached(rows, fetchedAt: r.extra['fetchedAt'] as DateTime?);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user