diff --git a/lib/presentation/widgets/buttons/animated_dialog_button.dart b/lib/presentation/widgets/buttons/animated_dialog_button.dart deleted file mode 100644 index 798edfa..0000000 --- a/lib/presentation/widgets/buttons/animated_dialog_button.dart +++ /dev/null @@ -1,50 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:tallee/core/custom_theme.dart'; - -class AnimatedDialogButton extends StatefulWidget { - /// A custom animated button widget that provides a scaling and opacity effect - /// when pressed. - /// - [onPressed]: Callback function that is triggered when the button is pressed. - /// - [child]: The child widget to be displayed inside the button, typically a text or icon. - const AnimatedDialogButton({ - super.key, - required this.onPressed, - required this.child, - }); - - /// Callback function that is triggered when the button is pressed. - final VoidCallback onPressed; - - /// The child widget to be displayed inside the button, typically a text or icon. - final Widget child; - - @override - State createState() => _AnimatedDialogButtonState(); -} - -class _AnimatedDialogButtonState extends State { - bool _isPressed = false; - - @override - Widget build(BuildContext context) { - return GestureDetector( - onTapDown: (_) => setState(() => _isPressed = true), - onTapUp: (_) => setState(() => _isPressed = false), - onTapCancel: () => setState(() => _isPressed = false), - onTap: widget.onPressed, - child: AnimatedScale( - scale: _isPressed ? 0.95 : 1.0, - duration: const Duration(milliseconds: 100), - child: AnimatedOpacity( - opacity: _isPressed ? 0.6 : 1.0, - duration: const Duration(milliseconds: 100), - child: Container( - decoration: CustomTheme.standardBoxDecoration, - padding: const EdgeInsets.symmetric(horizontal: 26, vertical: 6), - child: widget.child, - ), - ), - ), - ); - } -} diff --git a/lib/presentation/widgets/dialog/animated_dialog_button.dart b/lib/presentation/widgets/dialog/animated_dialog_button.dart new file mode 100644 index 0000000..3875995 --- /dev/null +++ b/lib/presentation/widgets/dialog/animated_dialog_button.dart @@ -0,0 +1,84 @@ +import 'package:flutter/material.dart'; +import 'package:tallee/core/enums.dart'; + +class AnimatedDialogButton extends StatefulWidget { + /// A custom animated button widget that provides a scaling and opacity effect + /// when pressed. + /// - [onPressed]: Callback function that is triggered when the button is pressed. + /// - [child]: The child widget to be displayed inside the button, typically a text or icon. + const AnimatedDialogButton({ + super.key, + required this.onPressed, + required this.text, + this.buttonType = ButtonType.primary, + }); + + /// Callback function that is triggered when the button is pressed. + final VoidCallback onPressed; + + /// The text to be displayed on the button. + final String text; + + final ButtonType buttonType; + + @override + State createState() => _AnimatedDialogButtonState(); +} + +class _AnimatedDialogButtonState extends State { + bool _isPressed = false; + + @override + Widget build(BuildContext context) { + final textStyling = TextStyle( + color: widget.buttonType == ButtonType.primary + ? Colors.black + : Colors.white, + fontSize: 16, + fontWeight: FontWeight.bold, + ); + + final buttonDecoration = widget.buttonType == ButtonType.primary + // Primary + ? BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(12), + ) + : widget.buttonType == ButtonType.secondary + // Secondary + ? BoxDecoration( + border: BoxBorder.all(color: Colors.white, width: 2), + borderRadius: BorderRadius.circular(12), + ) + // Tertiary + : const BoxDecoration(); + + return GestureDetector( + onTapDown: (_) => setState(() => _isPressed = true), + onTapUp: (_) => setState(() => _isPressed = false), + onTapCancel: () => setState(() => _isPressed = false), + onTap: widget.onPressed, + child: AnimatedScale( + scale: _isPressed ? 0.95 : 1.0, + duration: const Duration(milliseconds: 100), + child: AnimatedOpacity( + opacity: _isPressed ? 0.6 : 1.0, + duration: const Duration(milliseconds: 100), + child: Center( + child: Container( + constraints: const BoxConstraints(minWidth: 300), + decoration: buttonDecoration, + padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 12), + margin: const EdgeInsets.symmetric(vertical: 8), + child: Text( + widget.text, + style: textStyling, + textAlign: TextAlign.center, + ), + ), + ), + ), + ), + ); + } +} diff --git a/lib/presentation/widgets/custom_alert_dialog.dart b/lib/presentation/widgets/dialog/custom_alert_dialog.dart similarity index 74% rename from lib/presentation/widgets/custom_alert_dialog.dart rename to lib/presentation/widgets/dialog/custom_alert_dialog.dart index bf98f2c..606fc49 100644 --- a/lib/presentation/widgets/custom_alert_dialog.dart +++ b/lib/presentation/widgets/dialog/custom_alert_dialog.dart @@ -1,5 +1,6 @@ import 'package:flutter/material.dart'; import 'package:tallee/core/custom_theme.dart'; +import 'package:tallee/presentation/widgets/dialog/custom_dialog_action.dart'; class CustomAlertDialog extends StatelessWidget { /// A custom alert dialog widget that provides a os unspecific AlertDialog, @@ -16,20 +17,23 @@ class CustomAlertDialog extends StatelessWidget { }); final String title; - final String content; - final List actions; + final Widget content; + final List actions; @override Widget build(BuildContext context) { return AlertDialog( - title: Text(title, style: const TextStyle(color: CustomTheme.textColor)), - content: Text( - content, - style: const TextStyle(color: CustomTheme.textColor), + title: Text( + title, + style: const TextStyle( + fontWeight: FontWeight.bold, + color: CustomTheme.textColor, + ), ), + content: content, actions: actions, backgroundColor: CustomTheme.boxColor, - actionsAlignment: MainAxisAlignment.spaceAround, + actionsAlignment: MainAxisAlignment.center, shape: RoundedRectangleBorder( borderRadius: CustomTheme.standardBorderRadiusAll, side: const BorderSide(color: CustomTheme.boxBorderColor),