QuickSSH/lib/widgets/server_status_tile.dart

88 lines
2.4 KiB
Dart

import 'package:flutter/material.dart';
import 'package:QuickSSH/classes/ServerCommand.dart';
import 'package:QuickSSH/services/SSHService.dart';
import 'package:flutter/services.dart';
class ServerStatusTile extends StatelessWidget {
final ServerCommand command;
final VoidCallback onEdit;
const ServerStatusTile({
super.key,
required this.command,
required this.onEdit,
});
@override
Widget build(BuildContext context) {
final theme = Theme.of(context).colorScheme;
return Card(
clipBehavior: Clip.antiAlias,
color: theme.primaryContainer,
child: InkWell(
splashColor: const Color.fromARGB(
47,
255,
255,
255,
), // Custom ripple color!
highlightColor: Colors.transparent,
onDoubleTap: () {
HapticFeedback.heavyImpact();
_handleCommandTap(context, command);
},
onLongPress: () {
HapticFeedback.heavyImpact();
onEdit();
},
child: IgnorePointer(
child: ListTile(
title: Text(
command.name,
style: TextStyle(
fontWeight: FontWeight.bold,
fontSize: 20,
color: theme.onSurface,
),
),
subtitle: Text(
"${command.username}@${command.ip}",
style: TextStyle(color: theme.onSurfaceVariant),
),
),
),
),
);
}
void _handleCommandTap(BuildContext context, ServerCommand cmd) async {
// Show a "Loading" snackbar
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(20)),
behavior: SnackBarBehavior.floating,
content: Text("Connecting to ${cmd.ip} as ${cmd.username}..."),
duration: Duration(seconds: 2),
backgroundColor: const Color.fromARGB(255, 56, 159, 243),
),
);
// Run the SSH command
String output = await SSHService.execute(cmd);
// Show the final result from the server
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(20)),
behavior: SnackBarBehavior.floating,
content: Text(output.isEmpty ? "Command executed (no output)" : output),
backgroundColor: output.contains("Error") ? Colors.red : Colors.green,
),
);
}
}