import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:get/get.dart'; import 'dart:ui'; import '../../constant/colors.dart'; class SnackbarConfig { static const duration = Duration(seconds: 4); static const animationDuration = Duration(milliseconds: 400); static const margin = EdgeInsets.symmetric(horizontal: 16, vertical: 12); static const borderRadius = 16.0; static const elevation = 0.0; // تقليل الارتفاع لأننا سنستخدم تأثيرات زجاجية // تأثير زجاجي static const double blurStrength = 15.0; static const double opacity = 0.85; // حدود شفافة static final Border glassBorder = Border.all( color: Colors.white.withOpacity(0.25), width: 1.5, ); // ظل أكثر نعومة وانتشار static final List shadows = [ BoxShadow( color: Colors.black.withOpacity(0.15), blurRadius: 12, spreadRadius: 1, offset: const Offset(0, 4), ), BoxShadow( color: Colors.black.withOpacity(0.08), blurRadius: 20, spreadRadius: 0, offset: const Offset(0, 2), ), ]; } // تطبيق تأثير زجاجي باستخدام Container مخصص class GlassSnackbar extends StatelessWidget { final Color baseColor; final Widget child; const GlassSnackbar({ required this.baseColor, required this.child, Key? key, }) : super(key: key); @override Widget build(BuildContext context) { return ClipRRect( borderRadius: BorderRadius.circular(SnackbarConfig.borderRadius), child: BackdropFilter( filter: ImageFilter.blur( sigmaX: SnackbarConfig.blurStrength, sigmaY: SnackbarConfig.blurStrength, ), child: Container( decoration: BoxDecoration( color: baseColor.withOpacity(SnackbarConfig.opacity), borderRadius: BorderRadius.circular(SnackbarConfig.borderRadius), border: SnackbarConfig.glassBorder, boxShadow: SnackbarConfig.shadows, gradient: LinearGradient( begin: Alignment.topLeft, end: Alignment.bottomRight, colors: [ baseColor.withOpacity(SnackbarConfig.opacity + 0.05), baseColor.withOpacity(SnackbarConfig.opacity - 0.05), ], ), ), child: child, ), ), ); } } SnackbarController mySnackeBarError(String message) { // تأثير اهتزاز للأخطاء HapticFeedback.mediumImpact(); final Color errorBaseColor = AppColor.redColor; return Get.snackbar( '', '', snackPosition: SnackPosition.TOP, margin: SnackbarConfig.margin, duration: SnackbarConfig.duration, animationDuration: SnackbarConfig.animationDuration, borderRadius: SnackbarConfig.borderRadius, backgroundColor: Colors.transparent, // شفاف لأننا سنستخدم حاوية مخصصة barBlur: 0, // إيقاف تشويش الخلفية الافتراضي لأننا سنستخدم BlurFilter overlayBlur: 1.5, overlayColor: Colors.black12, userInputForm: Form( child: GlassSnackbar( baseColor: errorBaseColor, child: Padding( padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 14), child: Row( children: [ // أيقونة متحركة TweenAnimationBuilder( tween: Tween(begin: 0.0, end: 1.0), duration: const Duration(milliseconds: 500), curve: Curves.elasticOut, builder: (context, value, child) { return Transform.scale( scale: value, child: child, ); }, child: Container( padding: const EdgeInsets.all(8), decoration: BoxDecoration( color: Colors.white.withOpacity(0.25), shape: BoxShape.circle, ), child: const Icon( Icons.error_rounded, color: Colors.white, size: 26, ), ), ), const SizedBox(width: 16), // محتوى النص Expanded( child: Column( crossAxisAlignment: CrossAxisAlignment.start, mainAxisSize: MainAxisSize.min, children: [ Text( 'Error'.tr, style: const TextStyle( fontWeight: FontWeight.w700, color: Colors.white, fontSize: 16, letterSpacing: 0.3, shadows: [ Shadow( color: Colors.black26, offset: Offset(0, 1), blurRadius: 2, ), ], ), ), const SizedBox(height: 4), Text( message, style: const TextStyle( color: Colors.white, fontSize: 14, height: 1.3, fontWeight: FontWeight.w400, ), ), ], ), ), // زر الإغلاق InkWell( onTap: () { HapticFeedback.lightImpact(); Get.closeCurrentSnackbar(); }, child: Container( padding: const EdgeInsets.all(4), decoration: BoxDecoration( color: Colors.white.withOpacity(0.2), shape: BoxShape.circle, ), child: const Icon( Icons.close_rounded, color: Colors.white, size: 18, ), ), ), ], ), ), ), ), isDismissible: true, dismissDirection: DismissDirection.horizontal, forwardAnimationCurve: Curves.easeOutBack, reverseAnimationCurve: Curves.easeInCubic, ); } SnackbarController mySnackbarSuccess(String message) { // تأثير اهتزاز للنجاح HapticFeedback.lightImpact(); final Color successBaseColor = AppColor.greenColor; return Get.snackbar( '', '', snackPosition: SnackPosition.TOP, margin: SnackbarConfig.margin, duration: SnackbarConfig.duration, animationDuration: SnackbarConfig.animationDuration, borderRadius: SnackbarConfig.borderRadius, backgroundColor: Colors.transparent, // شفاف لأننا سنستخدم حاوية مخصصة barBlur: 0, // إيقاف تشويش الخلفية الافتراضي لأننا سنستخدم BlurFilter overlayBlur: 1.5, overlayColor: Colors.black12, userInputForm: Form( child: GlassSnackbar( baseColor: successBaseColor, child: Padding( padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 14), child: Row( children: [ // أيقونة متحركة TweenAnimationBuilder( tween: Tween(begin: 0.0, end: 1.0), duration: const Duration(milliseconds: 600), curve: Curves.elasticOut, builder: (context, value, child) { return Transform.scale( scale: value, child: child, ); }, child: Container( padding: const EdgeInsets.all(8), decoration: BoxDecoration( color: Colors.white.withOpacity(0.25), shape: BoxShape.circle, ), child: const Icon( Icons.check_circle_rounded, color: Colors.white, size: 26, ), ), ), const SizedBox(width: 16), // محتوى النص Expanded( child: Column( crossAxisAlignment: CrossAxisAlignment.start, mainAxisSize: MainAxisSize.min, children: [ Text( 'Success'.tr, style: const TextStyle( fontWeight: FontWeight.w700, color: Colors.white, fontSize: 16, letterSpacing: 0.3, shadows: [ Shadow( color: Colors.black26, offset: Offset(0, 1), blurRadius: 2, ), ], ), ), const SizedBox(height: 4), Text( message, style: const TextStyle( color: Colors.white, fontSize: 14, height: 1.3, fontWeight: FontWeight.w400, ), ), ], ), ), // زر الإغلاق InkWell( onTap: () { HapticFeedback.lightImpact(); Get.closeCurrentSnackbar(); }, child: Container( padding: const EdgeInsets.all(4), decoration: BoxDecoration( color: Colors.white.withOpacity(0.2), shape: BoxShape.circle, ), child: const Icon( Icons.close_rounded, color: Colors.white, size: 18, ), ), ), ], ), ), ), ), isDismissible: true, dismissDirection: DismissDirection.horizontal, forwardAnimationCurve: Curves.easeOutBack, reverseAnimationCurve: Curves.easeInCubic, ); } // إضافة: دالة للمعلومات والتنبيهات SnackbarController mySnackbarInfo(String message) { // تأثير اهتزاز خفيف HapticFeedback.selectionClick(); final Color infoBaseColor = Colors.blue; return Get.snackbar( '', '', snackPosition: SnackPosition.TOP, margin: SnackbarConfig.margin, duration: SnackbarConfig.duration, animationDuration: SnackbarConfig.animationDuration, borderRadius: SnackbarConfig.borderRadius, backgroundColor: Colors.transparent, // شفاف لأننا سنستخدم حاوية مخصصة barBlur: 0, // إيقاف تشويش الخلفية الافتراضي لأننا سنستخدم BlurFilter overlayBlur: 1.5, overlayColor: Colors.black12, userInputForm: Form( child: GlassSnackbar( baseColor: infoBaseColor, child: Padding( padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 14), child: Row( children: [ // أيقونة متحركة TweenAnimationBuilder( tween: Tween(begin: 0.0, end: 1.0), duration: const Duration(milliseconds: 500), curve: Curves.elasticOut, builder: (context, value, child) { return Transform.scale( scale: value, child: child, ); }, child: Container( padding: const EdgeInsets.all(8), decoration: BoxDecoration( color: Colors.white.withOpacity(0.25), shape: BoxShape.circle, ), child: const Icon( Icons.info_rounded, color: Colors.white, size: 26, ), ), ), const SizedBox(width: 16), // محتوى النص Expanded( child: Column( crossAxisAlignment: CrossAxisAlignment.start, mainAxisSize: MainAxisSize.min, children: [ Text( 'Info'.tr, style: const TextStyle( fontWeight: FontWeight.w700, color: Colors.white, fontSize: 16, letterSpacing: 0.3, shadows: [ Shadow( color: Colors.black26, offset: Offset(0, 1), blurRadius: 2, ), ], ), ), const SizedBox(height: 4), Text( message, style: const TextStyle( color: Colors.white, fontSize: 14, height: 1.3, fontWeight: FontWeight.w400, ), ), ], ), ), // زر الإغلاق InkWell( onTap: () { HapticFeedback.lightImpact(); Get.closeCurrentSnackbar(); }, child: Container( padding: const EdgeInsets.all(4), decoration: BoxDecoration( color: Colors.white.withOpacity(0.2), shape: BoxShape.circle, ), child: const Icon( Icons.close_rounded, color: Colors.white, size: 18, ), ), ), ], ), ), ), ), isDismissible: true, dismissDirection: DismissDirection.horizontal, forwardAnimationCurve: Curves.easeOutBack, reverseAnimationCurve: Curves.easeInCubic, ); } // إضافة: دالة للتحذيرات SnackbarController mySnackbarWarning(String message) { // تأثير اهتزاز متوسط HapticFeedback.mediumImpact(); final Color warningBaseColor = Colors.orange; return Get.snackbar( '', '', snackPosition: SnackPosition.TOP, margin: SnackbarConfig.margin, duration: SnackbarConfig.duration, animationDuration: SnackbarConfig.animationDuration, borderRadius: SnackbarConfig.borderRadius, backgroundColor: Colors.transparent, // شفاف لأننا سنستخدم حاوية مخصصة barBlur: 0, // إيقاف تشويش الخلفية الافتراضي لأننا سنستخدم BlurFilter overlayBlur: 1.5, overlayColor: Colors.black12, userInputForm: Form( child: GlassSnackbar( baseColor: warningBaseColor, child: Padding( padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 14), child: Row( children: [ // أيقونة متحركة TweenAnimationBuilder( tween: Tween(begin: 0.0, end: 1.0), duration: const Duration(milliseconds: 500), curve: Curves.elasticOut, builder: (context, value, child) { return Transform.scale( scale: value, child: child, ); }, child: Container( padding: const EdgeInsets.all(8), decoration: BoxDecoration( color: Colors.white.withOpacity(0.25), shape: BoxShape.circle, ), child: const Icon( Icons.warning_rounded, color: Colors.white, size: 26, ), ), ), const SizedBox(width: 16), // محتوى النص Expanded( child: Column( crossAxisAlignment: CrossAxisAlignment.start, mainAxisSize: MainAxisSize.min, children: [ Text( 'Warning'.tr, style: const TextStyle( fontWeight: FontWeight.w700, color: Colors.white, fontSize: 16, letterSpacing: 0.3, shadows: [ Shadow( color: Colors.black26, offset: Offset(0, 1), blurRadius: 2, ), ], ), ), const SizedBox(height: 4), Text( message, style: const TextStyle( color: Colors.white, fontSize: 14, height: 1.3, fontWeight: FontWeight.w400, ), ), ], ), ), // زر الإغلاق InkWell( onTap: () { HapticFeedback.lightImpact(); Get.closeCurrentSnackbar(); }, child: Container( padding: const EdgeInsets.all(4), decoration: BoxDecoration( color: Colors.white.withOpacity(0.2), shape: BoxShape.circle, ), child: const Icon( Icons.close_rounded, color: Colors.white, size: 18, ), ), ), ], ), ), ), ), isDismissible: true, dismissDirection: DismissDirection.horizontal, forwardAnimationCurve: Curves.easeOutBack, reverseAnimationCurve: Curves.easeInCubic, ); }