70 lines
2.4 KiB
Dart
70 lines
2.4 KiB
Dart
import 'dart:math';
|
|
|
|
import 'package:flutter/cupertino.dart';
|
|
import 'package:flutter/material.dart';
|
|
import 'package:flutter_bloc/flutter_bloc.dart';
|
|
import 'package:okane/database/collections/recurrent.dart';
|
|
import 'package:okane/ui/state/core.dart';
|
|
|
|
class UpcomingTransactionsCard extends StatelessWidget {
|
|
const UpcomingTransactionsCard({super.key});
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
return BlocBuilder<CoreCubit, CoreState>(
|
|
builder: (context, state) {
|
|
final today = DateTime.now();
|
|
final upcomingRaw =
|
|
state.recurringTransactions.where((t) {
|
|
if (t.lastExecution == null) {
|
|
return true;
|
|
}
|
|
|
|
return today.difference(t.lastExecution!).inDays <=
|
|
(t.days * 1.5).toInt();
|
|
}).toList();
|
|
final List<RecurringTransaction> upcoming =
|
|
upcomingRaw.isEmpty
|
|
? List.empty()
|
|
: upcomingRaw.sublist(0, min(upcomingRaw.length, 3));
|
|
final transactions =
|
|
upcoming.isEmpty
|
|
? [Text("No upcoming transactions")]
|
|
: upcoming
|
|
.map(
|
|
(t) => ListTile(
|
|
title: Text(
|
|
"${t.template.value!.name} (${t.template.value!.amount}€)",
|
|
),
|
|
subtitle: Text(
|
|
"Due in ${today.difference(t.lastExecution ?? today).inDays} days",
|
|
),
|
|
leading: Icon(
|
|
t.template.value!.amount < 0
|
|
? Icons.remove
|
|
: Icons.add,
|
|
color:
|
|
t.template.value!.amount < 0
|
|
? Colors.red
|
|
: Colors.green,
|
|
),
|
|
trailing: IconButton(
|
|
icon: Icon(Icons.play_arrow),
|
|
onPressed: () {},
|
|
),
|
|
),
|
|
)
|
|
.toList();
|
|
return Card(
|
|
child: Padding(
|
|
padding: const EdgeInsets.all(16),
|
|
child: Column(
|
|
children: <Widget>[Text("Upcoming Transactions")] + transactions,
|
|
),
|
|
),
|
|
);
|
|
},
|
|
);
|
|
}
|
|
}
|