Files
Casha/lib/shared/widgets/error_snackbar.dart
2026-03-29 15:59:49 +03:00

162 lines
4.5 KiB
Dart

import 'package:flutter/material.dart';
import '../../core/utils/result.dart';
void showErrorSnackbar(BuildContext context, String message) {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Row(
children: [
const Icon(Icons.error_outline, color: Colors.white),
const SizedBox(width: 12),
Expanded(child: Text(message, style: const TextStyle(fontSize: 14))),
],
),
backgroundColor: const Color(0xFFE05C6B),
behavior: SnackBarBehavior.floating,
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(12)),
margin: const EdgeInsets.all(16),
duration: const Duration(seconds: 4),
action: SnackBarAction(
label: 'OK',
textColor: Colors.white,
onPressed: () {
ScaffoldMessenger.of(context).hideCurrentSnackBar();
},
),
),
);
}
void showSuccessSnackbar(BuildContext context, String message) {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Row(
children: [
const Icon(Icons.check_circle_outline, color: Colors.white),
const SizedBox(width: 12),
Expanded(child: Text(message, style: const TextStyle(fontSize: 14))),
],
),
backgroundColor: const Color(0xFF4CAF8C),
behavior: SnackBarBehavior.floating,
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(12)),
margin: const EdgeInsets.all(16),
duration: const Duration(seconds: 2),
),
);
}
void showWarningSnackbar(BuildContext context, String message) {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Row(
children: [
const Icon(Icons.warning_amber_rounded, color: Colors.white),
const SizedBox(width: 12),
Expanded(child: Text(message, style: const TextStyle(fontSize: 14))),
],
),
backgroundColor: const Color(0xFFFFB74D),
behavior: SnackBarBehavior.floating,
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(12)),
margin: const EdgeInsets.all(16),
duration: const Duration(seconds: 3),
),
);
}
extension ResultUIExtension<T> on Result<T> {
Result<T> showErrorOnFailure(BuildContext context) {
onFailure((message) => showErrorSnackbar(context, message));
return this;
}
Result<T> showSuccessMessage(BuildContext context, String message) {
onSuccess((_) => showSuccessSnackbar(context, message));
return this;
}
}
extension FutureResultUIExtension<T> on Future<Result<T>> {
Future<Result<T>> showErrorOnFailure(BuildContext context) async {
final result = await this;
result.onFailure((message) => showErrorSnackbar(context, message));
return result;
}
Future<Result<T>> showSuccessMessage(
BuildContext context,
String message,
) async {
final result = await this;
result.onSuccess((_) => showSuccessSnackbar(context, message));
return result;
}
Future<Result<T>> showFeedback(
BuildContext context, {
required String successMessage,
}) async {
final result = await this;
result
.onSuccess((_) => showSuccessSnackbar(context, successMessage))
.onFailure((message) => showErrorSnackbar(context, message));
return result;
}
}
class ErrorDialog extends StatelessWidget {
final String title;
final String message;
final VoidCallback? onRetry;
const ErrorDialog({
super.key,
required this.title,
required this.message,
this.onRetry,
});
@override
Widget build(BuildContext context) {
return AlertDialog(
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(16)),
title: Row(
children: [
const Icon(Icons.error_outline, color: Color(0xFFE05C6B), size: 28),
const SizedBox(width: 12),
Text(title),
],
),
content: Text(message),
actions: [
if (onRetry != null)
TextButton(
onPressed: () {
Navigator.of(context).pop();
onRetry!();
},
child: const Text('Retry'),
),
TextButton(
onPressed: () => Navigator.of(context).pop(),
child: const Text('OK'),
),
],
);
}
static Future<void> show(
BuildContext context, {
required String title,
required String message,
VoidCallback? onRetry,
}) {
return showDialog(
context: context,
builder: (context) =>
ErrorDialog(title: title, message: message, onRetry: onRetry),
);
}
}