import 'package:flutter/material.dart'; import '../i18n/strings.g.dart'; /// Utility functions for showing common dialogs const _buttonPadding = EdgeInsets.symmetric(horizontal: 18, vertical: 14); const _buttonShape = StadiumBorder(); /// Shows a confirmation dialog with consistent button sizing and autofocus. /// Returns true if user confirmed, false if cancelled. Future showConfirmDialog( BuildContext context, { required String title, required String message, required String confirmText, String? cancelText, bool isDestructive = false, }) async { final confirmed = await showDialog( context: context, builder: (dialogContext) { final colorScheme = Theme.of(dialogContext).colorScheme; return AlertDialog( title: Text(title), content: Text(message), actions: [ TextButton( autofocus: true, onPressed: () => Navigator.pop(dialogContext, false), style: TextButton.styleFrom(padding: _buttonPadding, shape: _buttonShape), child: Text(cancelText ?? t.common.cancel), ), FilledButton( onPressed: () => Navigator.pop(dialogContext, true), style: isDestructive ? FilledButton.styleFrom(backgroundColor: colorScheme.error) : null, child: Text(confirmText), ), ], ); }, ); return confirmed ?? false; } /// Shows a delete confirmation dialog. /// Convenience wrapper around [showConfirmDialog] with destructive styling. Future showDeleteConfirmation(BuildContext context, {required String title, required String message}) { return showConfirmDialog(context, title: title, message: message, confirmText: t.common.delete, isDestructive: true); } /// Shows a text input dialog for creating/naming items /// Returns the entered text, or null if cancelled Future showTextInputDialog( BuildContext context, { required String title, required String labelText, required String hintText, String? initialValue, }) async { return showDialog( context: context, builder: (context) => _TextInputDialog(title: title, labelText: labelText, hintText: hintText, initialValue: initialValue), ); } class _TextInputDialog extends StatefulWidget { final String title; final String labelText; final String hintText; final String? initialValue; const _TextInputDialog({required this.title, required this.labelText, required this.hintText, this.initialValue}); @override State<_TextInputDialog> createState() => _TextInputDialogState(); } class _TextInputDialogState extends State<_TextInputDialog> { late final TextEditingController _controller; @override void initState() { super.initState(); _controller = TextEditingController(text: widget.initialValue); } @override void dispose() { _controller.dispose(); super.dispose(); } void _submit() { if (_controller.text.isNotEmpty) { Navigator.pop(context, _controller.text); } } @override Widget build(BuildContext context) { return AlertDialog( title: Text(widget.title), content: TextField( controller: _controller, autofocus: true, decoration: InputDecoration(labelText: widget.labelText, hintText: widget.hintText), onSubmitted: (_) => _submit(), ), actions: [ TextButton(onPressed: () => Navigator.pop(context), child: Text(t.common.cancel)), TextButton(onPressed: _submit, child: Text(t.common.save)), ], ); } }