diff --git a/lib/astromic_helpers.dart b/lib/astromic_helpers.dart index 49de82f..93d68a4 100644 --- a/lib/astromic_helpers.dart +++ b/lib/astromic_helpers.dart @@ -4,3 +4,5 @@ export 'src/form/form_helper.astromic.dart'; export 'src/loading/loading_helper.astromic.dart'; export 'src/sheet/sheet_helper.astromic.dart'; export 'src/presenting/presenting_helper.astromic.dart'; +export 'src/snackbar/snackbar_helper.astromic.dart'; +export 'src/dialog/dialog_helper.astromic.dart'; diff --git a/lib/src/dialog/dialog_helper.astromic.dart b/lib/src/dialog/dialog_helper.astromic.dart new file mode 100644 index 0000000..70bde0c --- /dev/null +++ b/lib/src/dialog/dialog_helper.astromic.dart @@ -0,0 +1,59 @@ +import 'package:flutter/material.dart'; +import './src/models/models.exports.dart'; + +class AstromicDialogHelper { + /// Show a dialog. + static Future show( + BuildContext context, { + required Widget contentSection, + Widget? stackedCloseWidget, + AstromicDialogConfiguration configuration = const AstromicDialogConfiguration(), + AstromicDialogStyle style = const AstromicDialogStyle(), + void Function(T?)? onClose, + }) async { + // + return await showDialog( + context: context, + useSafeArea: configuration.safeAreaAware, + builder: (BuildContext _) { + return Container( + margin: style.placement, + // + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Row( + mainAxisSize: MainAxisSize.min, + children: [ + Stack( + children: [ + Container( + width: (style.width ?? 0) - ((style.placement?.start ?? 0) + (style.placement?.start ?? 0)), + // + padding: style.contentPadding, + decoration: BoxDecoration( + color: style.backgroundColor, + borderRadius: style.radius, + ), + child: contentSection, + ), + if (stackedCloseWidget != null) + Positioned.directional( + textDirection: style.textDirection, + start: style.closeWidgetPlacement?.start, + end: style.closeWidgetPlacement?.end, + top: style.closeWidgetPlacement?.top, + // + child: stackedCloseWidget, + ), + ], + ), + ], + ), + ], + ), + ); + }); + // + } +} diff --git a/lib/src/dialog/src/models/configuration.model.dart b/lib/src/dialog/src/models/configuration.model.dart new file mode 100644 index 0000000..3bb65b7 --- /dev/null +++ b/lib/src/dialog/src/models/configuration.model.dart @@ -0,0 +1,20 @@ +class AstromicDialogConfiguration { + // + final bool isCentered; + final bool safeAreaAware; + const AstromicDialogConfiguration({ + this.isCentered = true, + this.safeAreaAware = true, + }); + // + + AstromicDialogConfiguration copyWith({ + bool? isCentered, + bool? safeAreaAware, + }) { + return AstromicDialogConfiguration( + isCentered: isCentered ?? this.isCentered, + safeAreaAware: safeAreaAware ?? this.safeAreaAware, + ); + } +} diff --git a/lib/src/dialog/src/models/models.exports.dart b/lib/src/dialog/src/models/models.exports.dart new file mode 100644 index 0000000..be581d0 --- /dev/null +++ b/lib/src/dialog/src/models/models.exports.dart @@ -0,0 +1,2 @@ +export './style.model.dart'; +export './configuration.model.dart'; diff --git a/lib/src/dialog/src/models/style.model.dart b/lib/src/dialog/src/models/style.model.dart new file mode 100644 index 0000000..4af7c51 --- /dev/null +++ b/lib/src/dialog/src/models/style.model.dart @@ -0,0 +1,25 @@ +import 'package:flutter/material.dart'; + +class AstromicDialogStyle { + // + final Color? backgroundColor; + final BorderRadius? radius; + final EdgeInsets? contentPadding; + final double? width; + final double? height; + final TextDirection textDirection; + final EdgeInsetsDirectional? placement; + final EdgeInsetsDirectional? closeWidgetPlacement; + + const AstromicDialogStyle({ + this.backgroundColor = Colors.white, + this.radius, + this.contentPadding = const EdgeInsets.all(12.0), + this.width = 300, + this.height, + this.textDirection = TextDirection.ltr, + this.placement, + this.closeWidgetPlacement, + }); + // +} diff --git a/lib/src/dialog/src/src.exports.dart b/lib/src/dialog/src/src.exports.dart new file mode 100644 index 0000000..41a0c40 --- /dev/null +++ b/lib/src/dialog/src/src.exports.dart @@ -0,0 +1 @@ +export './models/models.exports.dart'; diff --git a/lib/src/snackbar/snackbar_helper.astromic.dart b/lib/src/snackbar/snackbar_helper.astromic.dart new file mode 100644 index 0000000..987d281 --- /dev/null +++ b/lib/src/snackbar/snackbar_helper.astromic.dart @@ -0,0 +1,41 @@ +import 'package:flutter_snackbar_plus/flutter_snackbar_plus.dart'; +import 'package:flutter/widgets.dart'; + +class AstromicSnackbarHelper { + static setDefault({ + // Style + FlutterSnackBarStyle? style, + // Configuration + FlutterSnackBarConfiguration? configuration, + }) => + FlutterSnackBar().initialize(configuration: configuration, style: style); + + static showTemplated( + BuildContext context, { + // Leading + Widget? leading, + // Main Content + required String title, + String? message, + Widget? content, + // Trailing + Widget? trailing, + // Style + FlutterSnackBarStyle? style, + // Configuration + FlutterSnackBarConfiguration? configuration, + }) => + WidgetsBinding.instance.addPostFrameCallback((_) { + FlutterSnackBar.showTemplated(context, title: title, leading: leading, message: message, content: content, trailing: trailing, style: style, configuration: configuration); + }); + + static showCustom( + BuildContext context, { + required Widget child, + // Style + FlutterSnackBarStyle? style = const FlutterSnackBarStyle(), + // Configuration + FlutterSnackBarConfiguration? configuration = const FlutterSnackBarConfiguration(), + }) => + FlutterSnackBar.showCustom(context, child: child, configuration: configuration, style: style); +} diff --git a/pubspec.lock b/pubspec.lock index 325fe9b..fde8f80 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -144,6 +144,15 @@ packages: url: "https://pub.dev" source: hosted version: "4.0.0" + flutter_snackbar_plus: + dependency: "direct main" + description: + path: "." + ref: master + resolved-ref: "74854b6bc8c0073641d3f2b5dae08c911902a6d7" + url: "https://git.micazi.dev/micazi/flutter_snackbar_plus.git" + source: git + version: "1.0.0" flutter_svg: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index 5020ba4..557658a 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -21,6 +21,11 @@ dependencies: ##S1 ~ 3rd-party ## Needed for the sheet helper. provider: ^6.1.2 + ## Needed for the snackbar helper. + flutter_snackbar_plus: + git: + url: https://git.micazi.dev/micazi/flutter_snackbar_plus.git + ref: master ## Needed for the form helper. form_controller: git: