import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:hl_lieferservice/widget/operations/bloc/operation_bloc.dart'; import 'package:hl_lieferservice/widget/operations/presentation/message_container.dart'; import '../bloc/operation_state.dart'; /// OperationViewEnforcer /// /// A view that encapsulates the functionality to react to asynchronous operations. /// It is capable of showing a loading indicator while an operation is ongoing and it shows /// a error message if the operation failed. class OperationViewEnforcer extends StatefulWidget { final Widget child; const OperationViewEnforcer({super.key, required this.child}); @override State createState() => _OperationViewEnforcerState(); } class _OperationViewEnforcerState extends State { OverlayEntry? _overlayEntry; @override void dispose() { _overlayEntry?.remove(); super.dispose(); } @override Widget build(BuildContext context) { return BlocListener( listener: (context, state) { if (state is OperationLoading) { if (_overlayEntry == null) { _overlayEntry = _createOverlayEntry(context); Overlay.of(context).insert(_overlayEntry!); } } else { _overlayEntry?.remove(); _overlayEntry = null; } if (state is OperationFinished) { if (state.message != null) { ScaffoldMessenger.of(context).showSnackBar( SnackBar(content: Text(state.message!)), ); } } if (state is OperationFailed) { ScaffoldMessenger.of(context).showSnackBar( SnackBar(content: Text(state.message)), ); } }, child: widget.child, ); } OverlayEntry _createOverlayEntry(BuildContext context) { return OverlayEntry( builder: (context) => DecoratedBox( decoration: const BoxDecoration( color: Color.fromRGBO(128, 128, 128, 0.8), ), child: const Center( child: CircularProgressIndicator(color: Colors.white), ), ), ); } }