dev
dart 163 lines 6.93 KB
Raw
1 import 'package:cake_wallet/generated/i18n.dart';
2 import 'package:cake_wallet/new-ui/widgets/modal_header.dart';
3 import 'package:cake_wallet/new-ui/widgets/modal_page_wrapper.dart';
4 import 'package:cake_wallet/new-ui/widgets/modern_button.dart';
5 import 'package:cake_wallet/new-ui/widgets/receive_page/receive_top_bar.dart';
6 import 'package:cake_wallet/routes.dart';
7 import 'package:cake_wallet/src/screens/nodes/widgets/node_list_row.dart';
8 import 'package:cake_wallet/src/widgets/alert_with_two_actions.dart';
9 import 'package:cake_wallet/utils/show_pop_up.dart';
10 import 'package:cake_wallet/view_model/dashboard/dashboard_view_model.dart';
11 import 'package:cake_wallet/view_model/node_list/node_list_view_model.dart';
12 import 'package:cw_core/node.dart';
13 import 'package:flutter/cupertino.dart';
14 import 'package:flutter/material.dart';
15 import 'package:flutter_mobx/flutter_mobx.dart';
16 import 'package:modal_bottom_sheet/modal_bottom_sheet.dart';
17
18 class ManageNodesPage extends StatefulWidget {
19 ManageNodesPage(this.isPow, {required this.nodeListViewModel, this.dashboardViewModel});
20
21 final DashboardViewModel? dashboardViewModel;
22 final NodeListViewModel nodeListViewModel;
23 final bool isPow;
24
25 @override
26 State<ManageNodesPage> createState() => _ManageNodesPageState();
27 }
28
29 class _ManageNodesPageState extends State<ManageNodesPage> {
30 @override
31 void initState() {
32 super.initState();
33 Future.delayed(Duration(milliseconds: 300))
34 .then((_) => widget.nodeListViewModel.speedTestNodes());
35 }
36
37 @override
38 Widget build(BuildContext context) {
39 return ModalPageWrapper(
40 topBar: ModalTopBar(
41 title: S.of(context).manage_nodes,
42 leadingIcon: Icon(Icons.arrow_back_ios_new),
43 leadingSemanticLabel: S.of(context).seed_alert_back,
44 onLeadingPressed: () => Navigator.of(context).pop(),
45 trailingWidget: Row(
46 spacing: 8,
47 children: [
48 Observer(
49 builder: (_) => ModernButton(
50 size: 36,
51 icon: widget.nodeListViewModel.isTestingNodeSpeed
52 ? CupertinoActivityIndicator()
53 : Icon(Icons.refresh),
54 semanticLabel: S.of(context).test_node_speeds,
55 onPressed: () => widget.nodeListViewModel.speedTestNodes()),
56 ),
57 ModernButton(
58 size: 36,
59 icon: Icon(Icons.add),
60 semanticLabel: S.of(context).add_new_node,
61 onPressed: () async {
62 final res = await Navigator.of(context)
63 .pushNamed(widget.isPow ? Routes.newPowNode : Routes.newNode);
64 if (res != null && res is Node) {
65 widget.nodeListViewModel.nodes.add(res);
66 }
67 })
68 ],
69 ),
70 ),
71 header: ModalHeader(
72 iconPath: "assets/new-ui/settings_row_icons/nodes.svg",
73 message: S.of(context).nodes_desc,
74 title: S.of(context).nodes,
75 bottomWidget: Observer(
76 builder: (_) => NodeListRow(
77 // vertical: 0,
78 // horizontal: 0,
79 node: widget.nodeListViewModel.currentNode,
80 speed: widget.nodeListViewModel.nodeSpeedFor(widget.nodeListViewModel.currentNode),
81 onEditComplete: (res) async {
82 if (res != null && res is Node) {
83 widget.nodeListViewModel.nodes.removeWhere((item) => item.id == res.id);
84 widget.nodeListViewModel.nodes.add(res);
85 }
86 },
87 onTap: () {},
88 isSelected: true,
89 isPow: widget.isPow)),
90 ),
91 content: Column(
92 children: [
93 Container(
94 decoration: BoxDecoration(
95 color: Theme.of(context).colorScheme.surfaceContainer,
96 borderRadius: BorderRadius.circular(18)),
97 child: ClipRRect(
98 borderRadius: BorderRadius.circular(18),
99 child: Observer(
100 builder: (BuildContext context) {
101 int itemsCount = widget.nodeListViewModel.nonCurrentNodes.length;
102 return ListView.separated(
103 controller: ModalScrollController.of(context),
104 shrinkWrap: true,
105 physics: BouncingScrollPhysics(),
106 itemCount: itemsCount,
107 separatorBuilder: (context, index) => Padding(
108 padding: EdgeInsets.symmetric(horizontal: 12),
109 child: Container(
110 height: 1,
111 color: Theme.of(context).colorScheme.surfaceContainerHigh,
112 ),
113 ),
114 itemBuilder: (_, index) {
115 return Observer(
116 builder: (context) {
117 final node = widget.nodeListViewModel.nonCurrentNodes[index];
118 final nodeListRow = NodeListRow(
119 node: node,
120 isSelected: false,
121 isPow: widget.isPow,
122 speed: widget.nodeListViewModel.nodeSpeedFor(node),
123 onEditComplete: (res) async {
124 if (res != null && res is Node) {
125 widget.nodeListViewModel.nodes
126 .removeWhere((item) => item.id == res.id);
127 widget.nodeListViewModel.nodes.add(res);
128 }
129 },
130 onTap: () async {
131 await showPopUp<void>(
132 context: context,
133 builder: (BuildContext context) {
134 return AlertWithTwoActions(
135 alertTitle: S.of(context).change_current_node_title,
136 alertContent:
137 widget.nodeListViewModel.getAlertContent(node.uriRaw),
138 leftButtonText: S.of(context).cancel,
139 rightButtonText: S.of(context).change,
140 actionLeftButton: () => Navigator.of(context).pop(),
141 actionRightButton: () async {
142 await widget.nodeListViewModel.setAsCurrent(node);
143 Navigator.of(context).pop();
144 },
145 );
146 },
147 );
148 },
149 );
150 return nodeListRow;
151 },
152 );
153 },
154 );
155 },
156 ),
157 ),
158 ),
159 ],
160 ),
161 );
162 }
163 }