10
import 'package:cake_wallet/src/screens/receive/widgets/header_tile.dart';
11
import 'package:cake_wallet/src/widgets/section_divider.dart';
12
import 'package:cake_wallet/themes/extensions/receive_page_theme.dart';
13
+import 'package:cake_wallet/utils/list_item.dart';
14
import 'package:cake_wallet/utils/show_pop_up.dart';
15
import 'package:cake_wallet/view_model/wallet_address_list/wallet_account_list_header.dart';
16
+import 'package:cake_wallet/view_model/wallet_address_list/wallet_address_hidden_list_header.dart';
17
import 'package:cake_wallet/view_model/wallet_address_list/wallet_address_list_header.dart';
18
import 'package:cake_wallet/view_model/wallet_address_list/wallet_address_list_item.dart';
19
import 'package:cake_wallet/view_model/wallet_address_list/wallet_address_list_view_model.dart';
20
import 'package:cw_core/wallet_type.dart';
21
+import 'package:flutter/foundation.dart';
22
import 'package:flutter/material.dart';
23
import 'package:flutter_mobx/flutter_mobx.dart';
24
22
-class AddressList extends StatelessWidget {
25
+class AddressList extends StatefulWidget {
26
const AddressList({
27
super.key,
28
required this.addressListViewModel,
32
final WalletAddressListViewModel addressListViewModel;
33
final Function(String)? onSelect;
34
35
+ @override
36
+ State<AddressList> createState() => _AddressListState();
37
+}
38
+
39
+class _AddressListState extends State<AddressList> {
40
+
41
+ bool showHiddenAddresses = false;
42
+
43
+ void _toggleHiddenAddresses() {
44
+ setState(() {
45
+ showHiddenAddresses = !showHiddenAddresses;
46
+ });
47
+ updateItems();
48
+ }
49
+
50
+ List<ListItem> getItems(List<ListItem> list, bool showHidden) {
51
+ return list.where((element) {
52
+ if (element is WalletAddressListItem) {
53
+ if (showHidden && element.isHidden) return true;
54
+ if (!showHidden && !element.isHidden) return true;
55
+ return false;
56
+ }
57
+ return true;
58
+ }).toList();
59
+ }
60
+
61
+ List<ListItem> items = [];
62
+
63
+ void updateItems() {
64
+ setState(() {
65
+ items = getItems(widget.addressListViewModel.items, showHiddenAddresses);
66
+ });
67
+ }
68
+
69
+ @override
70
+ void initState() {
71
+ super.initState();
72
+
73
+ items = getItems(widget.addressListViewModel.items, showHiddenAddresses);
74
+ }
75
+
76
@override
77
Widget build(BuildContext context) {
34
- bool editable = onSelect == null;
35
- return Observer(
36
- builder: (_) => ListView.separated(
37
- padding: EdgeInsets.all(0),
38
- separatorBuilder: (context, _) => const HorizontalSectionDivider(),
39
- shrinkWrap: true,
40
- physics: NeverScrollableScrollPhysics(),
41
- itemCount: addressListViewModel.items.length,
42
- itemBuilder: (context, index) {
43
- final item = addressListViewModel.items[index];
44
- Widget cell = Container();
45
-
46
- if (item is WalletAccountListHeader) {
47
- cell = HeaderTile(
48
- showTrailingButton: true,
49
- walletAddressListViewModel: addressListViewModel,
50
- trailingButtonTap: () async {
51
- if (addressListViewModel.type == WalletType.monero ||
52
- addressListViewModel.type == WalletType.haven) {
53
- await showPopUp<void>(
54
- context: context, builder: (_) => getIt.get<MoneroAccountListPage>());
55
- } else {
56
- await showPopUp<void>(
57
- context: context, builder: (_) => getIt.get<NanoAccountListPage>());
58
- }
59
- },
60
- title: S.of(context).accounts,
61
- trailingIcon: Icon(
62
- Icons.arrow_forward_ios,
63
- size: 14,
64
- color: Theme.of(context).extension<ReceivePageTheme>()!.iconsColor,
65
- ));
66
- }
78
+ bool editable = widget.onSelect == null;
79
+ return ListView.separated(
80
+ padding: EdgeInsets.all(0),
81
+ separatorBuilder: (context, _) => const HorizontalSectionDivider(),
82
+ shrinkWrap: true,
83
+ physics: NeverScrollableScrollPhysics(),
84
+ itemCount: items.length,
85
+ itemBuilder: (context, index) {
86
+ final item = items[index];
87
+ Widget cell = Container();
88
68
- if (item is WalletAddressListHeader) {
69
- cell = HeaderTile(
70
- title: S.of(context).addresses,
71
- walletAddressListViewModel: addressListViewModel,
72
- showTrailingButton: !addressListViewModel.isAutoGenerateSubaddressEnabled,
73
- showSearchButton: true,
74
- trailingButtonTap: () => Navigator.of(context).pushNamed(Routes.newSubaddress),
75
- trailingIcon: Icon(
76
- Icons.add,
77
- size: 20,
78
- color: Theme.of(context).extension<ReceivePageTheme>()!.iconsColor,
79
- ));
80
- }
89
+ if (item is WalletAccountListHeader) {
90
+ cell = HeaderTile(
91
+ showTrailingButton: true,
92
+ walletAddressListViewModel: widget.addressListViewModel,
93
+ trailingButtonTap: () async {
94
+ if (widget.addressListViewModel.type == WalletType.monero ||
95
+ widget.addressListViewModel.type == WalletType.haven) {
96
+ await showPopUp<void>(
97
+ context: context, builder: (_) => getIt.get<MoneroAccountListPage>());
98
+ updateItems();
99
+ } else {
100
+ await showPopUp<void>(
101
+ context: context, builder: (_) => getIt.get<NanoAccountListPage>());
102
+ updateItems();
103
+ }
104
+ },
105
+ title: S.of(context).accounts,
106
+ trailingIcon: Icon(
107
+ Icons.arrow_forward_ios,
108
+ size: 14,
109
+ color: Theme.of(context).extension<ReceivePageTheme>()!.iconsColor,
110
+ ));
111
+ }
112
+
113
+ if (item is WalletAddressHiddenListHeader) {
114
+ cell = HeaderTile(
115
+ title: S.of(context).hidden_addresses,
116
+ walletAddressListViewModel: widget.addressListViewModel,
117
+ showTrailingButton: true,
118
+ showSearchButton: false,
119
+ trailingButtonTap: _toggleHiddenAddresses,
120
+ trailingIcon: Icon(
121
+ showHiddenAddresses ? Icons.toggle_on : Icons.toggle_off,
122
+ size: 20,
123
+ color: Theme.of(context).extension<ReceivePageTheme>()!.iconsColor,
124
+ ));
125
+ }
126
82
- if (item is WalletAddressListItem) {
127
+ if (item is WalletAddressListHeader) {
128
+ cell = HeaderTile(
129
+ title: S.of(context).addresses,
130
+ walletAddressListViewModel: widget.addressListViewModel,
131
+ showTrailingButton: widget.addressListViewModel.showAddManualAddresses,
132
+ showSearchButton: true,
133
+ onSearchCallback: updateItems,
134
+ trailingButtonTap: () => Navigator.of(context).pushNamed(Routes.newSubaddress).then((value) {
135
+ updateItems(); // refresh the new address
136
+ }),
137
+ trailingIcon: Icon(
138
+ Icons.add,
139
+ size: 20,
140
+ color: Theme.of(context).extension<ReceivePageTheme>()!.iconsColor,
141
+ ));
142
+ }
143
+
144
+ if (item is WalletAddressListItem) {
145
+ if (item.isHidden && !showHiddenAddresses) {
146
+ cell = Container();
147
+ } else if (!item.isHidden && showHiddenAddresses) {
148
+ cell = Container();
149
+ } else {
150
cell = Observer(builder: (_) {
84
- final isCurrent = item.address == addressListViewModel.address.address && editable;
151
+ final isCurrent = item.address == widget.addressListViewModel.address.address && editable;
152
final backgroundColor = isCurrent
153
? Theme.of(context).extension<ReceivePageTheme>()!.currentTileBackgroundColor
154
: Theme.of(context).extension<ReceivePageTheme>()!.tilesBackgroundColor;
156
? Theme.of(context).extension<ReceivePageTheme>()!.currentTileTextColor
157
: Theme.of(context).extension<ReceivePageTheme>()!.tilesTextColor;
158
159
+
160
return AddressCell.fromItem(
161
item,
162
isCurrent: isCurrent,
95
- hasBalance: addressListViewModel.isElectrumWallet,
96
- backgroundColor: backgroundColor,
163
+ hasBalance: widget.addressListViewModel.isBalanceAvailable,
164
+ hasReceived: widget.addressListViewModel.isReceivedAvailable,
165
+ // hasReceived:
166
+ backgroundColor: (kDebugMode && item.isHidden) ?
167
+ Theme.of(context).colorScheme.error :
168
+ (kDebugMode && item.isManual) ? Theme.of(context).colorScheme.error.withBlue(255) :
169
+ backgroundColor,
170
textColor: textColor,
171
onTap: (_) {
99
- if (onSelect != null) {
100
- onSelect!(item.address);
172
+ if (widget.onSelect != null) {
173
+ widget.onSelect!(item.address);
174
return;
175
}
103
- addressListViewModel.setAddress(item);
176
+ widget.addressListViewModel.setAddress(item);
177
},
178
onEdit: editable
106
- ? () => Navigator.of(context).pushNamed(Routes.newSubaddress, arguments: item)
179
+ ? () => Navigator.of(context).pushNamed(Routes.newSubaddress, arguments: item).then((value) {
180
+ updateItems(); // refresh the new address
181
+ })
182
: null,
183
+ isHidden: item.isHidden,
184
+ onHide: () => _hideAddress(item),
185
);
186
});
187
}
188
+ }
189
112
- return index != 0
113
- ? cell
114
- : ClipRRect(
115
- borderRadius: BorderRadius.only(
116
- topLeft: Radius.circular(30), topRight: Radius.circular(30)),
117
- child: cell,
118
- );
119
- },
120
- ),
190
+ return index != 0
191
+ ? cell
192
+ : ClipRRect(
193
+ borderRadius: BorderRadius.only(
194
+ topLeft: Radius.circular(30), topRight: Radius.circular(30)),
195
+ child: cell,
196
+ );
197
+ },
198
);
199
}
200
+
201
+ void _hideAddress(WalletAddressListItem item) async {
202
+ await widget.addressListViewModel.toggleHideAddress(item);
203
+ updateItems();
204
+ }
205
+
206
}