Line data Source code
1 : // Copyright 2026 The terCAD team. All rights reserved.
2 : // Use of this source code is governed by a CC BY-NC-ND 4.0 license that can be found in the LICENSE file.
3 :
4 : import 'package:app_finance/_classes/controller/deep_link/deep_link_handler.dart';
5 : import 'package:app_finance/_classes/herald/app_locale.dart';
6 : import 'package:app_finance/_configs/theme_helper.dart';
7 : import 'package:app_finance/_ext/build_context_ext.dart';
8 : import 'package:app_finance/pages/_interfaces/abstract_page_state.dart';
9 : import 'package:app_finance/pages/integration/widgets/enablebanking_widget.dart';
10 : import 'package:app_finance/pages/integration/widgets/fints_widget.dart';
11 : import 'package:app_finance/pages/integration/widgets/simplefin_widget.dart';
12 : import 'package:material_ui/material_ui.dart';
13 :
14 : typedef IntegrationItem = ({String id, String title, IconData icon, WidgetBuilder builder});
15 :
16 : class IntegrationPage extends StatefulWidget {
17 1 : const IntegrationPage({super.key});
18 :
19 0 : @override
20 0 : IntegrationPageState createState() => IntegrationPageState();
21 : }
22 :
23 : class IntegrationPageState extends AbstractPageState<IntegrationPage> {
24 0 : static List<IntegrationItem> getIntegrations() => [
25 : (
26 : id: 'fints',
27 0 : title: AppLocale.labels.finTsHeadline,
28 : icon: Icons.account_balance,
29 0 : builder: (_) => const FinTsWidget(),
30 : ),
31 : (
32 : id: 'simplefin',
33 0 : title: AppLocale.labels.simpleFinHeadline,
34 : icon: Icons.account_balance_wallet,
35 0 : builder: (_) => const SimpleFinWidget(),
36 : ),
37 : (
38 : id: 'enablebanking',
39 0 : title: AppLocale.labels.enableBankingHeadline,
40 : icon: Icons.euro,
41 0 : builder: (_) => const EnableBankingWidget(),
42 : ),
43 : ];
44 :
45 0 : @override
46 0 : String getTitle() => AppLocale.labels.integrationHeadline;
47 :
48 0 : @override
49 : String getButtonName() => '';
50 :
51 0 : @override
52 : Widget buildButton(BuildContext context, BoxConstraints constraints) => ThemeHelper.emptyBox;
53 :
54 0 : @override
55 : Widget buildContent(BuildContext context, BoxConstraints constraints) {
56 0 : final indent = ThemeHelper.getIndent();
57 0 : return ListView(
58 0 : padding: EdgeInsets.all(indent),
59 0 : children: [
60 0 : for (final item in getIntegrations())
61 0 : Card(
62 0 : key: ValueKey('integration_${item.id}'),
63 : clipBehavior: Clip.antiAlias,
64 0 : child: ExpansionTile(
65 0 : leading: Icon(item.icon),
66 0 : title: Text(item.title, style: context.textTheme.titleMedium),
67 : maintainState: true,
68 : // A bank's callback (deep link) is completed by its section
69 0 : initiallyExpanded: item.id == 'enablebanking' && DeepLinkHandler.enableBankingCallback.value != null,
70 0 : childrenPadding: EdgeInsets.fromLTRB(indent * 2, 0, indent * 2, indent * 2),
71 : expandedCrossAxisAlignment: CrossAxisAlignment.stretch,
72 0 : children: [Builder(builder: item.builder)],
73 : ),
74 : ),
75 : ],
76 : );
77 : }
78 : }
|