Skip to content

Commit d40bd5f

Browse files
committed
handle mycelium restart
1 parent d029290 commit d40bd5f

1 file changed

Lines changed: 61 additions & 18 deletions

File tree

lib/features/home/home_screen.dart

Lines changed: 61 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)