1
import 'package:cake_wallet/bitcoin/bitcoin.dart';
2
+import 'package:cake_wallet/entities/new_ui_entities/list_item/list_item_regular_row.dart';
3
+import 'package:cake_wallet/entities/new_ui_entities/list_item/list_item_selector.dart';
4
import 'package:cake_wallet/entities/priority_for_wallet_type.dart';
5
import 'package:cake_wallet/generated/i18n.dart';
6
+import 'package:cake_wallet/new-ui/widgets/modal_page_wrapper.dart';
7
+import 'package:cake_wallet/new-ui/widgets/receive_page/receive_top_bar.dart';
8
import 'package:cake_wallet/routes.dart';
9
import 'package:cake_wallet/src/screens/base_page.dart';
10
import 'package:cake_wallet/src/screens/dev/moneroc_cache_debug.dart';
7
-import 'package:cake_wallet/src/screens/settings/widgets/setting_priority_picker_cell.dart';
8
-import 'package:cake_wallet/src/screens/settings/widgets/settings_cell_with_arrow.dart';
9
-import 'package:cake_wallet/src/screens/settings/widgets/settings_picker_cell.dart';
10
-import 'package:cake_wallet/src/screens/settings/widgets/settings_version_cell.dart';
11
+import 'package:cake_wallet/src/widgets/new_list_row/new_list_section.dart';
12
+import 'package:cake_wallet/src/widgets/picker.dart';
13
import 'package:cake_wallet/utils/feature_flag.dart';
14
import 'package:cake_wallet/utils/share_util.dart';
15
+import 'package:cake_wallet/utils/show_pop_up.dart';
16
import 'package:cake_wallet/view_model/settings/other_settings_view_model.dart';
17
import 'package:cw_core/wallet_info.dart';
18
+import 'package:cw_core/transaction_priority.dart';
19
import 'package:cw_core/wallet_type.dart';
20
import 'package:cw_core/db/sqlite.dart';
21
import 'package:flutter/material.dart';
18
-import 'package:flutter_mobx/flutter_mobx.dart';
22
23
class OtherSettingsPage extends BasePage {
24
OtherSettingsPage(this._otherSettingsViewModel) {
28
}
29
30
@override
28
- String get title => S.current.other_settings;
31
+ bool get hideAppBar => true;
32
33
final OtherSettingsViewModel _otherSettingsViewModel;
34
35
+
36
@override
33
- Widget body(BuildContext context) => Observer(
34
- builder: (_) => Container(
35
- padding: EdgeInsets.only(top: 10),
36
- child: Column(
37
- children: [
38
- Expanded(
39
- child: SingleChildScrollView(
40
- child: Column(
41
- children: [
42
- if (_otherSettingsViewModel.displayTransactionPriority)
43
- _otherSettingsViewModel.walletType == WalletType.bitcoin
44
- ? SettingsPriorityPickerCell(
45
- title: S.current.settings_fee_priority,
46
- items: priorityForWalletType(_otherSettingsViewModel.walletType),
47
- displayItem: _otherSettingsViewModel.getDisplayBitcoinPriority,
48
- selectedItem: _otherSettingsViewModel.transactionPriority,
49
- customItemIndex: _otherSettingsViewModel.customPriorityItemIndex,
50
- onItemSelected: _otherSettingsViewModel.onDisplayBitcoinPrioritySelected,
51
- customValue: _otherSettingsViewModel.customBitcoinFeeRate,
52
- maxValue: _otherSettingsViewModel.maxCustomFeeRate?.toDouble(),
53
- )
54
- : SettingsPickerCell(
55
- title: S.current.settings_fee_priority,
56
- items: priorityForWalletType(_otherSettingsViewModel.walletType),
57
- displayItem: _otherSettingsViewModel.getDisplayPriority,
58
- selectedItem: _otherSettingsViewModel.transactionPriority,
59
- onItemSelected: _otherSettingsViewModel.onDisplayPrioritySelected,
60
- ),
61
- if (_otherSettingsViewModel.changeRepresentativeEnabled)
62
- SettingsCellWithArrow(
63
- title: S.current.change_rep,
64
- handler: (context) => Navigator.of(context).pushNamed(Routes.changeRep),
65
- ),
66
- if (_otherSettingsViewModel.changeHardwareWalletTypeEnabled)
67
- SettingsCellWithArrow(
68
- title: "Hardware wallet manufacturer",
69
- handler: (context) => Navigator.of(context)
70
- .pushNamed(Routes.restoreWalletFromHardwareWallet, arguments: {
71
- "showUnavailable": false,
72
- "availableHardwareWalletTypes": [
73
- HardwareWalletType.cupcake,
74
- HardwareWalletType.coldcard,
75
- HardwareWalletType.seedsigner,
76
- ],
77
- "onSelect": (BuildContext context, HardwareWalletType hwType) async {
78
- await _otherSettingsViewModel.onHardwareWalletTypeChanged(hwType);
79
- Navigator.pop(context);
37
+ Widget body(BuildContext context) {
38
+ return ModalPageWrapper(
39
+ topBar: ModalTopBar(
40
+ title: S.of(context).other,
41
+ leadingIcon: Icon(Icons.arrow_back_ios_new),
42
+ onLeadingPressed: () => Navigator.of(context).pop(),
43
+ ),
44
+ // header: ModalHeader(
45
+ // iconPath: "assets/new-ui/settings_row_icons/other.svg",
46
+ // message: "Other settings",
47
+ // title: S.of(context).other_settings),
48
+ content: NewListSections(
49
+ sections: {
50
+ "": [
51
+ if (_otherSettingsViewModel.displayTransactionPriority)
52
+ _otherSettingsViewModel.walletType == WalletType.bitcoin
53
+ ? ListItemSelector(
54
+ keyValue: "fee_priority",
55
+ label: S.of(context).settings_fee_priority,
56
+ options: [_otherSettingsViewModel.transactionPriority.title],
57
+ onTap: () async {
58
+
59
+ final items = priorityForWalletType(_otherSettingsViewModel.walletType);
60
+
61
+ var selectedAtIndex = items.indexOf(_otherSettingsViewModel.transactionPriority);
62
+ double sliderValue = _otherSettingsViewModel.customBitcoinFeeRate ?? 0.0;
63
+
64
+ await showPopUp<void>(
65
+ context: context,
66
+ builder: (BuildContext context) {
67
+ return StatefulBuilder(
68
+ builder: (BuildContext context, StateSetter setState) {
69
+ return Picker(
70
+ items: items,
71
+ displayItem: (TransactionPriority item) => _otherSettingsViewModel.getDisplayBitcoinPriority(item, sliderValue.round()),
72
+ selectedAtIndex: selectedAtIndex,
73
+ customItemIndex: _otherSettingsViewModel.customPriorityItemIndex,
74
+ maxValue: _otherSettingsViewModel.maxCustomFeeRate?.toDouble(),
75
+ headerEnabled: false,
76
+ closeOnItemSelected: false,
77
+ mainAxisAlignment: MainAxisAlignment.center,
78
+ sliderValue: sliderValue,
79
+ onSliderChanged: (double newValue) =>
80
+ setState(() => sliderValue = newValue),
81
+ onItemSelected: (TransactionPriority priority) {
82
+ setState(() => selectedAtIndex = items.indexOf(priority));
83
+ _otherSettingsViewModel.onDisplayBitcoinPrioritySelected.call(priority, sliderValue);
84
},
81
- }),
82
- ),
83
- if (_otherSettingsViewModel.walletType == WalletType.bitcoin) ...[
84
- SettingsCellWithArrow(
85
- title: S.of(context).export_lightning_logs,
86
- handler: onExportLNLog,
87
- ),
88
- SettingsCellWithArrow(
89
- title: S.of(context).export_payjoin_logs,
90
- handler: onExportPJLog,
91
- ),
92
- ],
93
- SettingsCellWithArrow(
94
- title: S.current.settings_terms_and_conditions,
95
- handler: (context) => Navigator.of(context).pushNamed(Routes.readDisclaimer),
96
- ),
97
- if (FeatureFlag.hasDevOptions &&
98
- _otherSettingsViewModel.walletType == WalletType.monero)
99
- SettingsCellWithArrow(
100
- title: '[dev] monero background sync',
101
- handler: (context) =>
102
- Navigator.of(context).pushNamed(Routes.devMoneroBackgroundSync),
103
- ),
104
- if (FeatureFlag.hasDevOptions &&
105
- [WalletType.monero, WalletType.wownero, WalletType.zano]
106
- .contains(_otherSettingsViewModel.walletType))
107
- SettingsCellWithArrow(
108
- title: '[dev] xmr call profiler',
109
- handler: (context) =>
110
- Navigator.of(context).pushNamed(Routes.devMoneroCallProfiler),
111
- ),
112
- if (FeatureFlag.hasDevOptions &&
113
- [WalletType.monero].contains(_otherSettingsViewModel.walletType))
114
- SettingsCellWithArrow(
115
- title: '[dev] xmr wallet cache debug',
116
- handler: (context) =>
117
- Navigator.of(context).pushNamed(Routes.devMoneroWalletCacheDebug),
118
- ),
119
- if (FeatureFlag.hasDevOptions)
120
- SettingsCellWithArrow(
121
- title: '[dev] shared preferences',
122
- handler: (context) =>
123
- Navigator.of(context).pushNamed(Routes.devSharedPreferences),
124
- ),
125
- if (FeatureFlag.hasDevOptions)
126
- SettingsCellWithArrow(
127
- title: '[dev] secure storage preferences',
128
- handler: (context) =>
129
- Navigator.of(context).pushNamed(Routes.devSecurePreferences),
130
- ),
131
- if (FeatureFlag.hasDevOptions)
132
- SettingsCellWithArrow(
133
- title: '[dev] background sync logs',
134
- handler: (context) =>
135
- Navigator.of(context).pushNamed(Routes.devBackgroundSyncLogs),
136
- ),
137
- if (FeatureFlag.hasDevOptions)
138
- SettingsCellWithArrow(
139
- title: '[dev] socket health logs',
140
- handler: (context) => Navigator.of(context).pushNamed(Routes.devSocketHealthLogs),
141
- ),
142
- if (FeatureFlag.hasDevOptions)
143
- SettingsCellWithArrow(
144
- title: '[dev] network requests logs',
145
- handler: (context) => Navigator.of(context).pushNamed(Routes.devNetworkRequests),
146
- ),
147
- if (FeatureFlag.hasDevOptions)
148
- SettingsCellWithArrow(
149
- title: '[dev] exchange provider logs',
150
- handler: (context) =>
151
- Navigator.of(context).pushNamed(Routes.devExchangeProviderLogs),
152
- ),
153
- if (FeatureFlag.hasDevOptions)
154
- SettingsCellWithArrow(
155
- title: '[dev] *QR tools',
156
- handler: (context) => Navigator.of(context).pushNamed(Routes.devQRTools),
157
- ),
158
- if (FeatureFlag.hasDevOptions)
159
- SettingsCellWithArrow(
160
- title: '[dev] exchange provider logs',
161
- handler: (BuildContext context) =>
162
- Navigator.of(context).pushNamed(Routes.devExchangeProviderLogs),
163
- ),
164
- if (FeatureFlag.hasDevOptions)
165
- SettingsCellWithArrow(
166
- title: '[dev] browse sqlite db',
167
- handler: (BuildContext context) async {
168
- final data = await dumpDb();
169
- Navigator.of(context).push(
170
- MaterialPageRoute(builder: (context) => JsonExplorerPage(data: data, title: 'sqlite db')),
171
- );
172
- }
173
- ),
174
- ],
85
+ );
86
+ },
87
+ );
88
+ },
89
+ );
90
+ _otherSettingsViewModel.onDisplayBitcoinPrioritySelected.call(items[selectedAtIndex], sliderValue);
91
+ }
92
+ )
93
+ : ListItemSelector(
94
+ keyValue: "fee_priority",
95
+ label: S.of(context).settings_fee_priority,
96
+ options: [_otherSettingsViewModel.transactionPriority.title],
97
+ onTap: () async {
98
+ final selectedAtIndex = priorityForWalletType(_otherSettingsViewModel.walletType).indexOf(_otherSettingsViewModel.transactionPriority,);
99
+
100
+ await showPopUp<void>(
101
+ context: context,
102
+ builder: (_) => Picker(
103
+ items: priorityForWalletType(_otherSettingsViewModel.walletType),
104
+ displayItem: _otherSettingsViewModel.getDisplayPriority,
105
+ selectedAtIndex: selectedAtIndex,
106
+ mainAxisAlignment: MainAxisAlignment.start,
107
+ onItemSelected: (TransactionPriority item) => _otherSettingsViewModel.onDisplayBitcoinPrioritySelected.call(item, 0),
108
+ isSeparated: false,
109
),
176
- ),
110
+ );
111
+ },
112
+ ),
113
+ if(_otherSettingsViewModel.changeRepresentativeEnabled)
114
+ ListItemRegularRow(
115
+ keyValue: "change_rep",
116
+ label: S.of(context).change_rep,
117
+ onTap: () => Navigator.of(context).pushNamed(Routes.changeRep)
118
+ ),
119
+ if (_otherSettingsViewModel.changeHardwareWalletTypeEnabled)
120
+ ListItemRegularRow(
121
+ keyValue: "hardware_wallet_manufacturer",
122
+ label: "Hardware wallet manufacturer",
123
+ onTap: () => Navigator.of(context)
124
+ .pushNamed(Routes.restoreWalletFromHardwareWallet, arguments: {
125
+ "showUnavailable": false,
126
+ "availableHardwareWalletTypes": [
127
+ HardwareWalletType.cupcake,
128
+ HardwareWalletType.coldcard,
129
+ HardwareWalletType.seedsigner,
130
+ ],
131
+ "onSelect": (BuildContext context, HardwareWalletType hwType) async {
132
+ await _otherSettingsViewModel.onHardwareWalletTypeChanged(hwType);
133
+ Navigator.pop(context);
134
+ },
135
+ }),
136
+ ),
137
+ ListItemRegularRow(
138
+ keyValue: "security_backup_page_sign_and_verify",
139
+ label: S.of(context).sign_verify_title,
140
+ onTap: () {
141
+ Navigator.of(context).pushNamed(Routes.signPage);
142
+ }),
143
+ ],
144
+ if(FeatureFlag.hasDevOptions)
145
+ "dev": [
146
+ if(_otherSettingsViewModel.walletType == WalletType.bitcoin) ...[
147
+ ListItemRegularRow(
148
+ keyValue: "export_lightning_logs",
149
+ label: S.of(context).export_lightning_logs,
150
+ onTap: () => onExportLNLog(context)
151
),
178
- SettingsVersionCell(
179
- title: S.of(context).version(_otherSettingsViewModel.currentVersion),
152
+ ListItemRegularRow(
153
+ keyValue: "export_payjoin_logs",
154
+ label: S.of(context).export_payjoin_logs,
155
+ onTap: () => onExportPJLog(context)
156
),
157
],
182
- ),
183
- ),
184
- );
185
-
158
+ if (FeatureFlag.hasDevOptions &&
159
+ _otherSettingsViewModel.walletType == WalletType.monero)
160
+ ListItemRegularRow(
161
+ keyValue: "[dev] monero background sync",
162
+ label: "[dev] monero background sync",
163
+ onTap: () => Navigator.of(context).pushNamed(Routes.devMoneroBackgroundSync)
164
+ ),
165
+ if (FeatureFlag.hasDevOptions &&
166
+ [WalletType.monero, WalletType.wownero, WalletType.zano]
167
+ .contains(_otherSettingsViewModel.walletType))
168
+ ListItemRegularRow(
169
+ keyValue: "[dev] xmr call profiler",
170
+ label: "[dev] xmr call profiler",
171
+ onTap: () => Navigator.of(context).pushNamed(Routes.devMoneroCallProfiler)
172
+ ),
173
+ if (FeatureFlag.hasDevOptions &&
174
+ [WalletType.monero].contains(_otherSettingsViewModel.walletType))
175
+ ListItemRegularRow(
176
+ keyValue: '[dev] xmr wallet cache debug',
177
+ label: '[dev] xmr wallet cache debug',
178
+ onTap: () => Navigator.of(context).pushNamed(Routes.devMoneroWalletCacheDebug)
179
+ ),
180
+ ListItemRegularRow(
181
+ keyValue: '[dev] shared preferences',
182
+ label: '[dev] shared preferences',
183
+ onTap: () => Navigator.of(context).pushNamed(Routes.devSharedPreferences)
184
+ ),
185
+ ListItemRegularRow(
186
+ keyValue: '[dev] secure storage preferences',
187
+ label: '[dev] secure storage preferences',
188
+ onTap: () => Navigator.of(context).pushNamed(Routes.devSecurePreferences)
189
+ ),
190
+ ListItemRegularRow(
191
+ keyValue: '[dev] background sync logs',
192
+ label: '[dev] background sync logs',
193
+ onTap: () => Navigator.of(context).pushNamed(Routes.devBackgroundSyncLogs)
194
+ ),
195
+ ListItemRegularRow(
196
+ keyValue: '[dev] socket health logs',
197
+ label: '[dev] socket health logs',
198
+ onTap: () => Navigator.of(context).pushNamed(Routes.devSocketHealthLogs)
199
+ ),
200
+ ListItemRegularRow(
201
+ keyValue: '[dev] network requests logs',
202
+ label: '[dev] network requests logs',
203
+ onTap: () => Navigator.of(context).pushNamed(Routes.devNetworkRequests)
204
+ ),
205
+ ListItemRegularRow(
206
+ keyValue: '[dev] exchange provider logs',
207
+ label: '[dev] exchange provider logs',
208
+ onTap: () => Navigator.of(context).pushNamed(Routes.devExchangeProviderLogs)
209
+ ),
210
+ ListItemRegularRow(
211
+ keyValue: '[dev] *QR tools',
212
+ label: '[dev] *QR tools',
213
+ onTap: () => Navigator.of(context).pushNamed(Routes.devExchangeProviderLogs)
214
+ ),
215
+ ListItemRegularRow(
216
+ keyValue: '[dev] browse sqlite db',
217
+ label: '[dev] browse sqlite db',
218
+ onTap: () async {
219
+ final data = await dumpDb();
220
+ Navigator.of(context).push(
221
+ MaterialPageRoute(builder: (context) =>
222
+ JsonExplorerPage(data: data, title: 'sqlite db')),
223
+ );
224
+ }
225
+ ),
226
+ ]
227
+ }
228
+ ),
229
+ );
230
+ }
231
Future<void> onExportLNLog(BuildContext context) async {
232
final file = await _otherSettingsViewModel.getLightningLog();
233