@@ -65,21 +65,43 @@ class HomeScreen extends ConsumerWidget {
6565 }
6666}
6767
68- class _HeaderCard extends StatelessWidget {
68+ class _HeaderCard extends StatefulWidget {
6969 final NodeStatus status;
70- final VoidCallback onConnect;
71- final VoidCallback onDisconnect;
70+ final Future < void > Function () onConnect;
71+ final Future < void > Function () onDisconnect;
7272
7373 const _HeaderCard ({
7474 required this .status,
7575 required this .onConnect,
7676 required this .onDisconnect,
7777 });
7878
79+ @override
80+ State <_HeaderCard > createState () => _HeaderCardState ();
81+ }
82+
83+ class _HeaderCardState extends State <_HeaderCard > {
84+ bool _isLoading = false ;
85+
86+ bool get isRestartVisible =>
87+ widget.status == NodeStatus .connected && ! _isLoading;
88+
89+ Future <void > startMycelium () async {
90+ setState (() => _isLoading = true );
91+ await widget.onConnect ();
92+ setState (() => _isLoading = false );
93+ }
94+
95+ Future <void > stopMycelium () async {
96+ setState (() => _isLoading = true );
97+ await widget.onDisconnect ();
98+ setState (() => _isLoading = false );
99+ }
100+
79101 @override
80102 Widget build (BuildContext context) {
81- final isConnected = status == NodeStatus .connected;
82- final isConnecting = status == NodeStatus .connecting;
103+ final isConnected = widget. status == NodeStatus .connected;
104+ final isConnecting = _isLoading || widget. status == NodeStatus .connecting;
83105
84106 return AppCard (
85107 child: Column (
@@ -100,7 +122,7 @@ class _HeaderCard extends StatelessWidget {
100122 ? 'Mycelium Started'
101123 : isConnecting
102124 ? 'Starting Mycelium...'
103- : status == NodeStatus .failed
125+ : widget. status == NodeStatus .failed
104126 ? 'Start Failed'
105127 : 'Mycelium Stopped' ,
106128 style: Theme .of (context).textTheme.headlineMedium,
@@ -115,22 +137,43 @@ class _HeaderCard extends StatelessWidget {
115137 const SizedBox (height: AppSpacing .xxl),
116138 AppButton (
117139 label: isConnected ? 'Stop Mycelium' : 'Start Mycelium' ,
118- onPressed: isConnected ? onDisconnect : onConnect ,
140+ onPressed: isConnected ? stopMycelium : startMycelium ,
119141 isLoading: isConnecting,
120142 ),
121143 const SizedBox (height: AppSpacing .lg),
122- AppCard (
123- margin: EdgeInsets .zero,
124- child: Row (
125- mainAxisAlignment: MainAxisAlignment .center,
126- children: const [
127- Icon (Icons .restart_alt_rounded),
128- SizedBox (width: AppSpacing .sm),
129- Flexible (
130- child:
131- Text ('Restart Mycelium' , overflow: TextOverflow .ellipsis),
144+ Visibility (
145+ visible: isRestartVisible,
146+ child: SizedBox (
147+ width: double .infinity,
148+ height: 48 ,
149+ child: ElevatedButton (
150+ style: ElevatedButton .styleFrom (
151+ backgroundColor:
152+ Theme .of (context).cardColor,
153+ foregroundColor: Theme .of (context)
154+ .colorScheme
155+ .onSurface,
156+ padding: const EdgeInsets .symmetric (horizontal: 16 ),
157+ shape: RoundedRectangleBorder (
158+ borderRadius: BorderRadius .circular (10 ),
159+ ),
160+ textStyle: const TextStyle (fontSize: 16 ),
132161 ),
133- ],
162+ child: const Text .rich (
163+ TextSpan (
164+ children: [
165+ WidgetSpan (
166+ child: Icon (Icons .restart_alt_rounded, size: 20 ),
167+ ),
168+ TextSpan (text: " Restart Mycelium" ),
169+ ],
170+ ),
171+ ),
172+ onPressed: () async {
173+ await stopMycelium ();
174+ await startMycelium ();
175+ },
176+ ),
134177 ),
135178 ),
136179 const SizedBox (height: AppSpacing .lg),
0 commit comments