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:
@@ -1,6 +1,8 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||
|
||||
import '../../core/cache/cached.dart';
|
||||
import '../../core/widgets/stale_banner.dart';
|
||||
import 'data/tax_api.dart';
|
||||
import 'lots_tab.dart';
|
||||
import 'providers.dart';
|
||||
@@ -16,6 +18,11 @@ class TaxPage extends ConsumerWidget {
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context, WidgetRef ref) {
|
||||
final stale = oldestFetch([
|
||||
ref.watch(taxSummaryProvider).valueOrNull?.fetchedAt,
|
||||
ref.watch(taxLotsProvider).valueOrNull?.fetchedAt,
|
||||
]);
|
||||
|
||||
return DefaultTabController(
|
||||
length: 2,
|
||||
child: Scaffold(
|
||||
@@ -33,10 +40,15 @@ class TaxPage extends ConsumerWidget {
|
||||
tabs: [Tab(text: 'Сводка за год'), Tab(text: 'Лоты и ЛДВ')],
|
||||
),
|
||||
),
|
||||
body: const Column(
|
||||
body: Column(
|
||||
children: [
|
||||
EstimateBanner(),
|
||||
Expanded(child: TabBarView(children: [TaxSummaryTab(), TaxLotsTab()])),
|
||||
const EstimateBanner(),
|
||||
if (stale != null)
|
||||
Padding(
|
||||
padding: const EdgeInsets.fromLTRB(16, 0, 16, 12),
|
||||
child: StaleBanner(fetchedAt: stale),
|
||||
),
|
||||
const Expanded(child: TabBarView(children: [TaxSummaryTab(), TaxLotsTab()])),
|
||||
],
|
||||
),
|
||||
),
|
||||
@@ -50,7 +62,7 @@ class EstimateBanner extends ConsumerWidget {
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context, WidgetRef ref) {
|
||||
final summary = ref.watch(taxSummaryProvider).valueOrNull;
|
||||
final summary = ref.watch(taxSummaryProvider).valueOrNull?.data;
|
||||
final scheme = Theme.of(context).colorScheme;
|
||||
final text = summary?.disclaimer ?? TaxSummary.defaultDisclaimer;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user