import 'dart:ui'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:get/get.dart'; import '../../constant/colors.dart'; import '../../constant/style.dart'; class DialogConfig { static const Duration animationDuration = Duration(milliseconds: 200); static const double blurStrength = 8.0; static const double cornerRadius = 14.0; static final BoxDecoration decoration = BoxDecoration( borderRadius: BorderRadius.circular(cornerRadius), boxShadow: [ BoxShadow( color: Colors.black.withAlpha(38), // 0.15 opacity blurRadius: 16, offset: const Offset(0, 8), ), ], ); } class MyDialog extends GetxController { void getDialog(String title, String? midTitle, VoidCallback onPressed) { HapticFeedback.mediumImpact(); Get.dialog( TweenAnimationBuilder( duration: DialogConfig.animationDuration, tween: Tween(begin: 0.0, end: 1.0), builder: (context, value, child) { return Transform.scale( scale: 0.95 + (0.05 * value), child: Opacity(opacity: value, child: child), ); }, child: BackdropFilter( filter: ImageFilter.blur( sigmaX: DialogConfig.blurStrength, sigmaY: DialogConfig.blurStrength, ), child: AlertDialog( backgroundColor: AppColor.surfaceElevated, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(24)), title: Text( title, textAlign: TextAlign.center, style: AppStyle.headTitle, ), content: midTitle != null ? Text( midTitle, textAlign: TextAlign.center, style: AppStyle.subtitle, ) : null, actionsPadding: const EdgeInsets.fromLTRB(16, 0, 16, 16), actions: [ Row( children: [ Expanded( child: TextButton( onPressed: () => Get.back(), style: TextButton.styleFrom( padding: const EdgeInsets.symmetric(vertical: 16), shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(12), side: const BorderSide(color: AppColor.divider), ), ), child: Text('Cancel'.tr, style: AppStyle.subtitle), ), ), const SizedBox(width: 12), Expanded( child: ElevatedButton( onPressed: () { HapticFeedback.mediumImpact(); onPressed(); }, style: ElevatedButton.styleFrom( backgroundColor: AppColor.accent, foregroundColor: Colors.white, padding: const EdgeInsets.symmetric(vertical: 16), shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(12), ), elevation: 0, ), child: Text('OK'.tr, style: AppStyle.title.copyWith(color: Colors.white)), ), ), ], ), ], ), ), ), barrierColor: Colors.black54, ); } } class MyDialogContent extends GetxController { void getDialog(String title, Widget? content, VoidCallback onPressed) { HapticFeedback.mediumImpact(); Get.dialog( TweenAnimationBuilder( duration: DialogConfig.animationDuration, tween: Tween(begin: 0.0, end: 1.0), builder: (context, value, child) { return Transform.scale( scale: 0.95 + (0.05 * value), child: Opacity(opacity: value, child: child), ); }, child: BackdropFilter( filter: ImageFilter.blur( sigmaX: DialogConfig.blurStrength, sigmaY: DialogConfig.blurStrength, ), child: AlertDialog( backgroundColor: AppColor.surfaceElevated, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(24)), title: Text( title, textAlign: TextAlign.center, style: AppStyle.headTitle, ), content: content != null ? SingleChildScrollView(child: content) : null, actionsPadding: const EdgeInsets.fromLTRB(16, 0, 16, 16), actions: [ Row( children: [ Expanded( child: TextButton( onPressed: () => Get.back(), style: TextButton.styleFrom( padding: const EdgeInsets.symmetric(vertical: 16), shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(12), side: const BorderSide(color: AppColor.divider), ), ), child: Text('Cancel'.tr, style: AppStyle.subtitle), ), ), const SizedBox(width: 12), Expanded( child: ElevatedButton( onPressed: () { HapticFeedback.mediumImpact(); onPressed(); }, style: ElevatedButton.styleFrom( backgroundColor: AppColor.accent, foregroundColor: Colors.white, padding: const EdgeInsets.symmetric(vertical: 16), shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(12), ), elevation: 0, ), child: Text('OK'.tr, style: AppStyle.title.copyWith(color: Colors.white)), ), ), ], ), ], ), ), ), barrierColor: Colors.black54, ); } }