Доходы, ребалансировка, налоги, импорт, цели, здоровье данных, правила, транзакции, категории, cashflow, pending: новые виджеты и токены темы, dart format. Тесты подстроены под новые модели.
72 lines
2.2 KiB
Dart
72 lines
2.2 KiB
Dart
import 'package:flutter/material.dart';
|
|
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
|
|
|
import '../../core/cache/cached.dart';
|
|
import '../../core/widgets/scope_selector.dart';
|
|
import '../../core/widgets/stale_banner.dart';
|
|
import 'calendar_tab.dart';
|
|
import 'forecast_tab.dart';
|
|
import 'history_tab.dart';
|
|
import 'providers.dart';
|
|
|
|
/// Доходы: the dividend/coupon calendar, the paid history and the forecast — three views of
|
|
/// one question, so three tabs of one screen rather than three navigation destinations.
|
|
///
|
|
/// One offline banner covers all three tabs (`docs/ai/offline-cache.md`): they share a
|
|
/// scope and `TabBarView` builds all of them eagerly anyway, so watching all three
|
|
/// providers here to compute it costs nothing extra.
|
|
class IncomePage extends ConsumerWidget {
|
|
const IncomePage({super.key});
|
|
|
|
@override
|
|
Widget build(BuildContext context, WidgetRef ref) {
|
|
final stale = oldestFetch([
|
|
ref.watch(incomeCalendarProvider).valueOrNull?.fetchedAt,
|
|
ref.watch(incomeHistoryProvider).valueOrNull?.fetchedAt,
|
|
ref.watch(incomeForecastProvider).valueOrNull?.fetchedAt,
|
|
]);
|
|
|
|
return DefaultTabController(
|
|
length: 3,
|
|
child: Scaffold(
|
|
appBar: AppBar(
|
|
title: const Text('Доходы'),
|
|
actions: [
|
|
const ScopeSelector(),
|
|
IconButton(
|
|
tooltip: 'Обновить',
|
|
icon: const Icon(Icons.refresh),
|
|
onPressed: () => invalidateIncomeProviders(ref),
|
|
),
|
|
],
|
|
bottom: const TabBar(
|
|
tabs: [
|
|
Tab(text: 'Календарь'),
|
|
Tab(text: 'История'),
|
|
Tab(text: 'Прогноз'),
|
|
],
|
|
),
|
|
),
|
|
body: Column(
|
|
children: [
|
|
if (stale != null)
|
|
Padding(
|
|
padding: const EdgeInsets.fromLTRB(16, 12, 16, 0),
|
|
child: StaleBanner(fetchedAt: stale),
|
|
),
|
|
const Expanded(
|
|
child: TabBarView(
|
|
children: [
|
|
IncomeCalendarTab(),
|
|
IncomeHistoryTab(),
|
|
IncomeForecastTab(),
|
|
],
|
|
),
|
|
),
|
|
],
|
|
),
|
|
),
|
|
);
|
|
}
|
|
}
|