diff --git a/packages/flutter_availability/lib/flutter_availability.dart b/packages/flutter_availability/lib/flutter_availability.dart index d5f40b4..93fa2cb 100644 --- a/packages/flutter_availability/lib/flutter_availability.dart +++ b/packages/flutter_availability/lib/flutter_availability.dart @@ -5,5 +5,6 @@ export "package:flutter_availability_data_interface/flutter_availability_data_in export "src/config/availability_options.dart"; export "src/config/availability_translations.dart"; +export "src/service/errors.dart"; export "src/ui/screens/availability_overview.dart"; export "src/userstories.dart"; diff --git a/packages/flutter_availability/lib/src/config/availability_options.dart b/packages/flutter_availability/lib/src/config/availability_options.dart index 12405b5..2d43d4b 100644 --- a/packages/flutter_availability/lib/src/config/availability_options.dart +++ b/packages/flutter_availability/lib/src/config/availability_options.dart @@ -2,10 +2,12 @@ import "dart:async"; import "package:flutter/material.dart"; import "package:flutter_availability/src/config/availability_translations.dart"; +import "package:flutter_availability/src/service/errors.dart"; import "package:flutter_availability/src/service/local_data_interface.dart"; import "package:flutter_availability/src/ui/widgets/default_base_screen.dart"; import "package:flutter_availability/src/ui/widgets/default_buttons.dart"; import "package:flutter_availability/src/ui/widgets/default_confirmation_dialog.dart"; +import "package:flutter_availability/src/ui/widgets/default_error_display.dart"; import "package:flutter_availability_data_interface/flutter_availability_data_interface.dart"; /// Class that holds all options for the availability userstory @@ -25,6 +27,7 @@ class AvailabilityOptions { this.confirmationDialogBuilder = DefaultConfirmationDialog.builder, this.timePickerBuilder, this.loadingIndicatorBuilder = DefaultLoader.builder, + this.errorDisplayBuilder = DefaultErrorDisplayDialog.defaultErrorDisplay, AvailabilityDataInterface? dataInterface, }) : dataInterface = dataInterface ?? LocalAvailabilityDataInterface(); @@ -82,6 +85,16 @@ class AvailabilityOptions { /// which shows a platform adaptive loading indicator final WidgetBuilder loadingIndicatorBuilder; + /// Builder for handling errors. + /// + /// The user should determine how to display the error, through a dialog, + /// popup or other method of user interaction. + /// + /// There is no guarantee that there is a scaffold in the tree for each of + /// the calls of the method. To ensure this, you can add a scaffold in the + /// base widget through [baseScreenBuilder]. + final ErrorDisplayBuilder errorDisplayBuilder; + final _borderRadius = BorderRadius.circular(5); /// The border radius used on the individual elements @@ -204,6 +217,13 @@ typedef ConfirmationDialogBuilder = Future Function( required String description, }); +/// Typedef for the handler of any errors that occur during the usage of this +/// userstory. +typedef ErrorDisplayBuilder = Future Function( + BuildContext context, + AvailabilityError error, +); + /// class DefaultLoader extends StatelessWidget { /// diff --git a/packages/flutter_availability/lib/src/service/errors.dart b/packages/flutter_availability/lib/src/service/errors.dart new file mode 100644 index 0000000..039f35c --- /dev/null +++ b/packages/flutter_availability/lib/src/service/errors.dart @@ -0,0 +1,12 @@ +/// A set of errors +enum AvailabilityError { + /// Error identifier when checking break mismatch + breakMismatchWithAvailability( + "The break needs to be within the timeframe of the availability", + ); + + const AvailabilityError(this.description); + + /// A more verbose description of the error. + final String description; +} diff --git a/packages/flutter_availability/lib/src/ui/widgets/default_error_display.dart b/packages/flutter_availability/lib/src/ui/widgets/default_error_display.dart new file mode 100644 index 0000000..0689244 --- /dev/null +++ b/packages/flutter_availability/lib/src/ui/widgets/default_error_display.dart @@ -0,0 +1,33 @@ +import "package:flutter/material.dart"; +import "package:flutter_availability/src/service/errors.dart"; + +/// +class DefaultErrorDisplayDialog extends StatelessWidget { + /// + const DefaultErrorDisplayDialog({ + required AvailabilityError error, + super.key, + }) : _error = error; + + final AvailabilityError _error; + + /// + static Future defaultErrorDisplay( + BuildContext context, + AvailabilityError error, + ) async { + await showAdaptiveDialog( + context: context, + builder: (context) => DefaultErrorDisplayDialog(error: error), + ); + } + + @override + Widget build(BuildContext context) => Column( + children: [ + Text(_error.name), + const SizedBox(height: 20), + Text(_error.description), + ], + ); +}