import 'package:flutter/material.dart'; import '../l10n/strings.dart'; import '../services/ssh_service.dart'; void showFailure(BuildContext context, Object error) { if (!context.mounted) return; ScaffoldMessenger.of(context).showSnackBar( SnackBar( content: Text(context.tr(failureCode(error))), duration: const Duration(seconds: 8), ), ); } Future confirm( BuildContext context, String key, { String? detail, }) async => await showDialog( context: context, builder: (ctx) => AlertDialog( title: Text(ctx.tr(key)), content: detail == null ? null : SelectableText(detail), actions: [ TextButton( onPressed: () => Navigator.pop(ctx, false), child: Text(ctx.tr('cancel')), ), FilledButton( onPressed: () => Navigator.pop(ctx, true), child: Text(ctx.tr('continueAction')), ), ], ), ) ?? false; Future askName( BuildContext context, String title, { String initial = '', }) async { final field = TextEditingController(text: initial); final result = await showDialog( context: context, builder: (ctx) => AlertDialog( title: Text(ctx.tr(title)), content: TextField( controller: field, autofocus: true, decoration: InputDecoration(labelText: ctx.tr('name')), ), actions: [ TextButton( onPressed: () => Navigator.pop(ctx), child: Text(ctx.tr('cancel')), ), FilledButton( onPressed: () => Navigator.pop(ctx, field.text), child: Text(ctx.tr('save')), ), ], ), ); Future.delayed(const Duration(seconds: 1), field.dispose); return result; } class PageMessage extends StatelessWidget { final String label; final IconData icon; const PageMessage(this.label, {this.icon = Icons.dns_outlined, super.key}); @override Widget build(BuildContext context) => LayoutBuilder( // Centered when it fits, scrollable in short windows. builder: (context, constraints) => SingleChildScrollView( child: ConstrainedBox( constraints: BoxConstraints(minHeight: constraints.maxHeight), child: Center( child: Padding( padding: const EdgeInsets.all(28), child: Column( mainAxisSize: MainAxisSize.min, children: [ Icon( icon, size: 48, color: Theme.of(context).colorScheme.primary, ), const SizedBox(height: 20), Text(context.tr(label), textAlign: TextAlign.center), ], ), ), ), ), ), ); }